進程與線程,你了解多少?
進程與線程,在面試中經(jīng)常會被問到,或者實際開發(fā)中經(jīng)常遇到。那什么是進程?什么是線程?你對他們了解有多少?
我們經(jīng)常會說:
1、一個在內(nèi)存中運行的應(yīng)用程序。每個進程都有自己獨立的一塊內(nèi)存空間,一個進程可以有多個線程。
2、進程是資源分配的獨立單位,線程是資源調(diào)度的獨立單位。
進程。下圖顯示了 4 個程序創(chuàng)建了 4 個進程,這 4 個進程可以并發(fā)地執(zhí)行。
線程。QQ 和瀏覽器是兩個進程,瀏覽器進程里面有很多線程,例如 HTTP 請求線程、事件響應(yīng)線程、渲染線程等等,線程的并發(fā)執(zhí)行使得在瀏覽器中點擊一個新鏈接從而發(fā)起 HTTP 請求時,瀏覽器還可以響應(yīng)用戶的其它事件。
如果僅僅回答到這里,可能一個大學(xué)畢業(yè)生就能這么回答,那我們是不是需要深入一下,再深入一下。
比如說:
1、資源開銷方面。線程和進程的切換的資源開銷情況怎么樣?
2、內(nèi)存分配方面。進程/線程的內(nèi)存分配情況怎么樣?
3、影響程度方面。進程/線程奔潰會造成什么樣的影響?
4、執(zhí)行過程方面。進程/線程執(zhí)行過程是什么樣的?
5、我們沒有說進程之間是否可以通信?線程之間是否可以通信?如何可以通信的話,他們是怎么進行通信的?
6、進程同步又是什么?
一、資源開銷
(1)每一個進程都有獨立的代碼和內(nèi)存空間,多個進程相互切換會消耗比較大的資源。
進程切換如下圖:
說明:
- 就緒狀態(tài)(ready):等待被調(diào)度
- 運行狀態(tài)(running)
- 阻塞狀態(tài)(waiting):等待資源
如果再往下說的話需要聊聊進程調(diào)度算法,比如:先來先服務(wù)(FCFS),短作業(yè)優(yōu)先(SJF),最短剩余時間優(yōu)先,時間片輪轉(zhuǎn),優(yōu)先級調(diào)度,多級反饋隊列等等。
(2)同一類線程共享代碼和內(nèi)存空間,每一個線程都有獨立的運行棧和程序計數(shù)器,多個線程相互切換消耗比較小。
二、內(nèi)存分配
(1)進程之間的地址空間和資源是相互獨立的。
(2)同一進程的線程共享本進程的地址空間和資源。
三、影響程度
(1)進程一旦奔潰,只會影響到該進程的程序奔潰,其他進程不受影響。
(2)線程一旦奔潰,會影響到使用該線程的進程都會受到影響。
(3)進程要比線程要健壯。
四、執(zhí)行過程
(1)每一個進程都有獨立的運行入口,執(zhí)行順序,程序的出口,提供線程控制,進程可以并發(fā)執(zhí)行。
(2)線程不能單獨運行,必須依賴于進程中執(zhí)行。線程可以并發(fā)執(zhí)行。
五、進程之間的通信
(1)管道(PIPE)
有名管道:一種半雙工的通信方式,它允許無親緣關(guān)系進程間的通信。
優(yōu)點:可以實現(xiàn)任意關(guān)系的進程間的通信
缺點:
- 長期存于系統(tǒng)中,使用不當(dāng)容易出錯。
- 緩沖區(qū)有限。
無名管道:一種半雙工的通信方式,只能在具有親緣關(guān)系的進程間使用(父子進程)。
優(yōu)點:簡單方便。
缺點:
- 局限于單向通信。
- 只能創(chuàng)建在它的進程以及其有親緣關(guān)系的進程之間。
- 緩沖區(qū)有限。
(2)信號量(Semaphore):一個計數(shù)器,可以用來控制多個線程對共享資源的訪問。
優(yōu)點:可以同步進程。
缺點:信號量有限。
(3)信號(Signal):一種比較復(fù)雜的通信方式,用于通知接收進程某個事件已經(jīng)發(fā)生。
(4)消息隊列(Message Queue):是消息的鏈表,存放在內(nèi)核中并由消息隊列標(biāo)識符標(biāo)識。
優(yōu)點:可以實現(xiàn)任意進程間的通信,并通過系統(tǒng)調(diào)用函數(shù)來實現(xiàn)消息發(fā)送和接收之間的同步,無需考慮同步問題,方便。
缺點:信息的復(fù)制需要額外消耗 CPU 的時間,不適宜于信息量大或操作頻繁的場合。
(5)共享內(nèi)存(Shared Memory):映射一段能被其他進程所訪問的內(nèi)存,這段共享內(nèi)存由一個進程創(chuàng)建,但多個進程都可以訪問。
優(yōu)點:無須復(fù)制,快捷,信息量大。
缺點:1.通信是通過將共享空間緩沖區(qū)直接附加到進程的虛擬地址空間中來實現(xiàn)的,因此進程間的讀寫操作的同步問題2.利用內(nèi)存緩沖區(qū)直接交換信息,內(nèi)存的實體存在于計算機中,只能同一個計算機系統(tǒng)中的諸多進程共享,不方便網(wǎng)絡(luò)通信。
(6)套接字(Socket):可用于不同計算機間的進程通信
優(yōu)點:
- 傳輸數(shù)據(jù)為字節(jié)級,傳輸數(shù)據(jù)可自定義,數(shù)據(jù)量小效率高。
- 傳輸數(shù)據(jù)時間短,性能高。
- 適合于客戶端和服務(wù)器端之間信息實時交互。
- 可以加密,數(shù)據(jù)安全性強。
缺點:需對傳輸?shù)臄?shù)據(jù)進行解析,轉(zhuǎn)化成應(yīng)用級的數(shù)據(jù)。
六、線程之間的通信
(1)鎖機制:包括互斥鎖/量(mutex)、讀寫鎖(reader-writer lock)、自旋鎖(spin lock)、條件變量(condition)。
- 互斥鎖/量(mutex):提供了以排他方式防止數(shù)據(jù)結(jié)構(gòu)被并發(fā)修改的方法。
- 讀寫鎖(reader-writer lock):允許多個線程同時讀共享數(shù)據(jù),而對寫操作是互斥的。
- 自旋鎖(spin lock)與互斥鎖類似,都是為了保護共享資源?;コ怄i是當(dāng)資源被占用,申請者進入睡眠狀態(tài);而自旋鎖則循環(huán)檢測保持者是否已經(jīng)釋放鎖。
- 條件變量(condition):可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
(2)信號量機制(Semaphore)。
- 無名線程信號量
- 命名線程信號量
(3)信號機制(Signal):類似進程間的信號處理。
(4)屏障(barrier):屏障允許每個線程等待,直到所有的合作線程都達到某一點,然后從該點繼續(xù)執(zhí)行。
七、對比/優(yōu)劣/選擇
選擇
- 需要頻繁創(chuàng)建銷毀的優(yōu)先用線程。
- 需要進行大量計算的優(yōu)先使用線程。
- 強相關(guān)的處理用線程,弱相關(guān)的處理用進程。
- 可能要擴展到多機分布的用進程,多核分布的用線程。
- 都滿足需求的情況下,用你最熟悉、最拿手的方式就對了?。