深入分析父子線程、進程終止順序不同產(chǎn)生的結(jié)果
Linux下編程,線程、進程退出順序問題紛紛擾擾,如果父進程/線程先于子進程/線程終止,系統(tǒng)會做什么處理呢?反之,如果子進程/線程先于父進程/線程終止,系統(tǒng)又會做什么處理呢?下面是我個人平時在筆記上做的一些象征性的總結(jié),如果有疑問之處,大可提出,我一直認為懷疑是人類進步的根本所在。
一、線程
Linux線程創(chuàng)建函數(shù)為pthread_create(),默認規(guī)則是誰創(chuàng)建子線程,誰就要負責子線程的資源回收,當父線程退出后,子線程也隨著退出。所以,一般情況下,父線程退出時都要確保子線程已經(jīng)退出,所以會使用pthread_join()函數(shù)阻塞等待子線程的退出信號/標識。
pthread_detach(threadid)函數(shù)的功能是使線程ID為threadid的線程處于分離狀態(tài)(可以為非父子關(guān)系),一旦線程處于分離狀態(tài),該線程終止時底層資源立即被回收;否則終止子線程的狀態(tài)會一直保存占用系統(tǒng)的資源直到主線程調(diào)用pthread_join(threadid,NULL)獲取線程的退出狀態(tài)。被創(chuàng)建的子線程也可以自己分離自己,子線程調(diào)用pthread_detach(pthread_self())就是分離自己,因為pthread_self()這個函數(shù)返回的就是自己本身的線程ID。
1)父線程先于子線程終止
父線程先于子線程,則子線程為異常退出 ,那肯定沒有使用阻塞非分離函數(shù)pthread_join,分2種情況:
a)子線程已與父線程分離,如調(diào)用線程分離函數(shù)pthread_detach,則資源被自動回收釋放。
b)子線程未與父線程分離,則資源無法釋放,造成了資源浪費和系統(tǒng)臃腫(這種情況,我看有些資料上說系統(tǒng)也能自動釋放子線程的資源,如關(guān)閉描述符,釋放內(nèi)存空間等等,但個人做過一些測試,比如在子線程中分配很多空間等,進程退出后,top查看內(nèi)存狀態(tài)時還存在)。
2)子線程先于父線程終止
也分2種情況:
a)正常情況:子線程調(diào)用了線程分離函數(shù)ptread_detach(),或父線程調(diào)用了等待線程結(jié)束函數(shù)pthread_join()。
b)異常情況:如果上面二者都為調(diào)用,則為子線程分配的資源無法得到釋放。
二、進程
一個現(xiàn)有進程可以調(diào)用fork函數(shù)創(chuàng)建一個新進程。由fork創(chuàng)建的新進程被稱為子進程(child process)。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進程中返回0值而父進程中返回子進程ID。
1)父進程先于子進程終止
當父進程先退出時,系統(tǒng)會讓init進程接管子進程,該子線程成為了孤兒進程。
2)子進程先于父進程終止
分為2種情況:
a)正常情況:父進程調(diào)用了wait函數(shù) (非父子進程則用waitpid函數(shù)),此時父進程會等待子進程結(jié)束。
b)父進程又沒有調(diào)用wait函數(shù) (非父子進程則未調(diào)用waitpid函數(shù)),此種情況子進程進入僵死狀態(tài)即僵尸進程,并且會一直保持下去直到系統(tǒng)重啟。子進程處于僵死狀態(tài)時,內(nèi)核只保存進程的一些必要信息以備父進程所需。此時子進程始終占有著資源,同時也減少了系統(tǒng)可以創(chuàng)建的最大進程數(shù)。
僵死狀態(tài):一個已經(jīng)終止、但是其父進程尚未對其進行善后處理(獲取終止子進程的有關(guān)信息,釋放它仍占有的資源)的進程被稱為僵死進程(zombie)。ps命令將僵死進程的狀態(tài)打印為Z 。
相關(guān)文章
C++中指針的數(shù)據(jù)類型和運算相關(guān)知識小結(jié)
這篇文章主要介紹了C++中指針的數(shù)據(jù)類型和運算相關(guān)知識小結(jié),是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
基于malloc與free函數(shù)的實現(xiàn)代碼及分析
本篇文章介紹了malloc與free函數(shù)的實現(xiàn)代碼及分析。需要的朋友參考下2013-05-05
C++最短路徑Dijkstra算法的分析與具體實現(xiàn)詳解
經(jīng)典的求解最短路徑算法有這么幾種:廣度優(yōu)先算法、Dijkstra算法、Floyd算法。本文是對?Dijkstra算法的總結(jié),該算法適用于帶權(quán)有向圖,可求出起始頂點到其他任意頂點的最小代價以及對應(yīng)路徑,希望對大家有所幫助2023-03-03
使用Visual Studio 2010/2013編譯V8引擎步驟分享
這篇文章主要介紹了使用Visual Studio 2013編譯V8引擎步驟分享,需要的朋友可以參考下2015-08-08

