在上一篇笔记的最后写到了孤儿进程,这篇笔记总结一下进程都有哪些状态。
1 | // 位图 |
R:运行状态,表示进程在运行中或者在运行队列里(当备胎)。
S:睡眠状态,暂时还轮不到我,我先睡一会。
D:磁盘休眠状态,有的时候也叫不可中断休眠状态,一般在密集的I/O操作时出现。程序在临终遗言(吐core dump)的时候会出现此状态。
T:停止状态,可以通过ctrl + z放在后台,这个时候进程就是T状态了,fg再回来。(可以通过发送 SIGSTOP 信号给进程来停止进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。)
t:跟踪状态,GDB attach~~~
X:一般看不到,只是一个返回状态。
Z:僵尸进程。
僵尸进程
成因
简单来说就是子进程结束后父进程没有回收子进程的资源导致。
模拟
1 |
|
危害
Z状态一直不退出,PCB一直都要维护。内存泄漏。那一个父进程创建了很多子进程,就是不回收那不是太浪费了啊。我们要勤俭节约……扯哪里了。
避免
进程等待,父进程回收子进程的资源。
孤儿进程
成因
父进程先退出,子进程还在执行,子进程就会被 1 号进程收养,子进程的相关资源也由 1 号进程进行释放。
init 进程是一个统称,就和PCB 是统称一样,Linux 上的PCB叫task_struct。在centos 7上init进程叫systemd。
孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。
模拟
之前fork 总结里。
危害
木有。