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