僵尸进程

对比僵尸进程和孤儿进程的概念:

什么是僵尸进程?

僵尸进程是由于子进程先于父进程挂掉的一种状态。

什么是孤儿进程?

孤儿进程是一个父进程在调用wait()或者waitpid()之前就已经退出的子进程。此时init进程成为子进程的父进程。
此时init进程为子进程收集退出状态,从而避免出现僵死进程。

僵尸进程有什么影响?

由于父进程调用fork()函数,子进程就分配了一个进程的数据结构来维护这个子进程,但是当子进程挂掉之后父进程如果不处理这个数据结构,那么就会一直存活在内存中,所以影响就是消耗不必要的内存。

如果子进程成为僵尸进程:
1. 他的PID还占据着,意味着海量的子进程会占据满进程表项,会使后来的进程无法fork.
2. 他的内核栈无法被释放掉(1K 或者 2K大小),为啥会留着他的内核栈,因为在栈的最低端,有着thread_info结构,它包含着 struct_task 结构,这里面包含着一些退出信息。

代码中如何体现僵尸进程?

在子进程中返回,而父进程中不做处理,就是产生了僵尸进程。具体代码如下:

if( child == -1 ) { //error
    perror("\nfork child error.");
    exit(0);
} else if(child == 0){
   cout << "\nIm in child process:" <<  getpid() << endl;
   exit(0);
} else {
   cout << "\nIm in parent process."  << endl;
   sleep(600);
}

如何避免僵尸进程?

在父进程中调用wait()或者waitpid()方法。

int status;
if( child == -1 ) { //error
    perror("\nfork child error.");
    exit(0);
} else if(child == 0){
   cout << "\nIm in child process:" <<  getpid() << endl;
   exit(0);
} else {
   cout << "\nIm in parent process."  << endl;
   wait(&status);
}

为什么wait()方法可以解决僵死进程问题?

Linux man:
wait for state changes in a child of the calling process, and obtain information about the child whose state has changed.
等待子进程的状态变化,并获取相关信息。

The wait() system call suspends execution of the calling process until one of its children terminates.
父进程调用wait时,并没有对子进程做什么,它仅表示我关心子进程的状态变迁,并将自己切入到睡眠状态(暂停自己)。当子进程退出时,父进程被唤醒,通过wait返回值,父进程可以知道子进程退出原因。

具体原因:

父进程健在而没调用wait等待,则父进程无法知道子进程的状态,无法为子进程收尸,子进程没人收尸就变僵尸了。
所以wait等待子进程的状态变化,并获取相关信息,而收尸的是父进程不是wait

系统中查看僵尸进程显示什么?

后面显示defunct字样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值