操做系統:多進程、多線程

1、淺層理解

  • 進程是資源分配的最小單位,線程是CPU分配的最小單位——簡單明瞭的說明了進程與線程的區別特色,然而在實際工做中並無什麼卵用。算法

2、多個維度下,進程與線程的優點對比

對比維度 多進程 多線程 結論
數據共享 數據共享複雜,須要用IPC 共享進程數據,數據共享簡單 多進程 < 多線程
數據同步 數據是分開的,同步簡單 由於共享進程數據,同步複雜 多進程 > 多線程
內存、CPU 佔用內存多,切換複雜,CPU利用率低 佔用內存少,切換簡單,CPU利用率高 多進程 < 多線程
建立、銷燬、切換 建立、銷燬、切換相對複雜,速度慢 建立、銷燬、切換簡單,速度快 多進程 < 多線程
編程、調試複雜度 編程調試相對簡單 都很複雜 多進程 > 多線程
可靠性 進程之間不會相互影響 一個線程掛掉,會致使整個進程掛掉 多進程 < 多線程
分佈式 適應於多核、多機分佈式;若是一臺機器不夠,擴展到多臺機器比較簡單 適應於多核分佈式 多進程 > 多線程

3、簡單結論

  1. 當須要比較頻繁的建立、銷燬時,優先用多線程。編程

    • 好比Web服務器,來一個鏈接建立一個線程,斷了就銷燬。服務器

  2. 當須要大量計算的時候優先使用多線程。網絡

    • 所謂大量計算,固然就是要耗費不少CPU,切換頻繁了,這種狀況下線程是最合適的。最多見的例子就是圖像處理、算法處理。多線程

  3. 強相關處理使用線程,弱相關使用進程。併發

    • 什麼叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。
      通常的Server須要完成以下任務:消息收發、消息處理。「消息收發」和「消息處理」就是弱相關的任務,而「消息處理」裏面可能又分爲「消息解碼」、「業務處理」,這兩個任務相對來講相關性就要強多了。所以「消息收發」和「消息處理」能夠分進程設計,「消息解碼」、「業務處理」能夠分線程設計。分佈式

    • 以上劃分方式也非一成不變,須要根據實際狀況進行調整。函數

  4. 可能要擴展多機分佈式的用進程,多核分佈式的用線程。測試

  5. 二者沒有明顯差異,推薦用本身最熟悉、最拿手的方式。操作系統

    • 實際工做並非非此即彼,每每都是「進程+線程」結合的方式。

  6. 消耗資源的對比:

    • 從內核的觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。線程是進程的一個執行流,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

    • 線程,它們彼此之間使用相同的地址空間,共享大部分數據,啓動一個線程所花費的空間遠遠小於啓動一個進程所花費的空間,並且,線程間彼此切換所需的時間也遠遠小於進程間切換所須要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,固然,在具體的系統上,這個數據可能會有較大的區別。

  7. 通信方式:

    • 進程之間傳遞數據只能是經過通信的方式,即費時又不方便。線程之間數據大部分共享(線程函數內部不共享),快捷方便。可是數據同步須要鎖,對於static變量尤爲注意。

  8. 線程的自身優點:

    • 提升應用程序響應;使多CPU系統更加有效。操做系統會保證當線程數不大於CPU數目時,不一樣的線程運行於不一樣的CPU上;

    • 改善程序結構。一個既長又複雜的進程能夠考慮分爲多個線程,成爲幾個獨立或半獨立的運行部分,這樣的程序會利於理解和修改。

4、實驗測試結果 (因爲實驗並不是本人完成,故只記錄實驗環境、條件以及結果。待老子有更多相關的感觸會再次補充)

  1. 任務執行效率的比較

    • 環境:單核、簡單任務(打印字符串) 進程數/線程數 都是255

    • 結論:任務量較小,多線程效率明顯高於多進程。任務量較大時多線程不如多進程效率高。

  2. 在建立和銷燬上的效率比較

    1. 單核

      • 環境:單核,建立、銷燬10萬個進程/線程

      • 結論:數據能夠看出,多線程比多進程在效率上有10多倍的優點。但不能讓咱們在使用哪一種併發模式上定性。

      • 另外:預先派生子進程/線程比現場建立子進程/線程要複雜不少,不只要對池中進程/線程數量進行動態管理,還要解決多進程/多線程對accept的「搶」 問題,在stevens的測試程序中,使用了「驚羣」和「鎖」技術。即便stevens的數據表格中,預先派生線程也不見得比現場建立線程快,在 《Unix網絡編程》第三版中,新做者參照stevens的測試也提供了一組數據,在這組數據中,現場建立線程模式比預先派生線程模式已有了效率上的優點。所以:預先派生進程/線程的模式(進程池、線程池)技術,不只複雜,在效率上也無優點,在新的應用中能夠放心大膽地爲客戶鏈接請求去現場建立進程和線程。

    2. 雙核

      • 環境:雙核,其它同上。

      • 結論:雙核處理器在完成任務量較少時,沒有系統其餘瓶頸因素影響時基本上是單核的兩倍,在任務量較多時,受系統其餘瓶頸因素的影響,速度明顯趨近於單核的速度。

5、併發服務的不可預測性:

  1. 後續待補。(我只是彷佛意會了,還很差言傳。。。)

  2. 關於操做系統內部如何建立、銷燬進程、線程,即爲何這些操做進程消耗會比線程大,尚未搞明白。往後待補。

相關文章
相關標籤/搜索