曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5955|回复: 0
打印 上一主题 下一主题

僵尸进程

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-3-6 01:13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
僵尸,顾名思义就是死了的,但似乎又没死绝,比如还能保留着个肉身,如果真的有法力高强的法师,那就会像电影上那样一蹦一跳的。

僵尸进程,一样的意思,说明这个进程已经死亡,但是它却像僵尸一样仍然以某种方式活着。说它死了,是因为其资源(内存、外设连接等等)已经被释放,它们也就绝不会再次运行起来;说它们还活着,是因为进程表中仍然有它们对应的表项(不像普通的人死了,就灰飞烟灭,成了僵尸说明还有个肉身,这个肉身就相当于这个表项)。

僵尸的产生
在 UNIX 或 Linux 下,
如果另外一个程序或用户发送 SIGTERM 或 SIGKILL 信号会导致一个进程被杀死,这等价于进程的正常终止。
如果一个进程的父进程在子进程终止前已经调用或子进程终止后调用 wait4 (wait for) 系统调用,则相当于向内核证实父进程已经确认子进程的终结,这时内核可以释放为子进程保留的资源。

假如子进程终止而父进程没有调用 wait4 时,就会出现僵尸进程的情况,也就是死亡的子进程没有了父亲为其收尸。这样,僵尸进程可能稳定的寄身于进程表中,直至下一次系统启动。使用 PS 命令可以看到处于 Z (僵尸zombie)状态的僵尸进程。由于残余的数据在内核中占用极少空间,所以构不成什么大问题。

如果一个进程的父进程先于子进程死亡,那么这个子进程将被 init 进程领养。这里有一个问题时,一个由 init 进程领养的进程终止时它会不会变成一个僵尸进程?答案是“否定”的。因为 init 被编写成无论何时只要一个子进程终止,init 就会调用一个 wait() 函数取得其终止状态,这样也就防止了系统中可能会产生许多的僵尸进程。

当说到 “一个 init 的子进程” 时,这可能指的是由 init 直接产生的进程,也可能是其父进程已终止,由 init 领养的进程。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 08:30 , Processed in 0.063335 second(s), 30 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表