您的位置:首页 > 其它

模拟实现僵尸进程和孤儿进程

2017-08-20 23:23 411 查看

僵尸进程和孤儿进程的概念

僵尸进程:一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。
进程在终止时,系统会回收所有内核分配给它的内存、关闭它打开的所有文件等等,但还会保留一些极少的信息,因为进程终止后有些信息对于父进程和内核还是很有用的,例如进程的ID号、进程的退出状态、进程运行的CPU时间等。父进程可以使用
wait/waitpid 等系统调用来获得这些信息,并为子进程做一些收尾工作。

但如果父进程一直不调用wait
/ waitpid的话, 那么子进程保留的那段信息就不会释放,其进程号就会一直被占用,这样子进程就会成为“占着茅坑不拉屎”的僵尸进程,除非等到其父进程退出后该进程将被init(进程号为1)回收。
其实任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
 如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。

由于系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程,这种危害还是蛮大的。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。
每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,
看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init来接管他,成为他的父进程。故孤儿进程的状态收集工作由init进程负责。

模拟实现僵尸进程

首先编写一个僵尸进程,由于我们无法得知是子进程先退出还是父进程先退出,所以使父进程休眠30s,以保证子进程先退出。



使程序运行起来,然后打开另外一个终端,查看进程状态



可以看出此时系统中多了一个状态为‘Z+’,进程号为4117的僵尸进程,我们用kill来杀掉这个进程,却发现4117进程仍然存在,此时我们就能明白为什么称之为僵尸进程了。等到30s后,父进程退出了,这个僵尸进程也就被init收尸了。



模拟实现孤儿进程

编写一个孤儿进程,保证父进程比子进程先退出,两次输出子进程的pid和ppid,观察有何不同





可以看出子进程的ppid一开始为4265,等到父进程退出后,子进程被init进程领养,ppid变为1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: