面试中常被问到的(18)父子进程,孤儿进程及僵尸进程
Posted AllenSquirrel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中常被问到的(18)父子进程,孤儿进程及僵尸进程相关的知识,希望对你有一定的参考价值。
并发:
单核cpu多任务,宏观同一段时间内表现出同时运行,微观上实际为时间片轮转,同一时刻只能有一个进程占据cpu资源运行,多个任务执行存在先后顺序
并行:
多核cpu多任务,严格物理意义上的同时运行,多个任务运行在不同核上,相互之间不影响
(1)父子进程
子进程通过父进程创建,子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程什么时候结束。
当子进程退出的时候,内核会释放子进程所有资源,包括打开的文件,占用的内存等。但是依然会保留部分信息(进程id,退出状态,运行时间),直到父进程通过wait/waitpid来调用获取子进程状态信息后才释放
(2)孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程,孤儿进程将被init进程(1号进程)托管,由init进程负责完成状态收集工作
(3)僵尸进程
子进程通过父进程创建,子进程退出,父进程没有调用wait/waitpid获取子进程状态,则子进程的进程描述符依然保存在系统中,形成僵尸进程
子进程结束后,父进程没来及调用wait/waitpid,会进入僵尸进程,如果父进程及时调用,子进程会从僵尸进程退出,但这个过程中也会经过僵尸进程
如果父进程在子进程结束之前退出,则子进程由init接管。init将会以父进程身份对僵尸状态的子进程进行处理
产生危害:资源泄漏(一种是pcb所占内存资源一直无法被回收,一种是一个用户所能创建的进程数量是有限制的,没有可用的进程号将导致系统不能产生新的进程)
解决方案:
处理:退出父进程
(1)内部fork两次,子进程变成孤儿进程,父进程由init进程担任实现托管
(2)外部通过kill指令消灭产生僵尸子进程的进程,使其变成孤儿进程,init托管
避免:进程等待,信号处理函数wait接收子进程退出时向父进程发送的SIGCHILD信号
以上是关于面试中常被问到的(18)父子进程,孤儿进程及僵尸进程的主要内容,如果未能解决你的问题,请参考以下文章