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