摘要:實際工作并不是非此即彼,往往都是進程線程結合的方式。操作系統會保證當線程數不大于數目時,不同的線程運行于不同的上改善程序結構。關于操作系統內部如何創建銷毀進程線程,即為什么這些操作進程消耗會比線程大,還沒有搞明白。
一、淺層理解
進程是資源分配的最小單位,線程是CPU分配的最小單位——簡單明了的說明了進程與線程的區別特點,然而在實際工作中并沒有什么卵用。
二、多個維度下,進程與線程的優勢對比對比維度 | 多進程 | 多線程 | 結論 |
---|---|---|---|
數據共享 | 數據共享復雜,需要用IPC | 共享進程數據,數據共享簡單 | 多進程 < 多線程 |
數據同步 | 數據是分開的,同步簡單 | 因為共享進程數據,同步復雜 | 多進程 > 多線程 |
內存、CPU | 占用內存多,切換復雜,CPU利用率低 | 占用內存少,切換簡單,CPU利用率高 | 多進程 < 多線程 |
創建、銷毀、切換 | 創建、銷毀、切換相對復雜,速度慢 | 創建、銷毀、切換簡單,速度快 | 多進程 < 多線程 |
編程、調試復雜度 | 編程調試相對簡單 | 都很復雜 | 多進程 > 多線程 |
可靠性 | 進程之間不會相互影響 | 一個線程掛掉,會導致整個進程掛掉 | 多進程 < 多線程 |
分布式 | 適應于多核、多機分布式;如果一臺機器不夠,擴展到多臺機器比較簡單 | 適應于多核分布式 | 多進程 > 多線程 |
當需要比較頻繁的創建、銷毀時,優先用多線程。
比如Web服務器,來一個連接創建一個線程,斷了就銷毀。
當需要大量計算的時候優先使用多線程。
所謂大量計算,當然就是要耗費很多CPU,切換頻繁了,這種情況下線程是最合適的。最常見的例子就是圖像處理、算法處理。
強相關處理使用線程,弱相關使用進程。
什么叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。
一般的Server需要完成如下任務:消息收發、消息處理。“消息收發”和“消息處理”就是弱相關的任務,而“消息處理”里面可能又分為“消息解碼”、“業務處理”,這兩個任務相對來說相關性就要強多了。因此“消息收發”和“消息處理”可以分進程設計,“消息解碼”、“業務處理”可以分線程設計。
以上劃分方式也非一成不變,需要根據實際情況進行調整。
可能要擴展多機分布式的用進程,多核分布式的用線程。
兩者沒有明顯差別,推薦用自己最熟悉、最拿手的方式。
實際工作并不是非此即彼,往往都是“進程+線程”結合的方式。
消耗資源的對比:
從內核的觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。線程是進程的一個執行流,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統上,這個數據可能會有較大的區別。
通訊方式:
進程之間傳遞數據只能是通過通訊的方式,即費時又不方便。線程之間數據大部分共享(線程函數內部不共享),快捷方便。但是數據同步需要鎖,對于static變量尤其注意。
線程的自身優勢:
提高應用程序響應;使多CPU系統更加有效。操作系統會保證當線程數不大于CPU數目時,不同的線程運行于不同的CPU上;
改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。
四、實驗測試結果 (由于實驗并非本人完成,故只記錄實驗環境、條件以及結果。待老子有更多相關的感觸會再次補充)
任務執行效率的比較
環境:單核、簡單任務(打印字符串) 進程數/線程數 都是255
結論:任務量較小,多線程效率明顯高于多進程。任務量較大時多線程不如多進程效率高。
在創建和銷毀上的效率比較
單核
環境:單核,創建、銷毀10萬個進程/線程
結論:數據可以看出,多線程比多進程在效率上有10多倍的優勢。但不能讓我們在使用哪種并發模式上定性。
另外:預先派生子進程/線程比現場創建子進程/線程要復雜很多,不僅要對池中進程/線程數量進行動態管理,還要解決多進程/多線程對accept的“搶” 問題,在stevens的測試程序中,使用了“驚群”和“鎖”技術。即使stevens的數據表格中,預先派生線程也不見得比現場創建線程快,在 《Unix網絡編程》第三版中,新作者參照stevens的測試也提供了一組數據,在這組數據中,現場創建線程模式比預先派生線程模式已有了效率上的優勢。因此:預先派生進程/線程的模式(進程池、線程池)技術,不僅復雜,在效率上也無優勢,在新的應用中可以放心大膽地為客戶連接請求去現場創建進程和線程。
雙核
環境:雙核,其它同上。
結論:雙核處理器在完成任務量較少時,沒有系統其他瓶頸因素影響時基本上是單核的兩倍,在任務量較多時,受系統其他瓶頸因素的影響,速度明顯趨近于單核的速度。
五、并發服務的不可預測性:后續待補。(我只是似乎意會了,還不好言傳。。。)
關于操作系統內部如何創建、銷毀進程、線程,即為什么這些操作進程消耗會比線程大,還沒有搞明白。日后待補。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11768.html
摘要:在一個進程內部,要同時干多件事,就需要同時運行多個子任務,我們把進程內的這些子任務稱為線程。總結一下,多任務的實現方式有三種多進程模式多線程模式多進程多線程模式線程是最小的執行單元,而進程由至少一個線程組成。 進程與線程 很多同學都聽說過,現代操作系統比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務的操作系統。 什么叫多任務呢?簡單地說,就是操作系統可以同時...
摘要:腳本執行,事件處理等。引擎線程,也稱為內核,負責處理腳本程序,例如引擎。事件觸發線程,用來控制事件循環可以理解為,引擎線程自己都忙不過來,需要瀏覽器另開線程協助。異步請求線程,也就是發出請求后,接收響應檢測狀態變更等都是這個線程管理的。 一、進程與線程 現代操作系統比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務的操作系統。 什么叫多任務呢?簡單地說,就是操...
摘要:線程線程,有時被稱為輕量級進程,,是程序執行流的最小單元。進程和線程區別進程是資源分配的基本單位。說得簡單點,下面這段代碼執行的時候參考博文進程與線程的一個簡單解釋多線程和多進程的區別小結多線程還是多進程的選擇及區別加鎖 關于進程與線程的簡單理解(以工廠舉例:cup-》工廠,車間-》進程,線程-》工人),可以參考阮一峰的博文進程與線程的一個簡單圖文解釋 先來了解下進程和線程的概念關于多...
摘要:系統級線程核心級線程由操作系統內核進行管理。值得注意的是多線程的存在,不是提高程序的執行速度。實現多線程上面說了一大堆基礎,理解完的話。虛擬機的啟動是單線程的還是多線程的是多線程的。 前言 之前花了一個星期回顧了Java集合: Collection總覽 List集合就這么簡單【源碼剖析】 Map集合、散列表、紅黑樹介紹 HashMap就是這么簡單【源碼剖析】 LinkedHashMa...
閱讀 3452·2019-08-30 15:44
閱讀 797·2019-08-30 13:46
閱讀 2057·2019-08-30 11:05
閱讀 3332·2019-08-29 18:32
閱讀 2154·2019-08-29 13:56
閱讀 1296·2019-08-29 12:57
閱讀 756·2019-08-28 18:21
閱讀 1733·2019-08-26 12:16