朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux僵尸进程和孤儿进程的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!
C 语 言 专 栏:C语言:从入门到精通
数据结构专栏:数据结构
个 人 主 页 :stackY、
C + + 专 栏 :C++
Linux 专 栏 :Linux
目录
前言:
承接上篇,总结完了各种进程状态,在最后面认识了一个僵尸状态,僵尸状态就是:一个进程退出之后,但是这个进程并没有被OS或者父进程读取,所以OS还是需要维护这个退出进程的PCB结构,此时,这个进程所处的状态就是僵尸状态!
1. 僵尸进程
僵尸状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
我们来使用代码来实现一个处于僵尸状态的进程:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t id = fork(); if (id < 0) return 1; else if (id == 0) { // 子进程 int cnt = 5; while (cnt--) { printf("I am child ... , running time : %d\n", cnt); sleep(1); } printf("The child process is already dead\n"); exit(2); } else { // 父进程 while(1) { printf("I am father ... \n"); sleep(1); } // 回收操作 // ... } return 0; }
处于Z状态的进程就被叫做僵尸进程!!
1.1 僵尸进程的危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态。
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,OS一直都要维护该进程的PCB。
那一个父进程创建了很多子进程,就是不回收,那么就会造成内存资源的浪费,因为数据结构对象本身就要占用内存,在C语言中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!所以这也就产生了内存级别的内存泄漏!
2. 孤儿进程
在僵尸进程中的代码,我们设置的让父进程一直死循环运行,不退出,但是让子进程只运行5s就退出,可以看到,在子进程退出后,父进程并没有及时的读取回收它,使它处于一种僵尸状态,从而成为了僵尸进程。
那么,如果我们修改一下代码:让父进程先运行5s,然后让子进程一直死循环运行,此时父进程退出之后会不会也出现僵尸状态呢?
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { pid_t id = fork(); if (id < 0) return 1; else if (id == 0) { // 子进程 while (1) { printf("I am child ... \n"); sleep(1); } } else { // 父进程 int cnt = 5; while(cnt--) { printf("I am father, running time : %d\n", cnt); sleep(1); } printf("The parent process has quit\n"); exit(2); } return 0; }
通过现象可以观察到,在父进程退出后,直接查不到父进程的状态信息了,难道父进程被读取回收了吗?
那么这个父进程的父进程是谁呢?答案是bash,当父进程退出时,bash就会自动将它读取回收!!
那bash既然能回收它的子进程,那么直接顺手将它的孙子进程也回收得了,那么为什么它没有呢?
是因为父子关系的进程中,父进程只会对自己的子进程负责,并不会对自己的孙子进程负责!
那么这个子进程的父进程已经退出了,此时他还在运行,那么它的PCB被谁回收呢?
可以看到这个子进程被1号进程领养了,所以就可以得出一个结论:
如果一个子进程的父进程直接退出了,这个子进程就要被1号进程所领养,那么该子进程就叫
做孤儿进程!
那么这个领养的1号进程是谁呢?我们可以使用top指令来查看一下:
那么操作系统为什么要领养呢?
如果当这个孤儿进程退出之后,就没有人对他进行回收,就会变成Z状态,从而消耗内存资源,导致内存泄漏!
朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!