多進程和多線程的區別,優缺點

進程是操作系統基本單位,線程是程序執行的基本單位

一. 進程

1. 進程的優點

  • 順序程序的特點:具有封閉性和可再現性;
  • 程序的併發執行和資源共享。多道程序設計出現後,實現了程序的併發執行和資源共享,提高了系統的效率和系統的資源利用率。

2. 進程的缺點

  • 操作系統調度切換多個線程要比切換調度進程在速度上快的多。而且進程間內存無法共享,通訊也比較麻煩。
  • 線程之間由於共享進程內存空間,所以交換數據非常方便;在創建或撤消進程時,由於系統都要爲之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷

二. 線程

1. 線程的優點

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

  • 線程間方便的通信機制,由於同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接爲其它線程所用,這不僅快捷,而且方便;

  • 使多CPU系統更加有效。操作系統會保證當線程數不大於CPU數目時,不同的線程運行於不同的CPU上;

2. 線程的缺點

  • 調度時, 要保存線程狀態,頻繁調度, 需要佔用大量的機時;

  • 程序設計上容易出錯(線程同步問題)。

三. 多進程

1. 多進程優點

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

2. 多進程缺點

  • 邏輯控制複雜,需要和主程序交互;
  • 需要跨進程邊界,如果有大數據量傳送,就不太好,適合小數據量傳送、密集運算
  • 多進程調度開銷比較大;

四. 多線程

1. 多線程的優點

  • 無需跨進程邊界;
  • 程序邏輯和控制方式簡單;
  • 所有線程可以直接共享內存和變量等;
  • 線程方式消耗的總資源比進程方式好;

2. 多線程缺點

  • 每個線程與主程序共用地址空間,受限於2GB地址空間;
  • 線程之間的同步和加鎖控制比較麻煩;
  • 一個線程的崩潰可能影響到整個程序的穩定性;
  • 到達一定的線程數程度後,即使再增加CPU也無法提高性能,例如Windows Server 2003,大約是1500個左右的線程數就快到極限了(線程堆棧設定爲1M),如果設定線程堆棧爲2M,還達不到1500個線程總數;
  • 線程能夠提高的總性能有限,而且線程多了之後,線程本身的調度也是一個麻煩事兒,需要消耗較多的CPU
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章