task_struct结构体及僵尸、孤儿进程

来源:互联网 发布:如何清理淘宝缓存 编辑:程序博客网 时间:2024/05/29 14:51

为了管理进程,操作系统必须对每个进程所做的事情进行清楚地描述,为此,操作系统使用数据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块(PCB)。
在Linux中就是task_struct结构
这里写图片描述
Linux中的进程可以分有多种状态:
R(runing):运行状态
S(sleeping):浅度睡眠状态
D(disk sleep):磁盘睡眠状态
T(stopped):停止进程
X(dead):死亡状态
Z(zombie):僵尸状态
僵死状态(Zombies)是⼀一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调 用)没有读取到子进程退出的返回代码时就会产⽣生僵死进程。僵死进程会以终止状态保持 在进程表中,并且会一直在等待父进程读取退出状态代码。
僵⼫进程:⼀一个子进程在其父进程没有调用wait()或waitpid()的情况下退出。这个子进程就 是僵尸进程。如果其父进程还存在而⼀一直不调⽤用wait,则该僵尸进程将无法回收,等到其父 进程退出后该进程将被init回收。
这里写图片描述
运行结果
这里写图片描述
进程 的退出状态必须维持下去,父进程如果一直不读取,进程就一直处在Z状态,Z状态一直不退出,PCB需要一直维护下去,如果一个父进程创建了很多子进程,不收回会造成内存浪费,数据结构本身会占用内存 ,那么会不会造成内存泄漏呢,如何避免这些呢,我们会在之后提到
孤儿进程
一个父进程退出,而它的⼀一个或多个⼦子进程还在运行,那么那些子进程将成为 孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工 作。
这里写图片描述
执行结果
这里写图片描述
孤儿进程并不会造成什么危害。
僵尸进程与孤儿进程的区别:
孤儿进程是子进程还在运行,而父进程挂了,子进程被init进程收养。僵尸进程是父进程还在运行但是子进程挂了,父进程却没有使用wait来清理子进程的进程信息,导致子进程虽然运行实体已经消失,但是仍然在内核的进程表中占据一条记录,这样长期下去对于系统资源是一个浪费。僵尸进程将会导致资源浪费,而孤儿则不会。

原创粉丝点击