僵死進程的意義

看了很多關於僵死進程的目的,都沒有一個形象化的解釋,這裏結合自己個人的經驗,來說明一下個人的理解。


我們假設根本不存在僵死進程,那麼會發生什麼?我們來進行一個CASE設計:

父進程記錄所有子進程的pid記錄下來,後來父進程需要查看某個子進程的信息,這裏我們只能通過該子進程pid來獲取進程信息,可是,如果沒有僵死進程,我們能否判定這個pid是個有效的pid?

這就是一個很典型的異步問題。我們知道進程的終止是可以自我控制的(當然也可以有一些內核發送的信號指令控制),基於此,我們可以有如下的情況:

a.子進程還沒有終止,父進程通過查看pid得到該子進程的信息,正常

b.子進程已經終止,pid還沒有分配給其他進程,父進程通過查看pid得到該子進程的信息,錯誤

c.子進程已經終止,pid分配給了其他進程,父進程通過查看pid得到該子進程的信息,錯誤(此時的pid所指向的進程可能已經不是父進程的子進程)


從上面的分析可以看出,如果我們僅僅終止子進程,而沒有通知父進程,可能會產生b和c的錯誤,從c可以看出,如果我們暫時不保留此pid,該pid可能會被重新分配。所以,這就是僵死進程存在的意義,另外,這是一個異步的問題,操作系統如何通知父進程呢?這裏我們就有了一個信號的概念。


操作系統通過發送SIGCHLD信號告知父進程,有個子進程已經終止了,這時候父進程可以通過waitpid(wait)來獲得這個終止子進程的pid,另外這個函數可以真正釋放子進程的pid資源,供操作系統重新分配。信號的處理可以通過信號處理函數來實現(詳細參考《unix網絡編程》第三版第五章)


------------------------------------------------------------------------------------------------------------------------------------------------------------


之所以僵死進程的理解出現了問題,其實有個本質的問題,這一系列的動作是一個異步操作。我們說個類似的同步操作,這個操作比較容易理解(基於C語言的知識)。

我們給一個指針變量申請空間,然後釋放這個指針變量,並且將這個指針變量設置成nullptr。這樣我們就可以正常使用的這個指針變量了,我們的操作是這樣的:

a.如果指針變量是nullptr,我們重新申請空間(或者不用釋放該指針變量的空間)

b.如果指針變量是非nullptr,我們可以直接使用該變量(或者釋放該指針變量的空間)


這個操作是一個同步的操作,我們隨時可以在一個進程查看這個指針變量是不是nullptr。其實僵死進程就類似於我們釋放了指針變量的空間,但是,我們還沒有把該變量設置成nullptr值。


從上面的類比我們發現,對於計算機上的概念,我們要找尋雷同的部分,因爲,計算模型其實就那麼多,如果能做類似比較,我們理解起來會比較容易。還有一個高級抽象,我們下面會說。


---------------------------------------------------------------------------------------------------------------------------------------------------------------


計算機的計算模型大部分是基於空間和時間來考慮的。僵死進程唯一佔用的空間是pid空間,這個空間如果不能合理的應用就會造成浪費,之所以保留這個空間,是爲了讓父進程感知子進程已經終止這個行爲。時間方面,這個感知過程是一個異步的過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章