模拟实现僵尸进程和孤儿进程
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。
相关文章推荐
- 模拟实现僵尸进程, 孤儿进程的场景
- 孤儿进程和僵尸进程的模拟实现
- linux中的孤儿进程和僵尸进程详解及模拟实现
- 僵尸进程与孤儿进程模拟实现
- 模拟实现僵尸进程和孤儿进程
- 模拟实现僵尸进程, 孤儿进程
- 使用代码模拟实现僵尸进程, 孤儿进程的场景
- 模拟实现僵尸进程和孤儿进程
- 僵尸进程和孤儿进程的模拟实现
- Linux 中模拟实现僵尸进程和孤儿进程
- Python脚本模拟僵尸进程与孤儿进程
- PHP实现系统编程(二) --- 多进程编程介绍及孤儿进程、僵尸进程
- 模拟实现僵尸进程&孤儿进程
- 孤儿进程与僵尸进程的实现与总结
- Linux环境下实现僵尸进程和孤儿进程
- 代码实现僵尸进程,孤儿进程
- 僵尸进程和孤儿进程的模拟以及相关知识
- 僵尸进程,孤儿进程的实现
- 模拟实现~僵尸进程和孤儿进程