區(qū)別:1、多進(jìn)程中數(shù)據(jù)共享復(fù)雜、同步簡單,而多線程中數(shù)據(jù)共享簡單、同步復(fù)雜;2、多進(jìn)程占用內(nèi)存多、切換復(fù)雜、速度慢、CPU利用率低,而多線程占用內(nèi)存少、切換簡單、CPU利用率高;3、多進(jìn)程的編程簡單、調(diào)試簡單,而多線程的編程復(fù)雜、調(diào)試復(fù)雜。
本教程操作環(huán)境:linux5.9.8系統(tǒng)、Dell G3電腦。
linux中多進(jìn)程和多線程的區(qū)別
進(jìn)程:運行中(加載到內(nèi)存上)的程序。–>執(zhí)行過程稱之為進(jìn)程。
線程:線程是輕量級的進(jìn)程,是進(jìn)程中的一條執(zhí)行序列(一組有序指令),一個進(jìn)程至少有一條線程。
main函數(shù)所代表的執(zhí)行序列稱之為主線程。通過線程庫創(chuàng)建的線程稱之為函數(shù)線程。
對比維度 | 多進(jìn)程 | 多線程 | 總結(jié) |
數(shù)據(jù)共享,同步 |
數(shù)據(jù)共享復(fù)雜,需要用IPC; 數(shù)據(jù)是分開的,同步簡單 |
因為共享進(jìn)程數(shù)據(jù),共享數(shù)據(jù)簡單,同時導(dǎo)致同步也復(fù)雜 | 各有優(yōu)勢 |
內(nèi)存、CPU | 占用內(nèi)存多,切換復(fù)雜,速度慢,CPU利用率低 | 占用內(nèi)存少,切換簡單CPU利用率高 | 多線程優(yōu)勢 |
創(chuàng)建銷毀、切換 | 創(chuàng)建銷毀,切換復(fù)雜,速度慢 | 創(chuàng)建銷毀,切換簡單,速度很快 | 多線程優(yōu)勢 |
編程調(diào)試 | 編程簡單,調(diào)試簡單 | 編程復(fù)雜,調(diào)試復(fù)雜 | 多進(jìn)程優(yōu)勢 |
可靠性 | 進(jìn)程間不會互相影響 | 一個線程掛掉將導(dǎo)致整個進(jìn)程掛掉 | 多進(jìn)程優(yōu)勢 |
分布式 | 適用于多核、多機(jī)分布式;如果一臺機(jī)器不夠,拓展到多臺機(jī)器比較簡單 | 適用于多核分布式 | 多進(jìn)程優(yōu)勢 |
多線程的優(yōu)點:
-
無需跨進(jìn)程邊界;
-
程序邏輯和控制方式簡單;
-
所有線程可以直接共享內(nèi)存和變量;
-
線程方式消耗的總資源比進(jìn)程少
多進(jìn)程的優(yōu)點 :
-
每個進(jìn)程相互獨立,不影響主程序的穩(wěn)定性,子進(jìn)程崩潰沒關(guān)系;
-
通過增加CPU就可以容易擴(kuò)充性能;
-
可以盡量減少線程加鎖/解鎖的影響,極大提高性能;
多線程的缺點:
-
每條線程與主程序共用地址空間,大小受限;
-
線程之間的同步和加鎖比較麻煩;
-
一個線程的崩潰可能影響到整個程序的穩(wěn)定性;
-
到達(dá)一定的線程數(shù)后,即使在增加CPU也無法提高性能;
多進(jìn)程的缺點:
-
邏輯控制復(fù)雜,需要和主程序交互;
-
需要跨進(jìn)程邊界,如果有大數(shù)據(jù)傳輸,不適合;
-
多進(jìn)程調(diào)度開銷比較大
應(yīng)用情況如下:
1)需要頻繁創(chuàng)建銷毀的用線程
這種原則最常見的就是Web服務(wù)器了,來一個連接建立一個線程,斷了就銷毀線程。如果用進(jìn)程,創(chuàng)建銷毀的代價是很難承受的。
2)需要進(jìn)行大量計算的優(yōu)先用線程
所謂大量計算就是消耗很多CPU,切換頻繁,這種情況下線程是最合適的。
這種原則最常用的就是圖像處理,算法處理。
3)強(qiáng)相關(guān)的處理用線程,弱相關(guān)的處理用進(jìn)程
什么叫強(qiáng)相關(guān)、弱相關(guān)?理論上很難定義,舉一個例子加以解釋。
一般的Server需要完成如下任務(wù):消息收發(fā)、消息處理?!跋⑹瞻l(fā)”、“消息處理”就是弱相關(guān)的處理,而“消息處理”里面又分為“消息解碼”、“業(yè)務(wù)處理”,這兩個業(yè)務(wù)相對來說就強(qiáng)很多。因此“消息收發(fā)”、“消息處理”可以分進(jìn)程設(shè)計,“消息解碼”、“業(yè)務(wù)處理”可以分線程設(shè)計。
4)可能擴(kuò)展到多機(jī)分布的用進(jìn)程,多核分布的用線程(具體原因請看上表)
消耗資源:
從內(nèi)核的觀點看,進(jìn)程的目的就是擔(dān)任分配系統(tǒng)資源(CPU時間、內(nèi)存等)的基本單位。線程是進(jìn)程的一條執(zhí)行流,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨立運行的基本單位。
線程,他們之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動一個線程所花費的空間遠(yuǎn)遠(yuǎn)小于啟動一個進(jìn)程所花費的空間,而且線程間彼此切換所需要的時間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所用的時間。
通訊方式:
進(jìn)程間傳遞數(shù)據(jù)只能通過通訊的方式,既費時又不方便。線程時間數(shù)據(jù)大部分共享,快捷方便,但是數(shù)據(jù)同步需要鎖。
線程自身優(yōu)勢:
提高應(yīng)用程序相應(yīng);使用CPU系統(tǒng)更加有效;操作系統(tǒng)會保證當(dāng)線程數(shù)目不大于CPU數(shù)目時候,不同的線程運行在不同的CPU上;改善程序結(jié)構(gòu),一個即長又復(fù)雜的進(jìn)程可以考慮分為多個線程,成為幾個獨立或者半獨立的部分,這樣的程序會易于理解和修改。