進程什么時候會休眠

早上剛到工作崗位上,旁邊的博士小姐姐就向我請教問題,是關于多進程的問題。

她用python寫了一個多進程的程序,讀取兩萬個文件做分析,然后寫到兩萬個結果文件里。我大概了解了一下情況,并沒仔細看代碼,帶著身上由于爬了12層樓還冒著熱氣的身體,我就奔過去立在了顯示器前。

現在的問題是,她這個程序運行了一段時間后,就全部休眠了,然后她看結果也只跑了一半,所以她想知道程序怎么才可以繼續運行。

我通過ps查看了一下,果然50多個進程全是休眠狀態。我一開始也不知道為何這些進程會休眠,能想到的最直接原因是程序里使用了sleep函數,不過我仔細讀了一下代碼,發現就是調用了pandas讀取和寫入文件,沒做任何多余操作。

一下子陷入了尷尬。我又仔細看了下python的進程,發現居然有一百多個僵尸進程,分別是前天和昨天的。她告訴我,同樣的代碼,之前都可以運行,今天突然就不行了。我當時并不太清楚僵尸進程產生的原因,所以無法解釋。

只能去看啟動腳本,我發現她只用了nohup,所以想加個&放在后臺運行,結果改完腳本之后一保存,居然報錯了。小姐姐立馬反應過來,說這是硬盤空間不夠了。

我立馬反應過來,告訴她,我知道你的程序為什么會休眠了!就是因為沒有硬盤空間了,導致寫文件的IO阻塞了,所以進程休眠了。

我如釋重負,迅速撤下戰場,開始反思。這么簡單的問題,我居然只能偶然發現,花了半個小時無謂的排查。我迅速Google的一下僵尸進程產生的原因,發現是由于子進程已經結束,但是父進程并未讀取其結束狀態,導致其雖然不占用資源,但是還占用著進程標識符位置,沒有人來為其收尸。看起來是程序問題,所以我套在今天這個場景里,因為這是用的python的multi processing模塊,和原生c語言差遠了,但是也可以知道其子進程的exit狀態確實不被父進程所接收,而由于某種原因,父進程一直沒退出,所以僵尸了。

還有一個問題就是,有哪些情況會讓進程限入休眠狀態?

至少,在沒有使用CPU時一般都是處于休眠,比如IO的等待之類的被動讓出CPU,和程序主動讓出CPU。

另外就是,以為自己很清楚的概念,在給別人解釋時,卻突然啞語了。小姐姐突然問: 進程和線程有什么區別?你怎么用最簡潔的語言解釋清楚呢?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。