僵尸进程和孤儿进程
一、僵尸进程
1、僵尸进程的引出
我们用小故事引出僵尸进程,从前有一个地主,他是一个守财奴,可有一天却暴毙于家中,府中的丫鬟发现后报官,知府中的捕快来到现场第一件事就是封锁现场,不让任何闲杂人入内,然后知府大人、捕快们入内勘察线索,来判断地主是死于他杀还是意外死亡,该怎么判断呢?通过现场留下的证据,以及地主体内器官、皮肤表面各种状态来进行分析判断。换一种情况,如果地主死后,府里的仆人们立马将案发现场收拾干净,将死者尸体入棺埋葬,此时再报案,衙门还能得出地主死亡的原因吗?–不能!只有捕快勘察现场,将死者进行分析后,其他人才能清理现场。
上面的故事中,我们封锁现场,并采集证据的时候,死者此时是不能被移走或者清理的,此时死者就是处于僵尸状态。只有当我们采集完证据后才能清理现场,此时才算退出状态。
图一:proc.c |
图二:运行结果及退出码 |
图一:proc.c |
图二:运行结果及退出码 |
观察上方两个不同的代码,对应输出结果和退出码信息也在图中,我们发现,针对不同的情况,main函数返回给操作系统的退出码是不同的,其中0就代表进程正常结束,136则表明进程异常退出。
2、模拟僵尸进程
在下面的代码中,我们调用系统函数fork(),创建子进程之后,子进程会跑5秒钟,父进程一直在运行,子进程在5秒后退出,我们创建子进程就是让其帮我们去做某些事情的,但是子进程运行的怎么样,父进程是不知道的,父进程压根没管,所以就相当于子进程已经退出,父进程并不进行相关的状态询问,此时子进程虽然已经结束了,但是要一直维持一种状态—僵尸状态。
图一:ZState.c |
图二:脚本查看进程状态 |
我们发现,
当子进程结束的时候,其进程状态由S+变为Z+,这个状态就是僵尸状态。
3、总结
3.1 僵尸进程概念
僵尸状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程,僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。关于父进程如何读取子进程的退出状态,我们后面再将。
3.2 僵尸进程危害
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就必须一直处于Z状态!
但是维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB就要一直维护!
那一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费!!因为数据结构对象本身就要占用内存。
二、孤儿进程
Linux系统中,进程之间的关系主要是符字关系,我们的僵尸进程就是父子进程之间,因为子进程退出,父进程不管他了,此时子进程就是僵尸进程。 我们的孤儿进程同样也是描述父子进程关系的。
1、孤儿进程概念
2、模拟孤儿进程
图一:程序代码 |
图二:运行结果 |
3、总结

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209483.html原文链接:https://javaforall.net
