Linux学习48 Linux进程管理命令top、ps、pgrep实战

一、概述

  1、在当代的X86结构的CPU中,我们将指令分为了两类,普通指令和特权指令。或者说CPU运行指令分为四个不同的级别,分别在环0,环1,环2,环3上,环0上存放的为root指令,也叫特权指令。普通用户的运行程序是不能运行环0指令的。必须是运行在内核级代码的程序才能去运行环0指令,而我们要运行的其它普通程序只能运行环3上的指令,环1和环2由于历史原因没有使用。无论是我们写的任何程序要想运行在计算机上必须编译成二进制,这就是我们之前说过的我们任何的程序包都由二进制程序和相应的库文件等结合起来组成。但是现在应用程序如果本来开发时就没有直接面向过程开发而是面向操作系统的系统调用或库调用所研发的话,这些程序在真正所运行时,尤其我们所研发的应用程序在运行时他们必须要通过发起系统调用才能完成特权级操作因为一个应用程序运行中,比如我们的echo 一个字符串给grep让其把某个字符串找出来这个基本不会涉及到特权操作的,但是如果我们打算在某个文件系统的某个目录下创建一个文件或目录的话这就涉及到硬件操作了。因为我们要把创建的文件保存在磁盘上。这就意味着是特权级别的操作。所以任何想创建文件等功能都必须由内核来完成,由内核来负责通过硬件完成操作。

    

二、Linux系统上的进程查看及管理工具

  pstree,ps,pldof,pgrep,top,htop,glances,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup,nice,renice,killall,...

  1、pstree

    a、任何进程要创建子进程时都会将请求交给init进程。init程序对CentOS5 6 7都是不一样的

      CentOS5叫做传统的SysV init程序,非常经典,但是这个init有一个缺陷,在系统启动和引导时,他创建各子进程我们是通过写脚本的方式借助于shell来完成的,因此执行速度非常之慢。大家知道我们shell写的脚本里面是通过堆积大量的命令来完成的。每一个命令的启动和运行其实都是创建了一个进程,也就意味着你的系统要启动完成可能要创建上千个进程才能把系统启动起来。因此启动速度会很慢

      CentOS6时就叫做upstart(ubuntu系统首先使用的),他也一样是通过启动很多命令来创建进程。而后通过进程来完成系统启动的。但是upstart能够做到的是他比init优于在init所有的命令启动和运行仅能够串行方式实现,但是upstart能够做到并行启动相应的有关联性的服务。所以使得整个系统启动速度更快了一点。所以我们创建进程时我们可以多线创建进程。如果你有多颗CPU或多个核心的话启动速度会快很多。内部基于dbus的方式进行通信。其实在CentOS6上启动服务应该使用upstart的,但是为了兼容CentOS5,CentOS6上他们较好的把upstart封装了起来依然保留使用service来启动,事实上在CentOS6上对upstart作用发挥的并不是特别大

      CentOS7叫做systemd:据说在upstart出现后不久红帽的另外一个程序员发明了参考MACOS的启动逻辑又重新研发了一个新版的init程序,这个init是能够一个人独立以一个程序完成整个系统启动过程,也就意味着说他只需要在开机过程中启动这一个init进程就能够负责完成把其它各服务都启动起来。把整个系统引导起来,而这背后他所需要启动的进程通过也不过数十个而已。因此CentOS7的启动速度会非常快,这个init程序就叫systemd,这就是为什么在CentOS7上我们要启动或关闭服务时我们要使用systemctl这个命令。因为他们统一接受systemd的控制。事实上在CentOS6上对upstart作用发挥的并不是特别大,但是在CentOS7上systemd基本上已经全面介入了,他们在系统上统一的称为 /sbin/init,有可能有些系统上称之为systemd

    b、不同的是我们在不同的发行版上通过pstree命令查看所看到的进程树的顶级进程对不同的系统版本来讲有可能是不一样的。CentOS5和6上看到的有可能是init,CentOS7上看到的有可能是systemd。

    c、pstree命令

      display a tree of processes

[root@node1 ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─abrt-watch-log
        ├─abrtd
        ├─agetty
        ├─atd
        ├─auditd───{auditd}
        ├─crond
        ├─dbus-daemon
        ├─irqbalance
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rngd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─smartd
        ├─sshd─┬─sshd───bash
        │      └─sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───{vmtoolsd}

  2、ps命令:report a snapshot of the current processes.(取出并显示当前系统上所运行的这一刻所有进程状态)

    a、ps命令是怎么能够查看进程状态的呢?我们说过所有进程的管理都是由内核进行的,内核为了能够让用户空间可以查看他所管理到的进程的相关功能,其实内核是通过一个接口/proc/将其内部的很多状态信息输出给用户

猜你喜欢

转载自www.cnblogs.com/Presley-lpc/p/12456569.html