linux-------------进程概念(中)
1.进程状态
为了弄明⽩正在运⾏的进程是什么意思,我们需要知道进程的不同状态。⼀个进程可以有⼏个状
态(在Linux内核⾥,进程有时候也叫做任务)。
下⾯的状态在kernel源代码⾥定义:
static const char *const task_state_array[] = {
"R (running)", /*0 */
"S (sleeping)", /*1 */
"D (disk sleep)", /*2 */
"T (stopped)", /*4 */
"t (tracing stop)", /*8 */
"X (dead)", /*16 */
"Z (zombie)", /*32 */
};
R运⾏状态(running): 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏
队列⾥。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这⾥的睡眠有时候也叫做可中断睡眠
(interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个
状态的进程通常会等待IO的结束。
T停⽌状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的
进程可以通过发送 SIGCONT 信号让进程继续运⾏。
X死亡状态(dead):这个状态只是⼀个返回状态,你不会在任务列表⾥看到这个状态。
1-1 进程状态查看
1.1.1ps 命令 静态查看进程
ps aux /ps axj
a:显示所有用户的进程
u:显示进程的详细状态(如 CPU、内存占用)
x:包括未连接终端的进程(如后台服务)
j:显⽰进程归属的进程组ID、会话ID、⽗进程ID,以及与作业控制相关的信息
常用组合
ps -ef | grep nginx # 查找与 nginx 相关的进程
ps axj | grep 进程
1.2 僵尸进程
僵尸进程的概念:想象一下:一个进程已经“死亡”(执行结束),但它的“灵魂”(进程描述符)还留在系统中,等待“超度”(父进程回收资源)——这就是僵尸进程(Zombie Process)!
-
特征:进程状态为
Z
(通过ps
/top
查看)。 -
本质:内核保留其退出状态,直到父进程处理
大家想一下为什么会产生僵尸进程?
1.父进程未进行回收
在子进程结束的时候,父进程没有调用wait()或waitpid()读取其庄涛
2 父进程异常终止
在父进程异常终止的时候,子进程会被bash进程接管,但是他最后会回收子进程
僵尸进程有什么危害呢?
-
资源占用:僵尸进程本身不消耗 CPU 和内存,但会占用进程表项。
-
潜在风险:若系统中僵尸进程过多(超过内核限制),可能导致无法创建新进程!
大家想查看僵尸进程可以通过下面指令
ps aux | grep 'Z
1.3 孤儿进程
什么是孤儿进程呢?
想象一下:一个进程的父进程突然消失(比如崩溃或被终止),剩下子进程“孤苦伶仃”——这就是孤儿进程(Orphan Process)!
-
特征:子进程仍在运行,但父进程已终止。
-
命运:孤儿进程会被系统“收养”,自动挂载到
init
进程(PID=1)名下,由系统接管生命周期。
孤儿进程是如何产生的呢?
-
父进程代码中未等待子进程结束,直接调用
exit()
。 -
示例代码(C语言):
-
#include <unistd.h> int main() { pid_t pid = fork(); if (pid == 0) { sleep(10); // 子进程睡眠时,父进程已退出 printf("我是孤儿进程!\n"); } else { printf("父进程退出,不管孩子了!\n"); exit(0); // 父进程直接退出 } return 0; }
可以通过下面命令查看孤儿进程
-
ps -eo pid,ppid,stat,cmd | grep '^[ ]*[0-9]\+[ ]\+1 '
2.进程优先级
2.1.基本概念
cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性
能。
还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤ 改善
系统整体性能。
2.2.查看系统进程
在linux或者unix系统中,⽤ps ‒l命令则会类似输出以下⼏个内容:

UID : 代表执⾏者的⾝份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍⽣⽽来的,亦即⽗进程的代号
PRI :代表这个进程可被执⾏的优先级,其值越⼩越早被执⾏
NI :代表这个进程的nice值
2.3.PRI and NI
PRI也还是⽐较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执⾏的先后顺序,此
值越⼩进程的优先级别越⾼
那NI呢?就是我们所要说的nice值了,其表⽰进程可被执⾏的优先级的修正数值
PRI值越⼩越快被执⾏,那么加⼊nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变⼩,即其优先级会变⾼,则其越快
被执⾏
所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20⾄19,⼀共40个级别。
2.4.PIR vs NI
需要强调⼀点的是,进程的nice值不是进程的优先级,他们不是⼀个概念,但是进程nice值会影
响到进程的优先级变化。
2.5.查看进程优先级的命令
⽤top命令更改已存在进程的nice:
top
进⼊top后按“r”‒>输⼊进程PID‒>输⼊nice值
注意:
其他调整优先级的命令:nice,renice
系统函数: