僵尸進程
僵尸進程產(chǎn)生原因:運行一個程序的時候會產(chǎn)生一個父進程和多個子進程,所有這些子進程都會消耗內(nèi)核分配的內(nèi)存和cpu資源裆泳,當子進程執(zhí)行完成后會發(fā)送一個Exit信號然后死掉,這個Exit信號需要被父進程讀取到叽掘,父進程需要隨后調(diào)用wait命令讀取子進程的退出狀態(tài)--若父進程正確讀取了子進程的退出信號蚣抗,則該子進程會從進程表中刪掉;如果父進程未能讀取到子進程的退出信號癌瘾,則盡管該子進程已經(jīng)完成執(zhí)行處于死亡的狀態(tài)觅丰,但是該進程仍然不會從進程表中刪掉;
僵尸進程是否有害處:
其實僵尸進程并不會做對系統(tǒng)有害的事情妨退,僵尸進程不會使用任何資源也不會影響其他進程妇萄,因此存在僵尸進程也不會有什么明顯的壞處;但是因為僵尸進程的退出狀態(tài)以及一些其它的進程信息都會存儲在內(nèi)存中咬荷,因此如果僵尸進程數(shù)量過多冠句,有時也會存在問題:
linux提供了一種機制來保證父進程能夠知道子進程結(jié)束的狀態(tài)信息:在每個子進程退出的時候,內(nèi)核都會釋放所有的資源幸乒,如打開的文件懦底、占用的內(nèi)存等,但是一些信息仍然會保留(進程號PID罕扎、退出狀態(tài)聚唐、運行時間等),這些信息直到父進程通過wait來獲取時才會釋放
這樣的問題是:如果父進程不調(diào)用wait獲取腔召,那么進程號PID杆查、退出狀態(tài)、運行時間等信息就不會釋放臀蛛;而系統(tǒng)所能使用的PID進程號是有限的根灯,如果大量產(chǎn)生僵尸進程,就無法繼續(xù)創(chuàng)建新的進程;
孤兒進程
當父進程以及運行完退出烙肺,而它的子進程還在運行纳猪,這些子進程就會成為孤兒進程;孤兒進程會被init進程收養(yǎng)桃笙,因為有init進程循環(huán)的wait回收資源氏堤,因此孤兒進程沒有什么危害;