进程管理

什么是进程?

所谓进程就是将一个二进制文件加载到内存形成的一个个体,这就是一个进程。

在我们的linux系统中,系统只识别二进制文件,所以一个系统要想正常的运行时,必须启动一些二进制文件,从而形成进程,在以这些进程的方式去执行相应的任务。


我们常常听到所谓的程序,那么程序和进程是什么关系呢?

刚刚说过进程是由二进制文件加载到内存中形成的。而这些二进制文件就是程序。

可以这么来理解:

程序是实实在在地文件,是存放在磁盘上的。

进程是一个逻辑概念,进程是存在内存当中的,所以当机器重启,这些进程也随之销毁了。而程序不会,因为他们始终存在磁盘上的。



我们知道在我们的系统上,可以同时运行多个程序,进而会产生多个进程,而这些进程最终都会交给CPU处理,但是我们的CPU却只有一个,那么这些CPU是如何处理这些进程的呢?

刚刚说过进程是存在内存当中的。而内存是一块地址空间,所以我们的进程在内存中都占用了一段地址空间,用来存在进程数据。而这些将要被执行的进程放在CPU的可执行队列中,CPU逐个进行处理。并且内核为这些每一个进程分配一段时间,这样CPU可以有效的处理每一个进程,避免CPU长时间的消耗在处理某个进程上。

 

 

进程是有进程状态的,进程共有一下5种状态:

1、TASK_RUNNING:处于这种状态下的进程正在被CPU执行或者将要被CPU执行


2、TASK_INTERRUPTIBLE:叫做可中断的睡眠状态。这种状态下的进程处于睡眠状态直到其他条件或者事件完成时才会被CPU处理。或者当某个进程已经被CPU处理完了,而内核分配处理的这些进程时间过长,这些进程也会处于睡眠状态。而进程在睡眠状态下,CPU可以去处理其他进程。


3、TASK_UNITERRUPTIBLE:不可中断的睡眠状态。处于该状态下的进程是不可中断的,因此该进程一直等待接受其他信号,因此CPU一直处于等待状态。


4、TASK_STOPPED,TASK_TRACED:停止或者跟踪状态。

        当进程收到一个SIGSTOP信号时,该进程处于停止状态。

        当某个进程被其他进程所监控或者被跟踪的进程所操作时,该进程处于TASK_TRACED状态。


5、TASK_DEAD,TASK_ZOMBIE,僵尸状态:处于该状态下的进程执行完毕后,并不释放所占有的内存空间,因此会导致物理内存的容量变小。

 

那么如何观察进程的使用情况呢?

可以使用ps命令来查看

不过ps只可以静态的查看进程的使用情况,也就是说ps命令只能显示某一时刻的进程使用状况。不能够动态的显示进程的使用情况,要想动态的显示进程信息,可以使用top命令来查看。

语法格式:ps [option]

其中ps命令分为BSD风格的和SysV风格的

BSD风格的选项有:

a:显示所以与终端有关的进程

u:显示这个进程的属主

x:显示与终端无关的进程

l:长格式来显示

通常ps aux一起使用

例如:

wKiom1PKb9ygPmx_AAC8mtc3-p4396.jpg

其中每一列表示的字段意思如下:

USER:表示该进程被哪个用户运行

PID:该进程的ID号,用来标识该进程的

%CPU:该进程使用掉的CPU资源的百分比

%MEM:该进程使用掉的物理内存的百分比

VSZ:表示 该进程使用掉的虚拟内存空间大小

RSS:表示常驻内存空间大小,就是该进程占有的固定内存大小,该空间是不能交换出去的

TTY:表示该进程是在哪个终端下运行的

STAT:表示该进程的所处状态。其中这些状态有:

       <    high-priority (not nice to other users)
       N    low-priority (nice to other users)
       L    has pages locked into memory (for real-time and custom IO)
       s    is a session leader
       l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
       +    is in the foreground process group

START:表示该进程启动到现在为止所经过的时间

TIME:表示该进程实际使用CPU运作的时间

COMMAND:表示执行该进程的实际指令是什么

 

SysV风格的选项有:

-e:与-A一样,显示所有的进程

-l:以长格式的形式显示,可以显示自己的bash相关进程

-F:额外的全部格式,就是显示的列多一些

-f:与-F类似,显示的列少一些

wKiom1PKdVPCbjxyAAFd-YGL8xo180.jpg

其中这些字段的意思为:

F:表示这个进程的旗标,说明这个进程的总结权限,常见的号码有:

    4:表示该进程的权限为root

    1:表示该子进程只进行复制(fork)而没有实际执行(exec)

S:表示进程的状态,其中:

    R:表示该进程处于运行状态

    S:表示可中断的睡眠状态

    D:表示处于不可中断的睡眠状态

    T:表示该进程处于停止状态

    Z:表示该进程处于僵尸状态,该进程所占有的内容空间不能移除掉

PID:该进程的ID号

PPID:该进程的父ID号

C:表示CPU的使用率,单位为百分比

PRI:表示进程的优先级,值越小越优先被CPU处理

NI:nice值,nice值是可以用来调整进程的优先级的

ADDR:表示该进程在内存中的地址范围,当进程处于RUNNING状态时该处显示'-'

SZ:表示该进程使用掉的内存大小

WCHAN:在进程处于睡眠状态下,内核函数的名称。'-'表示该进程正在运行。

RSS:常驻内存空间大小,该大小不能被交换出去

STIME :该进程启动到现在所经过的时间。

TTY:表示该进程是在哪个终端下运行的

TIME:表示实际该进程使用CPU的时间

CMD:表示执行该进程使用的指令是什么

 

ps   -o 属性1,属性2...

用来显示进程指定的属性信息,默认ps只显示前台的进程,因此显示的进程比较少。

通常可以和ax选项结合使用,显示所有的进程的指定属性信息

例如:显示所有的进程的pid,comm,ni属性信息,且只显示5行。

 wKiom1PKgRDgxzmWAACWUYQw3as384.jpg   

 

查看某个进程绑定在哪个cpu上

# ps -o pid,psr,comm

 

刚刚说过ps命令只能查看某一时刻进程的使用信息,不能动态的显示进程的使用信息,要想动态的显示进程的使用信息则使用top命令来查看

top:动态的观察进程的变化

语法格式:top [option]

-d #: 指定延时时长,单位为秒,指的是每个多少秒显示一次,默认是5秒

-b:以批模式的形式显示,就是一页接着一页显示

-n #:在批模式下,共显示多少批

在top命令下,还可以使用很多的子命令

    M: 根据驻留内存大小进行排序

    P:根据CPU使用百分比进行排序

    T: 根据累计时间进行排序

    l: 是否显示平均负载和启动时间

    t: 是否显示进程和CPU状态相关信息

    m: 是否显示内存相关信息

    c: 是否显示完整的命令行信息

    r:修改进程的优先级

    q: 退出top

    k: 终止某个进程

wKiom1PKhX7QdMiQAAHzxVMTe2E266.jpg

第一行显示的信息有:

        当前的系统时间

        开机启动到现在所经过的时间

        有多少个用户登入到系统上了

        该进程在1,5,15分钟内的平均工作负载值,该值越小,表示系统越空闲

第二行显示的信息有:

        目前系统上有多少个进程

        这些进程所处的进程状态是什么

第三行显示的信息有:

        CPU的整体负载情况

第四行显示的是物理内存使用的情况

第五行显示交换分区使用情况

在top下部分的画面中只介绍一个字段的意思,其他字段跟上面字段的意思大致相同

TIME+:表示进程实际使用CPU的时间累加和。 (说明该进程可能被重复使用)

 

在上面我们提到了priority和nice的概念,这个属性都与进程的优先级有关系的。

我们知道进程是在内存中形成的,而进程要被CPU处理,必须要先进入CPU的可执行队列中,然后CPU在逐个处理可执行队列中的进程。也就是说那些要被处理的进程全部都会进入到CPU的可执行队列中,而默认情况下,CPU根据进程在队列中的顺序来处理这些进程。所以,在某些情况下,一些比较重要的进程可能会比较晚处理,而那些不重要的进程会优先处理。这显然不符合用户的心意。因此为了让CPU能够优先处理某些进程,于是就给每一个进程优先级,优先级值越小,该进程越先被CPU处理。

在Linux系中,进程的优先级的范围为0-139.其中100-139由用户来控制的,0-99则是由内核来控制的

而一个进程的新优先级是有原来的优先级和nice值组成的。

(new)priority=(old)priority+nice

在这里nice值的范围为-20--19

其中root用户的可调整的nice值为-20--19

普通用户可调整的nice值为0-19,且普通用户只能将nice越调越高,不能调低

因此改变某个进程的优先级,只需要改变nice值即可。

改变nice值有2种方式

1、在启动进程的时候指定nice值

语法格式:nice [-n #]  COMMAND

 

2、调整已经启动的进程的nice值

语法格式:renice   NI  PID

例如修改top这个进程的nice为5

wKioL1PKlJaynWlAAAHljP1ytbo360.jpg

 

进程的管理

其实进程之间是可以相互控制的,进程间的相关管理是通过发送一个讯号(Signal)来实现的,不同的Signal表示的意思不一样。主要常见的讯号Signal代号和名称有:

    1:SIGHUP:让一个进程不用重启,就可以重读其配置文件,并让新的配置信息生效

    2:SIGHINT:类似与命令行中使用ctrl+c来中断一个进程

    9:SIGKILL:强制杀死一个进程

    15:SIGTERM:终止一个进程(该进程正常退出来完成终止),该讯号为默认讯号。


使用kill命令就可以用来传送信号来控制其他进程

语法格式:kill [option] [PID]

-l:列出目前kill能够使用的信号,不过最重要的信号还是1,2,9,15

-#:指定要传送的信号,#表示的是SIGNAL的代号,例如,1,2,9,15等等

-SIGNAL:指定要传送的信号,这里的SIGNAL指的是信号名称。例如kill -SIGKILL  [PID]

-信号名称简写:信号可以写代号,也可以写名称,也可以只写信号名称的后部分。例如正常终止top

                进程,可以这么写kill -TERM [PID]

 

除了使用kill命令管理进程外,还可以使用killall命令来管理进程

语法格式:killall [信号]  COMMAND

这里的信号可以使用killall -l来查看,如果没有指定,默认是信号TERM

COMMAND:指的是进程的名称

例如:杀掉vim这个进程

killall -TERM vim


使用kill命令还可以杀掉作业

语法格式:kill [信号]  %[作业号]

此处%不可以省略,如果省略将会杀掉进程


作业管理

作业管理分为前台作业管理和后台作业管理

那什么是前台作业和后台作业呢?

前台作业:就是该进程占据了命令提示符

后台作业:就是当进程启动后,释放命令提示符,并且后续的操作将在后台完成

将前台作业送往后台执行,有2种方式:

1、使用ctrl+z可以将前台作业送往后台执行,不过使用该方式操作,该进程在后台处于暂停状态。

2、使用COMMAND &的形式,将前台作业送往后台执行

例如:将vim ht.sh这个作业送往后台执行

wKiom1PLh56hqoDXAABnaVOAxSY538.jpg

使用jobs可以查看后台作业

语法格式:jobs [[%]作业号],此处%可以省略

其中[]内的为作业号,+表示命令将默认操作的作业,-表示命令默认将第二次操作的作业,也就是说等到带有+号的作业执行完毕后,就执行-号的作业了。然后没有符号的按顺序执行。


使用bg命令可以将后台的作业继续运行

语法格式:bg [[%]作业号],此处%号可以省略

如果不接作业号,默认是将执行带有+号的作业


使用fg命令可以将后台作业调到前台来执行

语法格式:fg [[%]作业号] ,此处%可以省略

默认是不接作业号,默认是将执行带有+号的作业




pstree:可以来显示当前系统上的进程树

-p:同时显示出每一个进程的PID



pgrep:根据进程名来查找该进程是否在系统上运行。如果在,则显示进程的pid。

语法格式:pgrep [-l]  进程名

-l:列出该进程的PID和进程名称,默认只显示PID。



pidof:根据进程名来查找进程ID

语法格式:pidof 进程名

例如:

wKiom1PLgfGzUbYYAAD4Qs0f5gI048.jpg


使用vmstat来观察系统资源变化

语法格式:vmstat [option] [延迟秒数 [侦测次数]]

-S:让后面的数据以K/M形式显示,默认是以Bytes形式显示

-d:显示磁盘的读写总量统计表

-p:后面接分割槽,显示分割槽的读写总量统计表

wKioL1PLkufS7boBAACjbeCCSCM756.jpg

其中的字段表示的意思为:

r:表示正在等待的进程数量

b:表示不可中断的进程数量

swpd:使用虚拟内存的数量

free:空闲的物理内存大小

buff:用作缓冲区空间的大小

cache:用作缓存区空间的大小,用于缓存打开的文件等信息

si:每秒从磁盘交换出的虚拟内存大小,如果该值大于0,表示物理内存不够用

so:每秒从物理内存写入到磁盘中的虚拟内存大小。由于内存不足,将一些不常用的内存写入到磁盘中。

bi:阻止每秒接受的块数量

bo:阻止每秒发出的块数量

in:每秒中断的进程数量,包括时钟中断。

cs:每秒上下文切换次数

us:用户空间使用CPU的时间百分比

sy:内核空间所花费CPU的时间百分比

id:cpu空闲时间所占用的百分比

wa:cpu等待I/O所消耗的时间百分比

st:CPU花费在虚拟机上的时间百分比



netstat:显示网络的相关信息

语法格式:netstat [-atunlp]

-a:显示目前系统上所有的联机,监听、socket的数据

-t:显示与tcp有关的连接

-u:显示与udp有关的连接

-n:以数字的方式显示端口和地址。

-l:显示目前正在监听的服务。默认显示的是ESTABLISHED状态的连接。

-p:显示该进程的PID

-r:显示路由条目

一般情况下,-tunlp一起使用

wKiom1PLmMbz5V4lAAEl7XtCZ3Q180.jpg