僵尸进程和孤儿进程

一、僵尸进程

提到僵尸进程,我们不得不说的一个概念就是僵死态,大家可能会疑惑,什么是僵死态呢?僵死态就是一个进程已经退出了,但是它的资源没有完全释放。那么为什么会产生僵死进程呢?

僵尸进程产生的原因:子进程先于父进程退出,退出后,为了保存自身退出的原因(返回值),因此资源没有完全释放,
 操作系统这时候通知父进程获取子进程的退出状态,并允许操作系统释放资源但是若父进程没有关注这个退出状态,则子进程虽然退出了,但是资源没有完全释放,处于僵死状态,成为僵尸进程。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程的状态,子进程进入Z状态。

下边我们举一个僵尸状态的例子:

僵尸进程和孤儿进程

编译这个程序,并在另一个终端下启动监控

僵尸进程和孤儿进程僵尸进程和孤儿进程

由结果可以清楚的看见进程由S+变成了Z+,也就是由睡眠状态变成了僵尸状态。

那么僵尸状态有什么危害呢:

1、进程的退出状态必须被维持下去,维护退出状态本身就是要用数据维护,也就属于进程基本信息,保存在PCB中,Z状态一直不退出,PCB一直都要维护。

2、如果父进程创建了很多子进程,每一个子进程都不进行回收的话就会造成内存资源的浪费。

3、内存泄漏。

二、孤儿进程

上面讲完僵尸进程,大家又会疑惑,什么是孤儿进程呢?孤儿进程就是父进程先于子进程退出,子进程则成为孤儿进程,运行子啊狗太,并被1号init收养。

同样也举个例子,当大家认识一下孤儿进程

僵尸进程和孤儿进程

僵尸进程和孤儿进程僵尸进程和孤儿进程

孤儿进程被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和*出面处理它的一切善后工作。因此孤儿进程并不会有什么危害