一、執行緒
linux執行緒建立函式為pthread_create(),預設規則是誰建立子執行緒,誰就要負責子執行緒的資源**,當父執行緒退出後,子執行緒也隨著退出。所以,一般情況下,父執行緒退出時都要確保子執行緒已經退出,所以會使用pthread_join()函式阻塞等待子執行緒的退出訊號/標識。
pthread_detach(threadid)函式的功能是使執行緒id為threadid的執行緒處於分離狀態(可以為非父子關係),一旦執行緒處於分離狀態,該執行緒終止時底層資源立即被**;否則終止子執行緒的狀態會一直儲存占用系統的資源直到主線程呼叫pthread_join(threadid,null)獲取執行緒的退出狀態。被建立的子執行緒也可以自己分離自己,子執行緒呼叫pthread_detach(pthread_self())就是分離自己,因為pthread_self()這個函式返回的就是自己本身的執行緒id。
1)父執行緒先於子執行緒終止
父執行緒先於子執行緒,則子執行緒為異常退出 ,那肯定沒有使用阻塞非分離函式pthread_join,分2種情況:
a)子執行緒已與父執行緒分離,如呼叫執行緒分離函式pthread_detach,則資源被自動**釋放。
b)子執行緒未與父執行緒分離,則資源無法釋放,造成了資源浪費和系統臃腫(這種情況,我看有些資料上說系統也能自動釋放子執行緒的資源,如關閉描述符,釋放記憶體空間等等,但個人做過一些測試,比如在子執行緒中分配很多空間等,程序退出後,top檢視記憶體狀態時還存在)。
2)子執行緒先於父執行緒終止
也分2種情況:
a)正常情況:子執行緒呼叫了執行緒分離函式ptread_detach(),或父執行緒呼叫了等待執行緒結束函式pthread_join()。
b)異常情況:如果上面二者都為呼叫,則為子執行緒分配的資源無法得到釋放。
二、程序
乙個現有程序可以呼叫fork函式建立乙個新程序。由fork建立的新程序被稱為子程序(child process)。fork函式被呼叫一次但返回兩次。兩次返回的唯一區別是子程序中返回0值而父程序中返回子程序id。
1)父程序先於子程序終止
當父程序先退出時,系統會讓init程序接管子程序,該子執行緒成為了孤兒程序。
2)子程序先於父程序終止
分為2種情況:
a)正常情況:父程序呼叫了wait函式 (非父子程序則用waitpid函式),此時父程序會等待子程序結束。
b)父程序又沒有呼叫wait函式 (非父子程序則未呼叫waitpid函式),此種情況子程序進入僵死狀態即殭屍程序,並且會一直保持下去直到系統重啟。子程序處於僵死狀態時,核心只儲存程序的一些必要資訊以備父程序所需。此時子程序始終占有著資源,同時也減少了系統可以建立的最大程序數。
僵死狀態:乙個已經終止、但是其父程序尚未對其進行善後處理(獲取終止子程序的有關資訊,釋放它仍占有的資源)的程序被稱為僵死程序(zombie)。ps命令將僵死程序的狀態列印為z 。
深入分析父子執行緒 程序終止順序不同產生的結果
linux下程式設計,執行緒 程序退出順序問題紛紛擾擾,如果父程序 執行緒先於子程序 執行緒終止,系統會做什麼處理呢?反之,如果子程序 執行緒先於父程序 執行緒終止,系統又會做什麼處理呢?下面是我個人平時在筆記上做的一些象徵性的總結,如果有疑問之處,大可提出,我一直認為懷疑是人類進步的根本所在。一 ...
父子程序終止順序與僵死程序
在linux 父子程序與fork一文中,我們知道子程序是在父程序呼叫fork之後生成的。那麼關於父子程序終止先後順序又會有什麼影響呢?對於父程序已經終止的所有程序,它們的父程序都改變為init程序。我們稱這些程序由init程序收養。其操作過程大致是 在乙個程序終止時,核心逐個檢查所有活動的程序,以判...
深入分析執行緒與程序的區別
每個程序和執行緒都會通過task struct 這麼乙個結構體去維護 這個結構體主要就是儲存著程序或執行緒在記憶體排程所使用的資源 struct task struct 於是 我們就有了這麼一張圖 mm struct每個程序都會維護乙份屬於自己乙個結構體 然而每個執行緒都會共享程序的這個mm str...