1. 程式人生 > >Linux多程序和多執行緒的優缺點

Linux多程序和多執行緒的優缺點

教科書上最經典的一句話是“程序是作業系統分配的最小單位,執行緒是CPU排程的最小單位”。

多執行緒的優點:

1)它是一種非常”節儉”的多工操作方式。在Linux系統下,啟動一個新的程序必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼段、堆疊段和資料段,這是一種”昂貴”的多工工作方式。而運行於一個程序中的多個執行緒,它們彼此之間使用相同的地址空間,共享大部分資料,啟動一個執行緒所花費的空間遠遠小於啟動一個程序所花費的空間,而且,執行緒間彼此切換所需的時間也遠遠小於程序間切換所需要的時間。當然,在具體的系統上,這個資料可能會有較大的區別;

2)執行緒間方便的通訊機制,由於同一程序下的執行緒之間共享資料空間,所以一個執行緒的資料可以直接為其它執行緒所用,這不僅快捷,而且方便;

3)使多CPU系統更加有效。作業系統會保證當執行緒數不大於CPU數目時,不同的執行緒運行於不同的CPU上;

4)改善程式結構。一個既長又複雜的程序可以考慮分為多個執行緒,成為幾個獨立或半獨立的執行部分,這樣的程式會利於理解和修改;

5)無需跨程序邊界; 程式邏輯和控制方式簡單; 所有執行緒可以直接共享記憶體和變數等; 執行緒方式消耗的總資源比程序方式好。

多執行緒的缺點:

1)每個執行緒與主程式共用地址空間,受限於2GB地址空間;

2) 執行緒之間的同步和加鎖控制比較麻煩; 一個執行緒的崩潰可能影響到整個程式的穩定性; 到達一定的執行緒數程度後,即使再增加CPU也無法提高效能,例如Windows Server 2003,大約是1500個左右的執行緒數就快到極限了(執行緒堆疊設定為1M),如果設定執行緒堆疊為2M,還達不到1500個執行緒總數; 執行緒能夠提高的總效能有限,而且執行緒多了之後,執行緒本身的排程也是一個麻煩事兒,需要消耗較多的CPU;

3)排程時, 要儲存執行緒狀態,頻繁排程, 需要佔用大量的機時; 程式設計上容易出錯(執行緒同步問題)。

多程序的優點:

1)順序程式的特點:具有封閉性和可再現性;

2)程式的併發執行和資源共享。多道程式設計出現後,實現了程式的併發執行和資源共享,提高了系統的效率和系統的資源利用率;

3)每個程序互相獨立,不影響主程式的穩定性,子程序崩潰沒關係; 通過增加CPU,就可以容易擴充效能; 可以儘量減少執行緒加鎖/解鎖的影響,極大提高效能,就算是執行緒執行的模組演算法效率低也沒關係; 每個子程序都有2GB地址空間和相關資源,總體能夠達到的效能上限非常大 。

多程序的缺點:

1)作業系統排程切換多個執行緒要比切換排程程序在速度上快的多。而且程序間記憶體無法共享,通訊也比較麻煩;

2)執行緒之間由於共享程序記憶體空間,所以交換資料非常方便;在建立或撤消程序時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於建立或撤消執行緒時的開銷。

執行緒和程序各有優勢,怎樣進行選取呢?

1)需要頻繁建立銷燬的優先用執行緒。
例項:web伺服器。來一個建立一個執行緒,斷了就銷燬執行緒。要是用程序,建立和銷燬的代價是很難承受的。

2)需要進行大量計算的優先使用執行緒。
所謂大量計算,當然就是要消耗很多cpu,切換頻繁了,這種情況先執行緒是最合適的。
例項:影象處理、演算法處理

3)強相關的處理用執行緒,若相關的處理用程序。
什麼叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。
一般的server需要完成如下任務:訊息收發和訊息處理。訊息收發和訊息處理就是弱相關的任務,而訊息處理裡面可能又分為訊息解碼、業務處理,這兩個任務相對來說相關性就要強多了。因此訊息收發和訊息處理可以分程序設計,訊息解碼和業務處理可以分執行緒設計。

4)可能擴充套件到多機分佈的用程序,多核分佈的用執行緒。

5)都滿足需求的情況下,用你最熟悉、最拿手的方式。

至於”資料共享、同步“、“程式設計、除錯”、“可靠性”這幾個維度的所謂的“複雜、簡單”應該怎麼取捨,只能說:沒有明確的選擇方法。一般有一個選擇原則:如果多程序和多執行緒都能夠滿足要求,那麼選擇你最熟悉、最拿手的那個。