OP1
Q: 什么是孤兒進(jìn)程(orphan process),什么是僵尸進(jìn)程(zombie process)?
** A:** 孤兒進(jìn)程指的是父進(jìn)程退出后仍在運(yùn)行的子進(jìn)程,可能不止一個(gè)。僵尸進(jìn)程指的是已經(jīng)運(yùn)行結(jié)束(即已經(jīng)向父進(jìn)程報(bào)告exit狀態(tài)),但由于某種原因,進(jìn)程描述符(PID)仍然處于進(jìn)程列表中,PID無(wú)法被回收重用的進(jìn)程。
OP2
Q: Linux是如何應(yīng)對(duì)孤兒進(jìn)程和僵尸進(jìn)程的?管理員需要如何處理這兩種進(jìn)程?
** A:** 孤兒進(jìn)程一旦出現(xiàn),kernel的init進(jìn)程就會(huì)成為它們的父進(jìn)程,init會(huì)輪詢每個(gè)進(jìn)程的狀態(tài),并完成資源清理等善后工作。由于kernel會(huì)很好地處理孤兒進(jìn)程,而且即便管理員強(qiáng)行殺死某個(gè)已經(jīng)被init收養(yǎng)了的孤兒進(jìn)程,init也會(huì)完成善后工作,所以,在不考慮程序本身邏輯的層面上,孤兒進(jìn)程不存在需要管理員出面解決的危害。
而僵尸進(jìn)程的存在會(huì)使得一個(gè)PID無(wú)法被復(fù)用,當(dāng)PID超過(guò)上限(通常是32767,這個(gè)值可以更改)時(shí),系統(tǒng)將無(wú)法為新進(jìn)程分配PID,這就導(dǎo)致無(wú)法創(chuàng)建新進(jìn)程。而且大量僵尸進(jìn)程會(huì)填滿你的進(jìn)程列表,讓你無(wú)法進(jìn)行正常的管理。每一個(gè)進(jìn)程在結(jié)束(發(fā)送exit狀態(tài))后,不會(huì)馬上消失,而是都會(huì)處于僵尸狀態(tài),等待父進(jìn)程進(jìn)行資源清理和信息收集。出現(xiàn)僵尸進(jìn)程堆積的根本原因是,父進(jìn)程沒(méi)有在收到exit后及時(shí)對(duì)子進(jìn)程進(jìn)行處理。所以,想終結(jié)僵尸進(jìn)程,只需要?dú)⑺栏高M(jìn)程,使得子進(jìn)程成為孤兒進(jìn)程,就可以由init進(jìn)程進(jìn)行善后。
在編程時(shí),通常通過(guò)waitpid來(lái)處理子進(jìn)程的SIGCHILD信號(hào),也可以對(duì)子進(jìn)程進(jìn)行兩次fork,這樣,在第一層子進(jìn)程結(jié)束后,第二層子進(jìn)程就會(huì)成為孤兒進(jìn)程,可以由init進(jìn)行善后工作。