一、简介
本文主要详细介绍进程相关的命令的使用、进程管理及调度策略的知识。
二、常用的命令解析
1、ps命令
命令选项 | 解析 |
---|---|
-a | 显示一个终端所有的进程 |
-u | 显示进程的归属用户和内存占用情况 |
-x | 显示没有控制终端的进程 |
-l | 长格式显示更详细的信息 |
-e | 显示所有进程 |
-w | 宽行显示,可以使用多个w进行加宽显示 |
进程常见状态有:
R运行状态(running)
S睡眠状态(sleeping)
D磁盘休眠状态(Disk sleep),不可中断
T停止状态(stopped)
Z僵尸状态(Zombies)
其他附加符号:
< 高优先级
N 低优先级
L 有些页被锁进内存
s 包含子进程
+ 位于前台的进程组(网上有很多错误说法,说带+为后台进程组,可通过后面的例子验证:sleep 100和sleep 200&,然后ps|grep sleep确认);
l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
- 12
[root@localhost 桌面]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 120252 5844 ? Ss 12:56 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
root 2 0.0 0.0 0 0 ? S 12:56 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 12:56 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 12:56 0:00 [kworker/0:0H]
项目 | 解释 |
---|---|
USER | 进程属主的用户名 |
PID | 进程 ID |
%CPU | 进程占用的 CPU 百分比 |
%MEM | 进程使用的内存百分比 |
VSZ | 进程的虚拟大小 |
RSS | 驻留内存大小(内存中的页数) |
TTY | 控制终端 ID |
2、命令w查看当前系统信息
[root@bogon cron]# w
14:48:39 up 2:46, 1 user, load average: 0.00, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/1 192.168.203.1 12:27 0.00s 0.17s 0.02s w
内容 | 显示信息的含义 |
---|---|
JCPU | 以终端代号来区分,该终端所有相关的进程的进程执行时,所消耗的CPU时间会显示在这里 |
PCPU | cpu执行程序消耗的时间 |
WHAT | 用户下在执行的操作 |
load average | 分别显示系统在过去1、5、15分钟内的平均负载程度 |
FROM | 显示用户从何处登录系统,":0"的显示代表该用户时人X Windows下,打开文本模式窗口登录的 |
IDLE | 用户闲置的时间,这是一个计时器,一旦用户执行任何操作,该计时器便会被重置 |
3、pstree命令产看进程树
命令选项:
-p:显示进程的PID
-u:显示进程的所属用户
4、top命令
具体参数可以参考该链接:Linux系统top命令详细总结
[root@localhost 桌面]# top
top - 22:33:04 up 2 min, 2 users, load average: 0.85, 0.62, 0.25
Tasks: 155 total, 2 running, 153 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.4 us, 1.4 sy, 0.0 ni, 95.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2967536 total, 2249804 free, 303732 used, 414000 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 2509432 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1183 root 20 0 288780 67084 34176 S 3.0 2.3 0:01.86 Xorg.bin
2218 root 9 -11 620700 29496 23820 S 2.0 1.0 0:00.79 mate-termin+
1661 root 9 -11 726344 33816 27408 S 0.7 1.1 0:02.16 caja
5、vmstat
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:
root@ubuntu:~# vmstat 2 1
- 1
6、优先级修改nice命令
基本格式为nice -n 数值 进程名。在前面ps -le命令中,表示优先级的列有PRI(priority)和NI(nice),真正的优先级由PRI决定,数值越小优先级越高。用户只能修改NI的值,修改后的PRI=原PRI+NI。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1191 root 20 0 241392 51576 22724 S 2.5 1.7 0:05.31 Xorg.bin
2200 root 9 -11 629840 32464 25096 S 1.9 1.1 0:03.91 mate-termin+
名称 | 含义 |
---|---|
PID | 进程 ID 每个进程都会从内核获取一个唯一的 ID 值。绝大多数用来操作进程的命令和系统调用,都需要用 PID 指定操作的进程对象 |
PPID | 父进程 ID 在 Unix 和 Linux 系统中,一个已经存在的进程必须“克隆”它自身来创建一个新的进程。当新的进程克隆后,最初的进程便作为父进程存在。 |
UID & EUID | 真实用户 ID 和有效用户 ID 一个进程的 UID 是其创建者的身份标志(也是对其父进程 UID 的复制)。通常只有进程的创建者和超级用户才有操作该进程的权限。EUID 是一个额外的 UID,用来决定在任意一个特定时间点,一个进程有权限访问的文件和资源。对绝大多数进程而言,UID 和 EUID 是相同的(特殊情况即 setuid) |
8、kill命令
kill 命令常用来终止某个进程,它可以向进程传递任意信号(默认为 TERM)。
[root@localhost 桌面]# kill [-signal] pid
- 1
不带任何数字(信号)选项的 kill 命令并不能保证指定进程被杀死,因为 kill 命令默认发送 TERM 信号,而 TERM 是可以被捕获、屏蔽或忽略的。
可以使用 kill -9 pid 命令强制杀死进程(9 代表 KILL 信号,不可被捕获、屏蔽或忽略)。
kill 命令需要指定进程的 PID 号。
pgrep 命令可以通过程序名称(或其他属性如 UID)筛选进程号,pkill 命令可以直接发送指定信号给筛选结果。
[root@localhost 桌面]# pkill -u ben
- 1
该命令将发送 TERM 信号给所有属于用户 ben 的进程。
killall 命令可以通过程序名称杀死指定进程的所有实例。如:
[root@localhost 桌面]# killall apache2
- 1
三、进程的管理
进程调度的的分级
3.1 高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:
高级调度
(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;
低级调度
(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;
中级调度
(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。
3.2 进程调度 - 进程调度的时机
进程调度发生在什么时机呢?这与引起进程调度的原因以及进程调度的方式有关。
引起进程调度的原因有以下几类,
(1)正在执行的进程执行完毕。这时,如果不选择新的就绪进程执行,将浪费处理机资源。
(2)执行中进程自己调用阻塞原语将白己阻塞起来进入睡眠等状态。
(3)执行中进程调用了P原语操作,从而因资源不足而被阻塞;或调用了v原语操作激活了等待资源的进程队列。
(4)执行中进程提出I/O请求后被阻塞。
(5)在分时系统中时间片已经用完。
(6)在执行完系统调用等系统程序后返回用户进程时,这时可看作系统进程执行完毕,从而可调度选择一新的用户进程执行。
以上都是在可剥夺方式下的引起进程调度的原因。在CPU执行方式是可剥夺时.还有
(7)就绪队列中的某进程的优先级变得高于当前执行进程的优先级,从而也将引发进程调度。
3.3 两种占用CPU的方式
可剥夺式 (可抢占式 preemptive):就绪队列中一旦有优先级高于当前执行进程优先级的进程存在时,便立即发生进程调度,转让处理机。
不可剥夺式(不可抢占式non_preemptive):即使在就绪队列存在有优先级高与当前执行进程时,当前进程仍将占用处理机知道该进程自己因调用原语操作或等待I/O而进入阻塞、睡眠状态,或时间片用完时才重新发生调度让出处理机。
3.4 进程调度 - 进程调度算法
1.先进先出算法(FIFO):按照进程进入就绪队列的先后次序来选择。即每当进入进程调度,总是把就绪队列的队首进程投入运行。
2.时间片轮转算法(RR):分时系统的一种调度算法。轮转的基本思想是,将CPU的处理时间划分成一个个的时间片,就绪队列中的进程轮流运行一个时间片。当时间片结束时,就强迫进程让出CPU,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。
3.最高优先级算法(HPF):进程调度每次将处理机分配给具有最高优先级的就绪进程。最高优先级算法可与不同的CPU方式结合形成可抢占式最高优先级算法和不可抢占式最高优先级算法。
4.多级队列反馈法:几种调度算法的结合形式多级队列方式。
3.5 进程状态
task_struct中的state描述进程的当前状态。进程的状态一共有5种,而进程必然处于其中一种状态:
1)TASK_RUNNING(运行)——进程是可执行的,它或者正在执行,或者在运行队列中等待执行。这是进程在用户空间中执行唯一可能的状态;也可以应用到内核空间中正在执行的进程。
2)TASK_INTERRUPTIBLE(可中断)——进程正在睡眠(也就是说它被阻塞)等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行,处于此状态的进程也会因为接收到信号而提前被唤醒并投入运行。
3)TASK_UNINTERRUPTIBLE(不可中断)——除了不会因为接收到信号而被唤醒从而投入运行外,这个状态与可打断状态相同。这个状态通常在进程必须在等待时不受干扰或等待事件很快就会发生时出现。由于处于此状态的任务对信号不作响应,所以较之可中断状态,使用得较少。
4)TASK_ZOMBIE(僵死)——该进程已经结束了,但是其父进程还没有调用wait4()系统调用。为了父进程能够获知它的消息,子进程的进程描述符仍然被保留着。一旦父进程调用了wait4(),进程描述符就会被释放。
5)TASK_STOPPED(停止)——进程停止执行,进程没有投入运行也不能投入运行。通常这种状态发生在接收到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信号的时候。此外,在调试期间接收到任何信号,都会使进程进入这种状态。
需要调整进程的状态,最好使用set_task_state(task, state)函数,在必要的时候,它会设置内存屏障来强制其他处理器作重新排序(SMP)。
进程的各个状态之间的转化构成了进程的整个生命周期。
其他相关链接: