进程状态

在上一篇笔记的最后写到了孤儿进程,这篇笔记总结一下进程都有哪些状态。

1
2
3
4
5
6
7
8
9
10
// 位图
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:运行状态,表示进程在运行中或者在运行队列里(当备胎)。

S:睡眠状态,暂时还轮不到我,我先睡一会。

D:磁盘休眠状态,有的时候也叫不可中断休眠状态,一般在密集的I/O操作时出现。程序在临终遗言(吐core dump)的时候会出现此状态。

T:停止状态,可以通过ctrl + z放在后台,这个时候进程就是T状态了,fg再回来。(可以通过发送 SIGSTOP 信号给进程来停止进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。)

t:跟踪状态,GDB attach~~~

X:一般看不到,只是一个返回状态。

Z:僵尸进程。

僵尸进程

成因

简单来说就是子进程结束后父进程没有回收子进程的资源导致。

模拟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <unistd.h>

int main() {
pid_t ret = fork();
if (ret > 0) {
// father process
while (1);
} else if (ret == 0) {
// child process
int cnt = 0;
while (cnt < 5) {
cnt ++;
sleep(1);
}
} else {
perror("fork");
}

sleep(1);
return 0;
}

危害

Z状态一直不退出,PCB一直都要维护。内存泄漏。那一个父进程创建了很多子进程,就是不回收那不是太浪费了啊。我们要勤俭节约……扯哪里了。

避免

进程等待,父进程回收子进程的资源。

孤儿进程

成因

父进程先退出,子进程还在执行,子进程就会被 1 号进程收养,子进程的相关资源也由 1 号进程进行释放。

init 进程是一个统称,就和PCB 是统称一样,Linux 上的PCB叫task_struct。在centos 7上init进程叫systemd。

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。

模拟

之前fork 总结里。

危害

木有。


文章作者: Ahoj
文章链接: https://ahoj.cc/2019/06/进程状态/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ahoj's Blog