Linux 进程环境 ---- 僵尸进程、孤儿进程

僵尸进程产生的原因:
    在UNIX系统中,一个进程结束了,但是他的父进程没有等待(调用wait/waitpid)他,那么他将变成一个僵尸进程。僵尸进程是一个早已死亡的进程,但在进程表(process table)中仍占一个位置。


僵尸进程查看方式:
    1、通过top命令查看zombie字段,能显示僵尸进程的个数
    2、通过ps aux/-ef 参数查看僵尸进程的具体信息,带有defunct字段的都是僵尸进程或者进程状态为Z+进程


僵尸进程的回收方式:
    1、当父进程退出后,子进程会变成孤儿进程,此时他会被一个管理进程收养,这个管理进程不太一样,早期一般是init进程,Ubuntu上是upstart,还有近来的Sytemd,但是他们都有一个任务,就是wait()这些孤儿进程,冰最终释放他们占用的系统进程表中的资源。这样这些已经僵死的孤儿进程就彻底被清除了
    2、僵尸进程的产生是因为父进程没有wait()/waitpid()子进程,所以如果我们自己写程序的话一定要在父进程中通过wait()/waitpid()来避免僵尸进程的产生。
    3、当系统中出现僵尸进程时,我们是无法通过kill命令把它清除掉的,但是我们可以杀死他们的父进程,让他变成孤儿进程,并进一步被系统中的管理孤儿进程的进程收养并清除。


僵尸进程的危害:
    1、在进程退出的时候,内核释放该进程的所有资源,包括打开的文件,占用的内存等,但是仍然为其保留了一定的信息(包括进程PID,退出状态 the termination status of the process ,运行时间 the amount of CPU time taken by the process等)。直到父进程通过wait()/waitpid()来收取才释放。如果父进程不收取的话,那么那段信息就不会被释放,进程号一直会被占用,但是系统所能使用的进程号是有限的,如果有大量的僵尸进程产生,将会占用所有的进程号,导致系统无法产生新的进程。


孤儿进程:
    一个父进程退出,而他的一个或多个子进程还在运行,那么这些进程将变成孤儿进程。孤儿进程将会被init进程(进程号为1)的进程所收养,并由init进程对他们完成状态收集工作。因此init进程并不会有什么危害。


其他:
    #include <sys/wait.h>
    pid_t wait(int *statloc);
    pid_t waitpid(pit_t pid, int *statloc, int options);
    wait/waitpid的作用:返回已经终止的子进程的进程ID,并清除僵尸进程
    wait/waitpid的区别:wait()会阻塞猪调用它的父进程,直到该父进程的第一个子进程终止
    waitpid()则可以通过设置一个选项来设置为非阻塞,另外,waitpid并不是等待第一个结束的子进程,而是等待参数中pid指定的进程。
    waitpid中的pid含义:
    pid == -1 等待任意一个子进程,此时waitpid的作用和wait相同
    pid > 0 等待进程ID与pid相同的子进程
    pid == 0 等待与调用者进程组ID相同的任意子进程
    pid < -1 等待进程组ID与PID绝对值相等的任意子进程
    
    waitpid的statloc参数含义:
    高8位记录子进程退出的状态码((statloc >> 8)&0xff),低8位记录子进程退出时是否收到信号,信号是多少(statloc & 0xff)

 

以上知识点均摘抄自网络,如若侵权,请私信联系删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值