轉(zhuǎn)載:僵尸進程與孤兒進程

轉(zhuǎn)載:https://www.cnblogs.com/Anker/p/3271773.html

1钾军、前言

  之前在看《unix環(huán)境高級編程》第八章進程時候斜脂,提到孤兒進程和僵尸進程求晶,一直對這兩個概念比較模糊手负。今天被人問到什么是孤兒進程和僵尸進程某弦,會帶來什么問題,怎么解決涣觉,我只停留在概念上面联喘,沒有深入,倍感慚愧载庭。晚上回來google了一下看彼,再次參考APUE,認真總結(jié)一下昧捷,加深理解闲昭。

2、基本概念

我們知道在unix/linux中靡挥,正常情況下序矩,子進程是通過父進程創(chuàng)建的,子進程在創(chuàng)建新的進程跋破。子進程的結(jié)束和父進程的運行是一個異步過程,即父進程永遠無法預(yù)測子進程 到底什么時候結(jié)束簸淀。當一個 進程完成它的工作終止之后,它的父進程需要調(diào)用wait()或者waitpid()系統(tǒng)調(diào)用取得子進程的終止狀態(tài)毒返。

  孤兒進程:一個父進程退出租幕,而它的一個或多個子進程還在運行,那么那些子進程將成為孤兒進程拧簸。孤兒進程將被init進程(進程號為1)所收養(yǎng)劲绪,并由init進程對它們完成狀態(tài)收集工作。

  僵尸進程:一個進程使用fork創(chuàng)建子進程盆赤,如果子進程退出贾富,而父進程并沒有調(diào)用wait或waitpid獲取子進程的狀態(tài)信息,那么子進程的進程描述符仍然保存在系統(tǒng)中牺六。這種進程稱之為僵死進程颤枪。

3、問題及危害

unix提供了一種機制可以保證只要父進程想知道子進程結(jié)束時的狀態(tài)信息淑际, 就可以得到畏纲。這種機制就是: 在每個進程退出的時候,內(nèi)核釋放該進程所有的資源,包括打開的文件,占用的內(nèi)存等扇住。 但是仍然為其保留一定的信息(包括進程號the process ID,退出狀態(tài)the termination status of the process,運行時間the amount of CPU time taken by the process等)。直到父進程通過wait / waitpid來取時才釋放盗胀。 但這樣就導(dǎo)致了問題艘蹋,如果進程不調(diào)用wait / waitpid的話,?那么保留的那段信息就不會釋放票灰,其進程號就會一直被占用簿训,但是系統(tǒng)所能使用的進程號是有限的,如果大量的產(chǎn)生僵死進程米间,將因為沒有可用的進程號而導(dǎo)致系統(tǒng)不能產(chǎn)生新的進程. 此即為僵尸進程的危害,應(yīng)當避免膘侮。

孤兒進程是沒有父進程的進程屈糊,孤兒進程這個重任就落到了init進程身上,init進程就好像是一個民政局琼了,專門負責(zé)處理孤兒進程的善后工作逻锐。每當出現(xiàn)一個孤兒進程的時候,內(nèi)核就把孤 兒進程的父進程設(shè)置為init雕薪,而init進程會循環(huán)地wait()它的已經(jīng)退出的子進程昧诱。這樣,當一個孤兒進程凄涼地結(jié)束了其生命周期的時候所袁,init進程就會代表黨和政府出面處理它的一切善后工作盏档。因此孤兒進程并不會有什么危害。

任何一個子進程(init除外)在exit()之后燥爷,并非馬上就消失掉蜈亩,而是留下一個稱為僵尸進程(Zombie)的數(shù)據(jù)結(jié)構(gòu),等待父進程處理前翎。這是每個 子進程在結(jié)束時都要經(jīng)過的階段稚配。如果子進程在exit()之后,父進程沒有來得及處理港华,這時用ps命令就能看到子進程的狀態(tài)是“Z”道川。如果父進程能及時 處理,可能用ps命令就來不及看到子進程的僵尸狀態(tài)立宜,但這并不等于子進程不經(jīng)過僵尸狀態(tài)冒萄。 ?如果父進程在子進程結(jié)束之前退出,則子進程將由init接管赘理。init將會以父進程的身份對僵尸狀態(tài)的子進程進行處理宦言。

  僵尸進程危害場景:

  例如有個進程,它定期的產(chǎn) 生一個子進程商模,這個子進程需要做的事情很少奠旺,做完它該做的事情之后就退出了蜘澜,因此這個子進程的生命周期很短,但是响疚,父進程只管生成新的子進程鄙信,至于子進程 退出之后的事情,則一概不聞不問忿晕,這樣装诡,系統(tǒng)運行上一段時間之后,系統(tǒng)中就會存在很多的僵死進程践盼,倘若用ps命令查看的話鸦采,就會看到很多狀態(tài)為Z的進程。 嚴格地來說咕幻,僵死進程并不是問題的根源渔伯,罪魁禍首是產(chǎn)生出大量僵死進程的那個父進程。因此肄程,當我們尋求如何消滅系統(tǒng)中大量的僵死進程時锣吼,答案就是把產(chǎn)生大 量僵死進程的那個元兇槍斃掉(也就是通過kill發(fā)送SIGTERM或者SIGKILL信號啦)。槍斃了元兇進程之后蓝厌,它產(chǎn)生的僵死進程就變成了孤兒進 程玄叠,這些孤兒進程會被init進程接管,init進程會wait()這些孤兒進程拓提,釋放它們占用的系統(tǒng)進程表中的資源读恃,這樣,這些已經(jīng)僵死的孤兒進程 就能瞑目而去了崎苗。

3狐粱、僵尸進程解決辦法

(1)通過信號機制

子進程退出時向父進程發(fā)送SIGCHILD信號,父進程處理SIGCHILD信號胆数。在信號處理函數(shù)中調(diào)用wait進行處理僵尸進程肌蜻。

(2)fork兩次

  《Unix 環(huán)境高級編程》8.6節(jié)說的非常詳細。原理是將子進程成為孤兒進程必尼,從而其的父進程變?yōu)閕nit進程蒋搜,通過init進程可以處理僵尸進程。測試程序如下所示:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末判莉,一起剝皮案震驚了整個濱河市豆挽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌券盅,老刑警劉巖帮哈,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锰镀,居然都是意外死亡娘侍,警方通過查閱死者的電腦和手機咖刃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憾筏,“玉大人嚎杨,你說我怎么就攤上這事⊙跹” “怎么了枫浙?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長古拴。 經(jīng)常有香客問我箩帚,道長,這世上最難降的妖魔是什么黄痪? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任膏潮,我火速辦了婚禮,結(jié)果婚禮上满力,老公的妹妹穿的比我還像新娘。我一直安慰自己轻纪,他們只是感情好油额,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刻帚,像睡著了一般潦嘶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上崇众,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天掂僵,我揣著相機與錄音,去河邊找鬼顷歌。 笑死锰蓬,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的眯漩。 我是一名探鬼主播芹扭,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赦抖!你這毒婦竟也來了舱卡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤队萤,失蹤者是張志新(化名)和其女友劉穎轮锥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體要尔,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡舍杜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年新娜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝴簇。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡杯活,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熬词,到底是詐尸還是另有隱情旁钧,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布互拾,位于F島的核電站歪今,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏颜矿。R本人自食惡果不足惜寄猩,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骑疆。 院中可真熱鬧田篇,春花似錦、人聲如沸箍铭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诈火。三九已至兽赁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冷守,已是汗流浹背刀崖。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拍摇,地道東北人亮钦。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像充活,于是被迫代替她去往敵國和親或悲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:http://www.cnblogs.com/Anker/p/3271773.html 1堪唐、前言 之前在看《...
    Daniel521閱讀 373評論 0 1
  • 基本概念 我們知道在unix/linux中巡语,正常情況下,子進程是通過父進程創(chuàng)建的淮菠,子進程在創(chuàng)建新的進程男公。子進程的結(jié)...
    01_小小魚_01閱讀 304評論 0 0
  • [TOC] 參考資料 Linux 之守護進程枢赔、僵死進程與孤兒進程【概述】-Linux內(nèi)核三駕馬車之-進程管理【Li...
    GOGOYAO閱讀 4,152評論 0 0
  • 我們知道在unix/linux中澄阳,子進程的結(jié)束和父進程的運行是一個異步過程, 當一個進程完成它的工作終止之后,它的...
    丶Em1tu0F閱讀 881評論 0 3
  • 在《unix環(huán)境高級編程》中有提到僵尸進程和孤兒進程踏拜。不少同學(xué)對這兩個概念會混淆碎赢,這篇文章總結(jié)一下。 在 unix...
    稀飯不加糖C閱讀 2,200評論 1 2