为什么内核设计人员要给进程创造一种僵尸状态?
2017-09-06 17:02
344 查看
1.问题来源
大家都知道,子进程在终止之后,会使得内核产生SIGCHLD信号递送给父进程此时我们在网络编程中必须做到的(以下来自unix网络编程卷1)
(1)当fork子进程时,必须捕获SIGCHLD信号
(2)当捕获信号时,必须处理被中断的系统调用
(3)SIGCHLD的信号处理函数必须被正确编写,使用waitpid函数以免使得留下僵尸进程
看到上述资料时,我就在想,什么是僵尸进程呢?
2.什么是僵尸进程
于是有了接下来这段话一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
那么我又产生了问题,内核开发人员是不是闲得慌,子进程exit()后直接销毁不就好了,为什么还要为进程设置一种僵尸状态(TASK_ZOMBIE)?
答案: 给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取。这些信息包括子进程的进程ID、终止状态以及资源利用信息(CPU时间,内存使用量等等)。如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程)。继承这些子进程的init进程将清理它们(init进程将wait它们,从而去除僵尸状态)。
3.具体实例
“[b]给进程设置僵尸状态的目的是维护子进程的信息,以便父进程在以后某个时间获取”这句话的具体实例:[/b]比如:进程创建一个子进程来执行特定的任务,当子进程终止时,父进程捕获SIGCHLD信号来知道子进程已经终止,但这个任务到底有没有完成,如果我们不对子进程维护一些必要信息的话,就无从知晓,故内核开发人员设计了一种僵尸状态(其中维护了子进程id,子进程终止状态、资源利用信息等)来等待父进程的青睐,父进程得到想要的信息之后再告诉内核你可以回收子进程的id及其残余信息,子进程得以真正的销毁了。
注意,僵尸进程也是一种进程,其还是会占用pid,而pid是一种很珍贵的资源,如果父进程不能及时调用wait类函数处理,其会一直占用,最终可能导致我们耗尽进程资源
相关文章推荐
- 设计一个模块,功能是列出系统中所有内核线程的程序名、PID号和进程状态。
- Linux进程 (Linux内核设计与实现学习笔记)
- Linux内核设计与实现(三) linux进程管理 之 概述
- 把握linux内核设计思想(九):进程调度
- Linux内核设计第六周学习总结 分析Linux内核创建一个新进程的过程
- Linux内核设计与实现-进程管理与进程调度
- 为什么fork()2次会避免产生僵尸进程
- 僵尸进程学习 & 进程状态列表 & Linux信号学习
- 读薄「Linux 内核设计与实现」(2) - 进程管理和调度
- 为什么MVC不是一种设计模式(转)
- <<Linux内核的设计与实现>>读书笔记(三)-Linux的进程
- 为什么MVC不是一种设计模式?
- 每日阅读3之内核设计与实现(第三版)4.5——linux调度实现之进程选择
- windows内核状态下进程创建解析
- 为什么MVC不是一种设计模式
- 把握linux内核设计思想(十三):内存管理之进程地址空间
- 进程有哪几种基本状态,在一个系统中为什么必须区分出这几种状态?
- 线程分离状态与僵尸进程
- 编程的真正奥义在于,把人类的思维、设计、语言、逻辑和精神创造以一种计算机可以识别和储存的方式记录下来。
- 【Linxu内核设计与实现】-第4章 进程调度