目录
进程定义与状态
1.定义与状态
进程即处于内存中的可执行程序实例,在多任务操作系统中,每个CPU在一个时间上处理一个进程。当进程启动时,它会先进入到进程就绪队列(万事具备,只差CPU)中;等待CPU空闲之后由CPU处理,进入运行状态;运行时若遇到需要I/O事件,则进入阻塞状态,等待I/O事件完成后,回到就绪状态,等待CPU执行。
看完上边的话,你可能会疑惑如果一个进程的执行时间特别长,那么系统是否就无法处理其他任务了?
当然不是,CPU的运行也是受到限制的,最常见的是时间片轮转法,CPU一次最多只会处理当下进程一个时间片的时间, 时间用完则回到就绪状态(没有I/O事件),等待下一次启动。除此之外,CPU选取就绪队列中的进程也有多种策略,比如抢占式优先级(优先级高的进程可以抢占CPU资源)用于处理紧急的任务;选取等待时间最长的任务等等方法。
进程在Linux系统中一共具有如下状态:
R | running,处于运行中或者可运行状态 |
S | sleep,处于睡眠状态,但可以被唤醒 |
D | 不可唤醒的睡眠状态,一般在等待I/O操作完成,例如等待读取磁盘数据后的回复 |
K | 与D相同,唯一区别在于可以接受中止(彻底退出)的信号 |
I | D状态的一个子集,可接受致命信号 |
T | 暂停状态,信号SIGSTOP,恢复使用信号SITCONT信号 |
T | 追踪停止状态,往往调试程序时出于此状态 |
Z | 僵尸状态,进程已经死亡,但是无法删除到内存外。例如子进程先于父进程结束后释放除PID之外的所有资源,但直到父进程结束前均处于此状态 |
X | 死亡状态,进程已经被完全释放 |
2.查看进程状态
2.1 top命令
top命令用于动态列出系统整体运行情况(每隔5秒刷新一次)。可用q退出。
top行信息为:登录日期,已登录时间,当前登录用户数,系统负载平均值。
系统负载平均值:根据报告CPU上准备运行进程数与等待磁盘或网络I/O完成进程数确定。三个数分别为系统在1分钟,5分钟,15分钟内指数移动平均值。
系统负载平均值除以CPU数,得到的值小于1则表示资源使用率适当,反之表示资源饱和,处理存在延迟。
task行信息为:当前系统进程总数及处于各状态下进程数,运行,睡眠,停止,僵尸
%CPU信息行:CPU使用率
MiB Mem:物理内存总量,空闲区,已使用,缓冲区
MiB Swap:交换区总量,空闲,已使用,缓冲区
进程信息:
PID | 进程ID号 |
USER | 进程所有者用户 |
PR | 优先级 |
NI | nice值,值越低优先级越高 |
VIRT | 进程所使用的虚拟内存总量 |
RES | 进程使用的,未被换出的进程总量 |
SHR | 共享内存大小 |
S | 进程状态 |
%CPU | CPU使用占比 |
%MEM | 进程使用的物理内存占比 |
TIME+ | CPU使用时间 |
COMMAND | 命令名/命令行 |
在top命令执行过程中,还有许多选项用于交互。
按键 | 功能 |
?或者h | 帮助选项 |
l | 切换到负载标题行 |
t | 切换到线程标题行 |
m | 切换到内存标题行 |
shift+b | 运行中进程和标题转为粗体 |
k | 输入PID,以杀死进程 |
r | 调整nice值,输入PID,调整指定进程 |
shift+w | 保存调整,以便下一次top命令使用 |
q | 退出 |
2.2 ps命令
ps命令用于列出当前进程的详细信息,因为其可以接受不同类型的命令选项,不同类型的命令选项可以混用,但有时会发生冲突,有些同义选项功能也是相同的。
在这里我们只讲述最为常用的搭配:
ps aux //显示包括无控制终端所有的进程详细信息
状态与top命令差不多,这里就不多叙述,只有TTY代表的是启用进程的终端,?代表不是由终端启动
ps lax //长列表显示进程信息
F为权限
ps -ef //与ps aux差不多
PPID代表父进程ID,C代表进程所占用CPU百分比。
ps --forest //树状显示进程关系
如图所示:bash为父进程, ps为其子进程。
管理进程
1.前后台进程
命令一般都是在前台执行,但是如果你在命令后加上&符号,那么将会在后台执行,位于前台的任务可以使用ctrl+z将任务移至后台并暂停;
sleep 100 &
使用jobs可以查看当前会话的后台任务
而使用fg命令可将后台移回前台:
fg %number //number为jobs的【】内数字
使用bg命令启动暂停的任务
bg %number
2.信号管理进程
可以使用命令kill -l查看当前系统所支持的信号集:
常用的信号 | 作用 |
2 | 终止进程,可被中止,ctrl+c |
9 | 强制杀死进程,致命 |
15(默认) | 终止进程,在进程执行完毕后,可被拦截 |
18 | 启动暂停进程,不可拦截 |
19 | 暂停进程,不可拦截 |
20 | 暂停进程,可以被拦截,ctrl+z |
kill 信号 PID/后台作业序号
可以使用pkill杀死一个用户的所有进程,使用pgrep确认要终止的进程 :
pgrep -l -u 用户名 //显示用户持有进程PID与命令
pkill 信号 -u 用户名 //删除用户所拥有进程
-u可以换为-t,后跟终端名。
树状显示进程:
pstree -p 用户名
killall可以根据指定命令向此命令执行的所有进程 发送信号: