一:进程的概念
1)进程:process,运行中的程序的一个副本的某部分,之所以说是副本的一部分是因为一个程序可以多个用户同时以不同格式运行,如两个用户都在运行ls,一个运行的是ls -h ,另一个运行的是ls -l,那么这两个用户运行的程序代码肯定是不一样的而且不是程序的所有代码;进程有生命周期;
2)进程管理:主要为进程调度;内核为了管理进程需要存储正在运行中的进程的元数据,存储在内核的链表中,
其固定格式 为tast struct;多个进程的stask struct组成链表,task list
3)进程的创建:进程创建:内核初始化完成后创建第一个进程init(也叫初始化进程),init进程创建完成意味着用户空间和内核空间也就创建好了,后续用户空间进程的所有管理工作就都由init来完成,但是init不能代替内核执行特权指令;当需要创建一个进程时它就照着自己的样子创建一个子进程或者它的子进程照着子进程自己的样子创建一个子进程,这样“子又生孙,孙又生子”创建进程;进程有父子关系,进程都由其父进程fork()并clone()自身而来,当父进程要创建子进程时就向核发起fork()系统调用,并把自身的数据clone()给子进程;
4)进程销毁:父进程创建子进程只是为了让子进程在某一时刻帮助它完成某些任务,当子进程执行完任务并把执行结果返回给父进程后,子进程的使命就结束了,此时父进程还要负责销毁子进程;
5)进程优先级:由于事件的紧急程度不同,进程是有优先级的;优先级有nice值;内核将待运行的
的进程根据优先级分为140个队列,然后每次挑选优先级最高的队列的首个进程运行;
优先级从0-139,
0一般很少用,在内核启动init之前会启动0号进程,一旦init启动起来后0号进程就被终止了;
1-99:实时优先级;数字越大优先级越高,很少需要手动调整;
100-139:静态优先级;数字越小优先级越高,用户可调度的优先级;
nice值:nice值从-20到19对应静态优先级100到139;用户可以通过调整nice值来调整静态优先级;普通用户只能调高nice值来调低优先级,但是管理员通过调整nice既可以调低优先级也可以调高优先级;
6)进程的内存:为了完成现代操作系统多任务的管理内核把除了自身占用的内存外的剩余内存分为多个片段,一个片段大概4K大小,然后把这些片段分配给多个进程使用;每个进程分配到的片段实际上不一定都是连续的内存,但是内核通过一个中间层把这些不连续的片段虚拟成连续的内存再分配给进程,让每个进程以为自己都是在一段连续的内存上运行的;而且内核会让每个进程以为在内存上运行的只有内核和它自己以及它可以用的内存为除了内核自身占用的内存外的剩余内存,这就叫线性管理机制,进程以为可以用的内存即为进程的线性地址空间,进程实际使用的内存即为进程的物理地址空间,线性地址空间和物理地址空间有可能是离散对应的;每个进程把线性地址空间的低地址空间用于存放程序代码,再向上是初始化的变量和未被初始化的变量(在C语言中这些变量被自动赋值为0),再向上的一段离散空间是堆内存(用于存放数据),另一头高地址空间是栈内存(用于存放数据),随着进程的运行堆内存和栈内存是会不断朝着彼此的方向变大的直到两者碰头占满内存,此时内存空间就会出现不够用的情况;当内存不够用时内核就会根据LRU(最近最少使用算法)把某个时间段不运行部分进程的数据而非代码调到交换分区,当这些进程又需要运行时再把它们调回去;
Page Frame: 一个页框,也即一个片段,用于存储页面数据;
MMU:memory management unit,内存管理单元
7)进程间通信机制:IPC,Inter Process Communication,
同一主机上进程间通信机制:
signal:常见的
shm: shared memory
semerphor
不同主机上进程间通信机制:
rpc: remote procecure call,远程过程调用,基于socket的更高级机制;
socket:任何两个进程间通信前都要各自打开一个socket的文件,一方不断的往文件中写数据,然后通过TCP连接传输到另一方的socket文件中,另一方不断的从文件中读数据,从而实现通信;通信结束后双方都要关闭socket文件;
8)抢占式多任务:Linux内核的多任务工作模式,任何一个进程当它要启动时发现别的进程在运行而自己的优先级更高,该进程不是上来直接抢占当前进程的运行时间而是内核会指定可抢占的时间点,到达抢占时间点时高优先级进程才可以抢占优先级的运行时间;
9)进程的类型:
守护进程: 在系统引导过程中启动的进程,跟终端无关的进程;
前台进程:也叫用户进程或交互式进程;通过终端启动的进程,跟终端相关的进程;
注意:也可把在前台启动的进程送往后台,以守护模式运行;
10)进程状态:
运行态:running,内存有数据且被cpu调度运行的
就绪态:ready,内存有数据但未被cpu调度运行的;就绪态也叫睡眠态;
睡眠态:
浅度睡眠态:interruptable,也叫可中断睡眠态,因进程时间片耗尽而进入睡眠态;
深度睡眠态:uninterruptable,也叫不可中断睡眠态,因进程需要通过磁盘I/O加载数据而进入睡眠态;此处的磁盘I/O分为两段,第一段从磁盘加载数据到内核内存,第二段从内核内存复制到进程内存;
暂停态:stopped,暂停于内存中,但不会被调度,除非手动启动之;
僵死态:zombie,也叫退出态,形象的说就是一个进程使命结束自杀后至父进程来收尸之间的状态;
11)进程分类:
CPU-Bound:cpu密集型进程,非交互式进程多是cpu密集型进程;
IO-Bound:IO密集型进程,交互式进程多是IO密集型进程;
二 进程常见的基本命令
1)pstree命令
作用:display a tree of processes;
注意:CentOS 5和6看到的顶级进程为init,而CentOS 7看到的顶级进程为systemd
2)ps命令
作用:ps – report a snapshot of the current processes.即查看在ps命令执行这一刻所有进程的状态;
/proc/:内核参数(即内核所管理的进程的状态信息)存放位置;内核参数也被模拟成文件,非参数本身被模拟成目录,参数本身被模拟成文件;每个进程在/proc/目录下都有一个进程号命名的目录/proc/PID,该目录中存放了当前进程的各种状态信息
启动进程的方式:
系统启动过程中自动启动:与终端无关的进程;
用户通过终端启动:与终端相关的进程;
ps选项有三种风格:
UNIX:选项前必须由“-”引导;
BSD:选项前必须不由“-”引导;
GNU:选项前必须由“–”引导;
用法:ps [options]
options:
a:所有与终端相关的进程;
x:所有与终端无关的进程;
u:以用户为中心组织进程状态信息显示;
aux:常用组合之一;显示结果中相关字段的含义,如下;
VSZ:虚拟内存集,即进程占用的虚拟内存(即线性地址空间)大小;因为多个进程会共享库,因此进程占用的线性地址空间和物理地址空间大小不一定一致,一般前者大于后者;
RSS:常驻内存集;即进程中关键的、不能调到交换分区上的数据占用的内存集
STAT:基于BSD风格进行描述的
R:running,运行态
S:interruptable sleeping,可中断睡眠
D:uninterruptable sleeping,不可中断睡眠
T:stopped,暂停态
Z:zombie,僵死态
+:前台进程
l:多线程进程
N:低优先级进程
<:高优先级进程
s:session leader ,会话主导者,例如shell进程会启动诸多子进程,此时shell进程就是会话主导者,shell进程挂了之后其子进程也随之不复存在;
-e:显示所有进程,相当于ax
-f:显示完整格式的进程信息
-ef:常用组合之二;
PPID:父进程的进程号
C:cpu占用百分比
STIME:启动的时间
TTY:与哪个终端相关;
-F:显示更详细的完整格式的进程信息;
PSR:运行于哪颗CPU之上,从0开始编号;
-H:以层级结构显示进程的相关信息;
-eFH:常用组合之三;
-eo,axo:常用组合之四;o一定要写在后面,因为它是要带参数的;
o field1, field2,…:自定义要显示的字段列表,以逗号分隔;
常用的field:pid, ni, priority(不可简写为pri), psr, pcpu, stat, comm, tty, ppid, rtprio
ni:nice值;
priority:优先级;
pcpu:cpu利用率
rtprio:real time priority,实时优先级;
3)pgrep和pkill命令
作用:look up or signal processes based on name and other attributes
,过滤和关闭进程
用法:pgrep [options] [pattern];pkill命令使用与pgrep类似;
选项:
-u uid:effective user,即以哪儿用户的身份运行的
-U uid:read user,即以哪个用户的身份启动的
-t TERMINAL:与指定的终端相关的进程;
-l:显示进程名;
-a:显示完整格式的进程名,即显示进程名和它启动时的参数;
-P pid:显示此进程的子进程的进程号,不包括其子进程的子进程;
4)pidof命令
作用:根据进程名取其pid;有的进程可能不只一个;
5)top命令
作用:display Linux processes,即动态的不断刷新的逆序的查看当前系统上所有进程的状态信息,类似于Windows中的任务管理器;top命令有很多交互式内建命令;
选项:
-d #:指定刷新时间间隔,默认为3秒;
-b:以批次方式显示;
-n #:显示多少批次;
内建命令:
排序:
P命令:以占据CPU百分比排序;默认
M命令:以占据内存百分比排序;
T命令:累积占用CPU时间排序;
首部信息:
第一行:uptime信息,键入l(L的小写)命令可关闭,再键入l(L的小写)命令可开启;
第二、三行:tasks及cpu信息,键入t命令可关闭,再键入t命令可开启; 键入1(数字)命令分散显示每颗cpu的使用比率, 再键入1(数字)命令汇总显示cpu的使用比率;
第四、五行:内存和交换内存信息,键入m命令可关闭,再键入m命令可开启;
退出命令:q或Ctrl+c
修改刷新时间间隔:s
终止指定的进程:k
11:25:55-当前时间,3:26-总运行时长,31users-登录到当前系统的总用户数,load average:0.00 0.01 0.05-平均负载:过去1分钟、5分钟、15分钟的平均等待运行的队列长度,通常队列长度的总数量不能大于cpu的数量;
us-用户空间的进程占用cpu的百分比,sy-内核空间的内核占用的cpu的百分比,us和sy的比率一般7:3比较合理;ni-调整完nice值以后额外多占用的cpu百分比,id-idle,cpu空闲百分比,wa-等待I/O完成占用的cpu百分比,hi-处理硬件中断占用的cpu百分比,si-处理软件中断占用的cpu百分比,st-被虚拟化程序偷走的cpu百分比;
buff/cache-缓冲和缓存占用的内存,但是这些内存是可以回收的,不算真正占用;
PID-进程id,USER-启动进程的用户,PR-进程优先级,NI-进程nice值,VIRT-进程虚拟内存集,RES-进程常驻内存集,SHR-进程共享内存空间,S-进程状态,%CPU-占用cpu百分比,%MEM-占用内存百分比,TIME+-累积时长,COMMAND-进程启动命令;在该页面键入大写P、M或T可调整排序关键字;
6)update命令
作用:显示系统时间、运行时长及平均负载
7)vmstat命令
作用:report virtual memory statistics
用法:vmstat [options] [delay [count]]
选项:
-s:显示内存统计数据;
备注:上图参数详解,如下:
procs:进程
r:等待运行的进程的个数,即CPU上等待运行的任务的队列长度;
b:处于不可中断睡眠态的进程个数,即被阻塞的任务队列的长度;
memory:内存
swpd:交换内存使用总量;对于服务器而言能不用交换内存就不要用,因为交换内存性能跟内存的性能差的太多了;
free:空闲的物理内存总量;
buffer:用于buffer的内存总量;
cache:用于cache的内存总量;
swap:交换内存,如果si和so活动频繁就说明物理内存不足;
si:换进,即数据进入swap的数据速率(kb/s)
so:换出,即数据离开swap的数据速率 (kb/s)
io:
bi:从块设备读入数据到系统的速率(kb/s)
bo:从系统保存数据至块设备的速率(kb/s)
system:
in:interrupts,中断速率;一般网络服务器的中断速率很频繁,网络数据到达、磁盘IO(硬中断)、用户模式转为内核模式(软中断)等等都会导致中断发生
cs:context switch, 上下文切换(也叫任务切换或进程切换)的速率;
cpu :
us:用户空间的进程占用cpu的百分比;
sy:内核空间的内核占用的cpu的百分比,us和sy的比率一般7:3比较合理;
id:idle,cpu空闲百分比;
wa:等待I/O完成占用的cpu百分比;
st:被虚拟化程序偷走的cpu百分比;
8)kill命令
作用:terminate a process,实际是用于向进程发送信号,以实现对进程的管理;一般只有管理员能kill任何进程;
用法:
显示当前系统可用信号:kill -l [signal]
向进程发信号: kill [-s signal|-SIGNAL] pid…
每个信号的标识方法有三种:
信号的数字标识;例如,1;
信号的完整名称;例如,SIGHUP;
信号的简写名称;例如,HUP
常用信号:
1)SIGHUP:无须关闭进程而让其重读配置文件,但是是向启动用户为root的主进程发送该信号才能生效;
2)SIGINT:终止正在运行的进程,相当于Ctrl+c
9)SIGKILL:杀死运行中的进程,残忍杀死进程,会有损坏未正常关闭的文件等等各种问题,不建议使用;
15)SIGTERM:终止运行中的进程,人道杀死进程;默认信号;
18)SIGCONT:将f 19)SIGSTOP:将进程送往后台并停止进程;
9)killall命令
作用:kill processes by name,根据进程名杀死与进程名相关的所有进程;
用法:killall [-SIGNAL] program;因为杀死信号时默认信号,因此该信号可省;
原创文章,作者:xiangx,如若转载,请注明出处:http://www.178linux.com/71707
评论列表(1条)
总结的很细致啊,赞