首页 > 代码库 > 进程管理详解
进程管理详解
一、进程概述
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
进程管理详解