程序和執行緒 另補充殭屍程序和孤兒程序

2021-09-03 10:39:42 字數 1737 閱讀 4285

程序的全域性資料,程序的位址空間等等,這些都屬於程序

執行緒也有自己的資源,比如棧,私有資料

程序切換比執行緒切換開銷大:

因為程序切換時要切頁表,而且往往伴隨著頁排程,因為程序的資料段**段要換出去,以便把將要執行的程序的內容換進來。本來程序的內容就是執行緒的超集。

而執行緒只需要儲存執行緒的上下文(相關暫存器狀態和棧的資訊)就好了,動作很小

不是,執行緒多了可以提高程式並行執行的速度,但是並不是越多越好,其中,每個執行緒都要占用記憶體,多執行緒就意味著更多的記憶體資源被占用,其二,從微觀上講,乙個cpu不是同時執行兩個執行緒的,他是輪流執行的,所以執行緒太多,cpu必須不斷的在各個執行緒間快回更換執行,執行緒間的切換無意間消耗了許多時間,所以cpu有效利用率反而是下降的

首先正常情況下,子程序是通過父程序建立的,子程序在建立新的程序。子程序的結束和父程序的執行是乙個非同步過程。 當乙個子程序完成它的工作終止之後,它的父程序需要呼叫wait()或者waitpid()系統呼叫取得子程序的終止狀態

殭屍程序:乙個程序使用fork建立子程序,子程序退出,但是父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子                      程序的程序描述符仍然儲存在系統中(會占用程序號之類,還有占用的記憶體

孤兒程序:乙個父程序退出,但它的乙個或多個子程序還在執行,那麼這些子程序將成為孤兒程序。孤兒程序將被init程序(程序                   號為1)所收養,並由init程序對它們完成狀態收集工作。

fork呼叫的乙個奇妙之處就是它僅僅被呼叫一次,卻能夠返回兩次,它可能有三種不同的返回值:

1)在父程序中,fork返回新建立子程序的程序id;

2)在子程序中,fork返回0;

3)如果出現錯誤,fork返回乙個負值;

1. 子程序終止時候,如果父程序不呼叫wait / waitpid的話,那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是        系統所能使用的程序號是有限的,如果大量的產生僵死程序,將因為沒有可用的程序號而導致系統不能產生新的程序. 此即         為殭屍程序的危害,應當避免。

2.孤兒程序是沒有父程序的程序,孤兒程序這個重任就落到了init程序身上,init程序會迴圈地wait()它的已經退出的子程序

因此孤兒程序並不會有什麼危害。

解決:

僵死程序並不是問題的根源,罪魁禍首是產生出大量僵死程序的那個父程序。因此,當我們尋求如何消滅系統中大量的僵死程序時,應該把產生大量僵死程序的那個元凶槍斃掉(也就是通過kill傳送sigterm或者sigkill訊號啦)。槍斃了元凶程序之後,它產生的僵死程序就變成了孤兒程序,這些孤兒程序會被init程序接管,init程序會wait()這些孤兒程序,釋放它們占用的系統程序表中的資源

while輪詢的方式

wait/notify機制

管道通訊

殭屍程序和孤兒程序

殭屍程序 乙個子程序在其父程序還沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。孤兒程序 乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序 程序號為1 所收養,並由init程序對它們完成狀態收集工作。殭屍程序將會導致資源...

殭屍程序和孤兒程序

什麼是殭屍程序?乙個子程序在其父程序沒有呼叫wait 或waitpid 的情況下退出。這個子程序就是殭屍程序。如果其父程序還存在而一直不呼叫wait,則該殭屍程序將無法 等到父程序結束後,會被init 驗證 include include includeint main 3秒後查詢其程序資訊 通過上...

殭屍程序和孤兒程序

殭屍程序和孤兒程序 在unix系統程式設計中,常常會碰到兩個概念 僵死程序和孤兒程序 僵死程序 在unix程序模型中,程序是按照父程序產生子程序,子程序產生子子程序這樣的方式建立出完成各項相互協作功能的程序的。當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait 或者waitpid 系統呼叫取...