常见的操作系统都支持多重任务处理(multitasking)——系统通过快速切换运行中的程序来实现多任务的同时执行。Linux内核通过使用进程来管理多重任务。进程是Linux用来安排不同程序等待CPU调度的一种组织方式。
1.进程如何工作
系统启动时,内核先把它的一些程序初始化为进程,然后运行一个成为init的程序。init程序将依次运行一系列称为脚本初始化(init script)的shell脚本(放在/etc目录下),这些脚本会启动所有的系统服务。其中很多服务都是通过守护程序(daemon program)来实现的。而后台程序只是待在后台做它们自己的事情,并且没有用户界面。
一些程序的运行可以触发其它程序的运行,在进程系统中这样的情况被表述为父进程创建进程。
内核会保存每个进程的信息以确保任务有序进行,比如每个进程将会被分配一个成为**进程ID(PID, process ID)**的号码。进程ID是按递增顺序来分配的,init进程的PID始终为1.
1.1 使用ps命令查看进程信息
$ ps
PID TTY TIME CMD
273916 pts/31 00:00:00 bash
295762 pts/31 00:00:00 ps
这个例子有两个进程:进程5198和进程10129,分别对应bash和ps命令.
可以在ps后增加选项,获得反映系统运行情况的更大的视图界面.
$ ps x
PID TTY STAT TIME COMMAND
27789 ? Ss 0:02 SCREEN -S down
27790 pts/73 Ss+ 0:00 /bin/bash
31195 ? Ss 0:05 SCREEN -S train00
31196 pts/82 Ss 0:00 /bin/bash
201867 ? S 0:05 sshd: lixj@pts/93
201892 pts/93 Ss+ 0:00 -bash
203115 pts/82 S+ 2:56 wget https://datasets.appen.com/appen_datasets/open-images/zip_files_copy/train_00.zip
273873 ? S 0:14 sshd: lixj@pts/31
273876 ? S 0:00 sshd: lixj@notty
273877 ? Ss 0:00 /usr/libexec/openssh/sftp-server
273916 pts/31 Ss 0:00 -bash
273925 ? Ss 0:03 bash -c while [ -d /proc/$PPID ]; do sleep 1;head -v -n 8 /proc/meminfo; head -v -n 2 /proc/stat /p
296802 pts/31 R+ 0:00 ps x
296808 ? S 0:00 sleep 1
其中TTY列中出现的“?”
表示没有控制终端。
这里增加了个新列STAT
,是state的缩写,显示的是进程的当前状态。详情如表1
表1 进程状态
状态 | 含义 |
---|---|
R | 运行状态。进程正在运行或者准备运行 |
S | 睡眠状态。进程不在运行,而是在等待某事件发生,如键盘输入或者受到网络报表 |
D | 不可中断的睡眠状态。进程在等待I/O操作,如硬盘驱动 |
T | 暂停状态。进程在等待I/O操作,如硬盘驱动 |
Z | 无效或者“僵尸”进程。子进程被终止,但是还没有被其父进程彻底释放掉 |
< | 高优先级进程。进程可以被赋予更多的重要性,分配更多的CPU时间。进程的这一特性称为优先级(niceness)。高优先级的进程被说成较不友好,是因为它将消耗更多的CPU时间,这样留给其它进程CPU时间就会变少。 |
N | 低优先级进程。低优先级进程(友好进程,a nice process)只有在其它更高优先级的进程使用完处理器后才能获得使用处理器的时间. |
ps还可以带aux选项,注意,这里不带前置连字符,将输出更多信息。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
deepid-1 7273 0.0 0.0 238316 7060 ? Sl Jun05 0:00 /usr/lib/gnome-online-accounts/goa-identity-service
root 7307 0.0 0.0 0 0 ? S 15:04 0:00 [kworker/3:0]
colord 7316 0.0 0.1 243300 12216 ? Ssl Jun05 0:00 /usr/lib/colord/colord
deepid-1 7367 0.0 0.7 926824 60292 ? Sl Jun05 0:00 /usr/lib/evolution/evolution-calendar-factory-subprocess --fac
该选项组合将会显示属于每个用户的进程信息,使用这些选项时不带前置连字符使得命令以“BSD模式”。
表2 BSD模式下ps输出的列标题
标题 | 含义 |
---|---|
USEER | 用户ID,表示该进程的所有者 |
%CPU | CPU使用百分比 |
%MEM | 内存使用百分比 |
VSZ | 虚拟耗用内存大小 |
RSS | 实际使用的内存大小。进程使用的物理内存(RAM)大小(以KB为单位) |
START | 进程开启的时间,如果数值超过24小时,那么将使用日期来显示 |
1.2 使用top命令动态查看进程信息
ps仅仅是提供的在命令被执行时刻机器状态的快照,要查看机器运行情况的动态视图,可以使用top
$ top
top将按照进程活动的顺序,以列表的形式持续更新显示系统进程的当前信息,主要用于查看系统“最高(top)”进程的运行情况。
主要分为两部分,顶部是系统总体状态信息,下面是按CPU活动时间排序的进程情况表。
$ top
top - 15:52:31 up 2 days, 19:39, 2 users, load average: 1.19, 1.08, 0.99
Tasks: 311 total, 2 running, 309 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.9 us, 1.3 sy, 0.0 ni, 91.4 id, 0.1 wa, 1.2 hi, 0.1 si, 0.0 st
KiB Mem : 8040348 total, 81664 free, 5791884 used, 2166800 buff/cache
KiB Swap: 4020168 total, 3985712 free, 34456 used. 1990220 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13545 deepid-1 20 0 21.190g 2.374g 891320 R 37.9 31.0 1885:23 python3
13445 deepid-1 20 0 11000 3756 2872 R 1.3 0.0 0:00.30 top
6480 root 20 0 24.288g 69412 53420 S 1.0 0.9 18:26.79 Xorg
1846 root -51 0 0 0 0 S 0.3 0.0 0:58.04 irq/52-d230000.
4335 root 20 0 0 0 0 S 0.3 0.0 1:55.73 dhd_watchdog_th
4336 root -51 0 0 0 0 S 0.3 0.0 2:38.68 dhd_dpc
5504 root -51 0 0 0 0 S 0.3 0.0 5:06.20 sugov:1
7248 deepid-1 20 0 739508 111436 65760 S 0.3 1.4 5:13.67 compiz
8244 deepid-1 20 0 12748 5652 4472 S 0.3 0.1 0:01.57 sshd
表3 顶部信息中的字段
行 | 字段 | 含义 |
---|---|---|
1 | top | 程序名 |
1 | 15:52:31 | 当前时间 |
1 | up 2 days | 正常运行时间(uptime),从机器最后一次启动开始计算的时间总数,这个例子中,系统已经运行了2天 |
1 | 2 users | 有两个用户已登录 |
1 | load average | 负载均值指的是等待运行的进程数,即共享CPU资源的处于可运行状态的进程数。第一个代表前60s的均值,第二个代表前5min的均值,第三个代表前15min的均值。该值小于1.0表示该机器不忙 |
2 | Tasks | 统计进程数及各个进程的状态信息 |
3 | 5.9 us | 5.9%的CPU时间被用户进程占用,这里指的是处于内核外的进程 |
3 | 1.3 sy | 1.3%的CPU时间被系统进程(内核进程)占用 |
3 | 0.0 ni | 0.0%的CPU时间被友好进程(nice)(低优先级进程)占用 |
3 | 91.4 id | 91.4%的CPU时间是空闲的 |
3 | 0.1 wa | 0.0%的CPU时间来等待I/O操作 |
4 | Mem | 显示物理RAM(随机存取内存)的使用情况 |
5 | Swap | 显示交换空间(虚拟内存)的使用情况 |
2.控制进程
我们使用xlogo的小程序测试对进程的控制。
$ xlogo
2.1 中断程序
在终端按下Ctrl+C
将会终端(interrupt)一个程序,它意味着我们委婉地请求程序结束。许多命令行程序都可以这样中断。
2.2 使进程在后台运行
想要shell提示符返回,但又不终止程序,可以让程序在后台(background)运行来实现。只需要在命令后面加上和号字符(&)
来实现。
$ xlogo &
[1] 23458
$
打印的信息为shell的一个称为作业控制(job control)的特性表现。
打印的这条信息的意思是,已经启动的作业编号为1([1]),其对应的PID是23458.
2.3使进程回到前台运行
使用fg
命令可以使进程回到前台运行
$ jobs
[2]+ Running xlogo &
$ fg %2
xlogo
2.4 停止(暂停)进程
如果我们只是想暂停进程,而不是终止今晨,我们为了暂停前台进程需要按下Ctrl+Z
键.
$ xlogo
^Z
[1]+ Stopped xlogo
可以通过使用fg命令让进程在前台恢复运行,也可以使用bg命令让进程移到后台运行.
$ fg %1
xlogo
3. 信号
kill
命令通常用来“杀死”(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序
例如
$ xlogo &
[1] 23638
$ kill 23638
kill准确来说并不是“杀死”进程,而是给进程发送信号(signal)。信号是操作系统和程序间通信的多种方式之一,在使用Ctrl-C键和Ctrl-Z键时已经见识过信号的作用。当终端接受其中一个输入时,将发送信号到前台进程;在按下Ctrl+Z的情况下,将发送一个称为TSTP(终端暂停,Terminal Stop)的信号。反过来,程序“监听”信号,而且在接收到信号的时候按照它们的指示进行操作。
3.1使用kill命令发送信号到进程
语法为
kill [-singnal] PID ...
如果没有指定信号,默认发送TERM(终止,Terminate)信号.
kill常用信号
信号编号 | 信号名 | 含义 |
---|---|---|
1 | HUP | 挂起信号。指定程序控制终端已被“挂起”。效果通过关闭终端来表示,前台程序收到该信号后将终止,后台程序接收到该信号后,将重启并且重新读取其配置文件 |
2 | INT | 中断信号。与在终端下按下Ctrl+C一样,通常用来中断程序 |
9 | KILL | 杀死信号。该信号比较特殊,该信号不会真的发送到目标程序,而是内核立即终止该进程。此时该进程没有机会对它自己进行“清理”或者对当前工作进行保存。 |
15 | TERM | 终止信号。这是kill命令默认的信号类型。 |
18 | CONT | 继续运行信号。恢复之前接受了STOP信号的进程 |
19 | STOP | 暂停信号。该信号将使进程暂停,而不是终止。和KILL信号类似,该信号不会发送给目标进程,因此它不能被忽略。 |
例如
$ xlogo &
[3] 23786
$ kill -1 23786
$
[3]+ Hangup xlogo
表5 被系统使用的其他常见信号
信号编号 | 信号名 | 含义 |
---|---|---|
3 | QUIT | 退出信号 |
11 | SEGV | 段错误信号。如果程序非法占用了内存空间,那么系统将发送该信号 |
20 | TSTP | 终端暂停信号。按下Ctrl+Z时终端将发出该信号 |
28 | WINCH | 窗口改变信号,当窗口改变大小时,系统将发送该信号 |
3.2 使用killall命令发送信号给多个进程
语法为
killall [-u user] [-signal] name ...
例如
$ xlogo &
[3] 23867
$ xlogo &
[4] 23872
$ killall xlogo
[3]- Terminated xlogo
[4]+ Terminated xlogo
转载:https://blog.csdn.net/mathlxj/article/details/106615285