首页 > 代码库 > 进程管理详解

进程管理详解

一、进程概述

1、进程的概念

       用户通过执行命令,将程序提起到内存中运行,运行中的程序即称为进程。内核为了方便管理,根据内核发起者的权限、属性等参数,为每个进程设置一个独立的PID号,通过PID号来判断进程的权限。

2、进程的分类:

       2.1根据进程与终端的关系划分:

              守护进程:在系统引导过程中启动的进程,与终端无关的进程

              交互式进程(用户进程):用户通过终端启动的进程

              在终端上运行的进程,可以被送往后台,以守护进程的模式运行。

       2.2根据系统资源的占用比划分:

              CPU密集型:CPU-Bound,在分配优先级时,因其会占用较多的CPU资源,应给其分配较低的优先级

              IO密集型:IO-Bound,在分配优先级时,应给其分配较高的优先级

3、进程的属性:

       进程的ID(PID):进程的唯一标识

       启动进程的用户ID和属组ID:进程在运行时,为了完成任务需要访问到某些文件。内核如何判断进程是否具有访问权限呢?有两种情况:一、被发起为进程的程序不具有SGID权限,在此情况下,内核根据进程发起者的属主和属组对该文件是权限来判断;二、程序具有SGID权限,内核根据程序文件的属主和属组对该文件的权限来判断。

       父进程及父进程的ID(PPID):

       进程状态

       进程执行优先级

       进程所连接的终端名

       进程资源占用比:如CPU占用百分比、内存占用百分比

       2.1)进程的父子关系

              进程由其父进程创建。父进程出于完成复杂任务的需要,创建子进程。子进程也可以创建自己的子进程。

              在CentOS6系列中,系统在启动之后,会加载运行内核代码,在内核控制系统之后,由内核创建进程,内核创建的第一个进程为init进程,init进程创建完成,意味着内核空间创建完成,用户空间也创建完成,之后由init进程接管系统,init进程为系统上所有进程的父进程。内核则退居幕后,只负责特权级操作。

技术分享         父进程如何创建子进程:父进程通过fork-and-exec流程来创建子进程。首先以fork的方式复制一个与父进程相同的暂存进程,之后暂存进程以exec的方式加载实际要执行的进程。

              例:创建一个ping.sh脚本,其功能为通过ping命令判断192.168.1.200主机是否可达。脚本创建完成之后,运行脚本,之后脚本以子进程的形式运行ping命令。

 技术分享

                   写时复制机制(COW):子进程指向的内存空间同父进程,一旦子进程需要修改父进程的数据,这时父进程会将数据复制到空闲的内存空间中,同时告知子进程在新内存空间中进程操作,这样的机制就称为写时复制。

       2.2)进程的状态

              运行态:正在运行的进程,running

              就绪态:可以被允许但没被允许,用ready标识

              睡眠态:

                     可中断睡眠:interruptable

                     不可中断睡眠:进程发起I/O请求,内核在接到请求到完成请求响应之间,会将进程的状态调整为不可中断睡眠态,用uninterruptable标识

                            在什么情况下进程会被中断:进程为了完成任务,发起I/O请求,但进程请求的数据在内存中没有,此时进程会像内核提起请求,内核从磁盘中将该数据加载至内核的内存空间中,再将数据从内核内存空间复制至进程的内存空间。在这一过程中,进程处于中断状态。

              停止态:暂停于内存中,单不会被调度,除非手动启动,用stopped标识

              僵死态:一般情况下,子进程生命周期结束后都由父进程进行销毁。但当子进程的父进程被杀死之后,父进程未指定如何处理子进程,该子进程会进入僵死态,直至被init进程处理。用Zombie标识

              处于僵死态的进程会占用内存空间,若此类进程出现多个,则有可能造成内存空间不足。

       2.3)进程优先级

              进程优先级用于标识进程的运行次序。由内核负责调度

              进程优先级分类:

                     系统优先级:0-139

                            实时优先级:1-99。数值越大,优先级越高

                            静态优先级:100-139。用户可以调度,数值越小,越优级越高

                     优先级的Nice值:-20-19,与静态优先级一一对应,数值越小,越优级越高

              可通过调整Nice值来改变进程的优先级。但普通用户只能调低优先级,root则不受限。

技术分享

4、进程队列

       CPU时间片:将CPU时间分割成片,每个进程占用一个时间片,时间片耗完之后,切换至下一个进程。

       运行在CPU的进程根据运行状态被分别保存至CPU中的运行队列和过期队列中。

       运行队列有等待被运行的进程组成。

       进程运行之后,被划分到过期队列中。

       当运行队列中的所有进程都被允许之后,运行队列被清空,此时,运行队列会被转换为过期队列,过期队列则相应地转换为运行队列。

5、进程间通信: Inter Process Communication(IPC)

       5.1 linux进程间通信方式:

       1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

       2)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction。

       3)报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

       4)共享内存(ShareMemory):使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

       5)信号量(Semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

       6)套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。Linux和System V的变种都支持套接字。

             socket由ip:port构成,端口用于标识主机上的进程。

             已建立连接的套接字由client ip:sort<--->server ip:port

             监听模式:无论是否有访问请求,都开启进程,并监听在某ip:port上,着被称为LISTEN机制。

       5.2不同主机进程间通信:

              基于Socket实现不同主机间进程通信。

技术分享

Socket文件存source_ip,source_port,des_ip,des_port。进程P1通过open socket文件,请求发起同PC2的P2进程间通信,通信结束之后,close socket文件。

二、进程查找

1、ps [options] | Pattern:灵活的查找方式

例:查找root用户发起的进程

技术分享

例:查找http服务相关的进程

技术分享

2、pgrep:按预定义的模式搜索进程

              pgrep [options] pattern

                     -u uid :effective user

                     -U user:realuser

                     -t Terminal:与指定的终端相关的进程

                     -l :显示进程名

                     -a :显示完整格式的进程名

                     -P pid:显示此进程的子进程

技术分享

例:查找root用户的进程并显示进程名

技术分享

3、pidof:查找正在运行的进程的id

技术分享

三、进程观察

1、pstree:以树型图查看当前系统进程

技术分享

       pstree -p:显示进程树,同时显示进程id号

技术分享

2、ps命令:以快照的方式报告当前进程的状态信息

              内核的状态信息保存在/proc/目录中,进程的信息也保存在/proc目录下,并以pid号的方式保存为目录

技术分享

       2.1)ps命令的选项有三种风格:

              UNIX风格:-a,短选项

              BSD风格:a,不加-

              GNU风格:--all,长选项

       2.2)启动进程的方式:

              系统启动过程中自动启动:与终端无关的进程

              用户通过终端启动:与终端相关的进程

       2.3)ps选项

              a:所有与终端相关的进程

              x:所有与终端无关的进程

              u:以用户为中心组织进行状态信息显示

              2.3.1)常用组合之一:aux

例:

技术分享

依次可以查看到

         进程的发起者(USER),进程id(PID),CPU占有率(%CPU),内存占用率(%MEM),虚拟内存集(VSZ),常驻内存集(RSS),在哪个终端启动(TTY),进程状态(STAT),进程开始时间(START),进程CPU占用时间(TIME),发起进程的命令(COMMAND)

              STAT:进程的状态。进程状态分类如下:

                                   R:running                             

                                   S:interruptable sleeping            

                                   D:uninterruptable sleeping       

                                   T:stopped                                    

                                   Z:Zombie                                    

                                   +:前台进程

                                   l:多线程进程

                                   N:低优先级进程

                                   <:高优先级进程

                                   s:session leader

 

              2.3.2)常用组合之二:-ef

                     -e:显示所有进程

                     -f:显示完整格式的进程信息

技术分享

依次可以看到进程发起者、进程id、进程的父进程id、CPU占用百分比、进程发起时间、进程发起终端、CPU占用时长、发起进程命令

              2.3.3)常用组合之三:-eFH

                     -F:显示完整格式的进程信息

                                   C:(cpu utilization) cpu占用百分比

                                   PSR:运行于哪颗CPU之上

                     -H:以层级结构显示进程的相关信息

技术分享

              2.3.4)常用组合之四:

                            o field1,field2....:自定义要显示的字段列表,以逗号分隔

                            常用的field:pid、ni、pri,psr、pcpu、stat、comm、tty、ppid、rtprio

                                          ni:nice至-20---19

                                                   对应优先级的100-139

                                                   越小越优先

                                          pri:priority 优先级

                                          rtprio:real time priority实时优先级

                            -eo

                            -axo

例:自定义显示进程的ID,进程的父进程ID,命令,Nice值,进程优先级,实时优先级,cpu占用率,进程状态信息

技术分享

3、uptime命令:

              显示系统时间、允许时长、平均负载

              平均负载:过去1分钟、过去5分钟、过去15分钟CPU等待运行的进程队列的长度。

技术分享

4、top命令:实时查看进程信息的变化

技术分享

首部信息:

       第一行显示的信息:依次

              *当前系统时间

              *开机到当前所经过的时间

              *已登陆系统的使用者人数

              *uptime命令的结果显示,表示系统在1,5,15分钟的平均工资负载,即CPU运行队列里的进程个数

              通过l命令显示或关闭

       第二行显示的信息:显示当前系统上运行的进程总数,以及每个状态的进程个数。如果zombie数目不为0,则应当检查下是哪个进程变成僵尸,及时进行清理,避免占用内存。

       第三行显示的信息:显示CPU的整体负载情况。依次分别显示用户空间进程占用的CPU百分比(%us)、系统空间进程占用的CPU空间百分比(%sy)、调整进程Nice值所耗的CPU时间(%ni)、空闲的CPU百分比(%id)、等待I/O的CPU百分比(%wa)、硬中断所耗CPU(%hi)、软中断所耗CPU(%si)、被虚拟机偷走的时间(5ST)

              tasks及cpu信息:可以使用t命令显示或关闭

       最后两行显示内存信息:

              m命令显示或关闭

技术分享

top下半部分,显示每个进程占用的系统资源情况。依次为

       PID进程id

       USER进程发起者

       PR进程优先级

       NI进程Nice值

       VIRT进程占用的RSS和SWAP空间总和

       RES进程使用的非交换分区的物理内存

       SHR进程占用的共享内存空间大小

       S:Stat,即进程的状态

       %CPU进程CPU占用百分比

       %MEM进程内存占用百分比

       TIME+进程占用的CPU时间总和

       COMMAN进程的命令

 

对显示的信息进行排序:

       P:以占据的CPU百分比排序(默认)

       M:以占据的内存百分比排序

       T:以累计占用的cpu时间排序

退出命令:q

改变刷新时间间隔:s,默认为3秒

终止指定的进程:k

 

选项:

       d #:指定刷新时间间隔、运行时长及平均负载

       -b:以批次方式显示

       -n #:显示多少批次

如何将top的信息保存至文本中

例:将top的信息显示2次,保存至文本中

       top -b -n 2 > /tmp/top`date +%F-%T`.txt

技术分享 

5、htop命令:类似于top命令

       选项:

              -d #:指定延迟时间间隔

              -u UserName:仅显示指定用户的进程

              -s colume:以指定字段进行排序

       子命令:

              l:显示选定的进程打开的文件列表

              s:跟踪选定的进程的系统调用

              t:以层级关系显示各进程状态

              a:将选定的进程绑定至某指定的cpu核心

             

       F1:查看帮助

       F2:设置htop

6、vmstat:

技术分享

       vmstat [options] [delay] [count]

              procs:

                     r:等待运行的进程的个数;cpu上等待运行的任务的队列长度

                     b:处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度

              memory

                     swpd:交换内存使用总量

                     free:空闲的物理内存总量

                     buffer:用于buffer(缓冲)的内存总量

                     cache:用于cache(缓存)的内存总量

              swap

                     si:数据进入swap中的数据速率(kb/s)

                     so:数据离开swap的速率(kb/s)

              io

                     bi:从块设备读入数据到系统的速度(kb/s)

                     bo:保存数据至块设备的速率(kb/s)

              system

                     in:interrupt,中断速率

                     cs:context switch,上下文切换的速率

              cpu

                     us:user space

                     sy:system space

                     id:idle space

                     wa:wait time

                     st:stolen time

              选项:

                     -s  显示内存统计数据

7、pmap命令:

       报告进程的内存映射表

       pmap [options] PID

              -x|--extended:显示详细信息

       另一种查看方式进程的内存映射表:cat /proc/PID/maps

8、glances命令:

需要通过epel源进行安装,支持c/s模式进行远程查看(可被监控系统代替)

技术分享

       常用选项:

              -b:以Byte为单位显示网上数据速率

              -d:关闭磁盘I/O模块

              -m:关闭mount模块

              -n:关闭network模块

              -t #:指定刷新时间间隔

              -1:每个cpu的相关数据单独显示

              -o {HTML|CSV}:指定输出格式

              -f /Path/to/someDIR:设定输出文件的目录(注意,不要指定文件名)

       C/S模式下运行glances命令:

              服务模式:

                     glances -s -B IPADDR(本机的某个IP地址,用于监听服务)

              客户端模式:

                     glances -c IPADDR(指定远程服务器的地址)

9、dstat:使用前需要安装,在base源中

       dstat是一个可以取代vmstat、iostat、netstat、ifstat的多功能程序,克服了这些命令的局限性,增加了监控项。可以灵活地监控系统运行状态并依此进程故障排除。

       dstat能实时地查看所有系统资源,例如通过统计IDE控制器当前状态来比较磁盘利用率,或者直接通过网络带宽数值来比较磁盘的吞吐率。

9.1 dstat的默认输出:

技术分享

默认输出显示的信息:

CPU状态:CPU的使用率。这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况。如果你看到"wait"一栏中,CPU的状态是一个高使用率值,那说明系统存在一些其它问题。当CPU的状态处在"waits"时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。

磁盘统计:磁盘的读写操作,这一栏显示磁盘的读、写总数。

网络统计:网络设备发送和接受的数据,这一栏显示的网络收、发数据总数。

分页统计:系统的分页活动。分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值是0 0。

系统统计:这一项显示的是中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。

9.2指定监控时长和监控次数:

例:指定监控时长为2秒,共监控5次

技术分享

 

dstat [-afv] [options] [delay] [count]

       常用选项:

       -c|--cpu:显示cpu相关信息

              -C #,#,#...,total:显示指定的哪颗cpu信息,或总的cpu信息

       -d|--disk:显示磁盘的相关信息

              -D sda,sdb...,total:显示指定的磁盘的相关信息,或总的磁盘信息

       -g:显示page in/out速率数据

       -m:Memory相关的统计数据

       -n:Interface相关的统计数据

例:每隔2秒统计网络信息,个统计5次

技术分享

       -p:显示process的相关统计数据

       -r:显示io请求的相关的统计数据

       -s:显示swapped的相关统计数据

       --tcp:显示常用的tcp统计数据

       --udp:显示监听的udp统计数据

       --raw

       --socket:显示网络统计数据

例:

技术分享

       --ipc:message queue, semaphores, shared memory;查看报文队列,信号量,关系内存信息。

技术分享

                    

 

根据资源占用比显示进程

       --top-cpu:指出CPU占用最大的进程

       --top-io:指出正常I/O最大的进程

       --top-mem  :显示占用最多内存的进程

       --disk-util:显示某一时间磁盘的忙碌状况

       --freespace:显示当前磁盘空间使用率

       --proc-count:显示正在运行的进程数量

       --top-bio:指出块I/O最大的进程

例:

技术分享

例:查看全部内存都有谁在占用

技术分享

例:查看CPU资源损耗的数据

注:单独显示进程数时是以白色显示,若背景为白色则无法看清,调整背景即可

技术分享

例:每隔2秒获取磁盘IO情况,共获取5次,并保存至文本中

技术分享

四、进程管理

1、kill命令:用于向进程发送信号,以实现对进程的管理

kill -l [signal]:查看信号类别

技术分享

常用信号:

       1)SIGUP:无需关闭进程而让其重读配置文件。在生产环境中,重启服务的操作会终止业务,应被谨慎对待。

       2)SIGINT:终止正在运行的进程,相当于ctrl + c

       9)SIGKILL:杀死正在运行中的进程

       15)SIGTERM:终止运行中的后台进程

       18)SIGCONT:让在后台中处于停止状态的进程在后台中继续进程,比如cp 大文件时。注:需要占用前台的进程无法通过此命令恢复运行,可使用fg命令

       19)SIGSTOP:类似于对进程发送ctrl + z信号

 

每个信号的标识方法有三种:

       1)、信号的数字表示

       2)、信号的完整名称

       3)、信号的简写名称

             

如何向进程发信号

       kill [-s signal|-SIGNAL]  pid

例: kill掉ping 10.1.0.1这个进程

       技术分享

       技术分享

2、killall命令:根据进程名来杀死进程

       killall [-SIGNAL] program

       例:killall httpd

技术分享

注意:会杀死所有httpd进程,若不期望kill所有,应使用kill


进程管理详解