什么是僵尸进程(状态)?什么是孤儿进程?各自有什么危害?如何解决?
僵尸进程
形成原因
僵死状态(Zombies)是一个比较特殊的状态;
当子进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程;
僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
总的来说:子进程退出,父进程还在运行,父进程没有读取子进程状态,子进程进入僵尸状态(Z状态)
危害
1、维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,僵尸状态一直不退出,PCB一直都要维护
2、假设一个父进程创建很多子进程不回收,会造成内存资源浪费
3、会造成内存泄漏
解决方案
进程等待---wait函数和waitpid函数
wait函数
创建一个子进程,子进程正常逻辑,父进程调用wait函数来进行等待,当子进程退出的时候,由于父进程在等待,所以子进程就不会变成僵尸进程
父进程一开始调用wait函数,就会阻塞在wait函数中,等待子进程
直到子进程退出,wait函数调用才返回,父进程接着执行wait函数之后的代码
孤儿进程
形成原因
父进程先于子进程退出,子进程会被1号进程领养(1号进程称init进程)
1号进程会在子进程退出的时候,回收子进程的退出信息,防止子进程变成僵尸进程
危害
没什么危害,因为该进程只是父进程换成了init进程,依然可以正常运行