併發之執行緒、程序、纖程、協程、管程與死鎖,活鎖
1、程序【Progress】
定義:作業系統中能夠獨立執行的個體,資源分配的基本單位。由指令、資料、堆疊等結構組成。
生命週期:
- 程式安裝好後,未執行之前,僅是一些檔案儲存在磁碟上;
- 程式啟動時,向OS【Operating System 作業系統】申請一定資源,如CPU、儲存空間和I/O裝置等;
- OS為其分配資源後,才會真正出現記憶體中的抽象概念:程序。
後沿:程序的排程開銷很大。併發中切換過程效率很低,為了更高效的排程和滿足複雜程式的需求,有了執行緒。
2、執行緒【Thread】
定義:
- 程式執行最小單元;
- 一個程序可以擁有多條執行緒,所有執行緒可以共享程序的記憶體區域;
- 執行緒通常執行時也需要一組暫存器、記憶體、棧等資源支援。
如果機器為八核CPU,理論同一時刻最多支援8條核心執行緒同時併發,如果採用超執行緒技術,把1個物理晶片模擬成兩個邏輯處理核心,比如四核八執行緒的CPU,同一時間也支援最大8條執行緒併發執行。
在OS中,程式一般不會直接申請核心執行緒進行操作,而是去使用核心執行緒提供的一種名為LWP【Lightweight Process】的輕量級程序進行操作,這個也就是平時所謂的執行緒,也被稱為使用者級執行緒。
2.1、執行緒模型
使用者執行緒與核心執行緒主要存在3種模型:一對一模型、多對一模型和多對多模型。
2.1.1、一對一模型
定義:一條使用者執行緒對應核心中的一條執行緒。比如java
一對一模型是真正意義上的並行執行,因為這種模型下,建立一條java的Thread執行緒是真正的在核心中建立並映射了一條核心執行緒的,執行過程中,一條執行緒不會因為寧外一條執行緒的原因而發生阻塞等情況。不過因為是直接對映核心執行緒模式,所以數量會存在上限。並且同一個核心中,多條執行緒的執行需要頻繁的發生上下文切換以及核心態與使用者態之間切換,所以如果執行緒數量過多,切換過於平凡會導致執行緒執行效率下降。
2.1.2、多對一模型
指多條使用者執行緒對映一條核心執行緒的情況,對於使用者執行緒而言,他們的執行都是由使用者態的程式碼來完成切換的。
優點:
- 可以節省核心態到使用者態的切換;
- 執行緒的數量不會受到核心執行緒的限制。
缺點:
- 因為執行緒切換的工作事由使用者態的程式碼來完成,所有如果當一條執行緒發生阻塞時,與該核心對應的其他使用者執行緒也會一起陷入阻塞。
2.1.3、多對多模型
優點:
- 避免一對一和多對多帶來的弊端,也就是多條使用者執行緒對映多條核心執行緒,可以避免一對一模型的切換效率問題和數量限制問題,也可以避免多對一的阻塞問題。
3、協程【Coroutines】
協程是一種基於執行緒之上,但比執行緒更加輕量級的存在。由程式管理的輕量級執行緒也被稱為使用者空間執行緒,對核心而言是不可見的。正如同程序中存在多條執行緒一樣,執行緒中也可以存在多個協程。
協程在執行時也有自己的暫存器,上下文和棧,協程的排程完全由使用者控制,協程排程切換時,會將暫存器上下文和棧儲存到分配的私有記憶體區域中,在切換回來的時候,回覆先前儲存的暫存器上下文和棧,直接操作棧,則基本沒有核心開銷,可以不加鎖的訪問全域性變數,所以上下文切換的非常快。
協程有些類似執行緒多對一模型。
4、纖程【Fiber】
纖程是Microsoft組織為了幫助企業程式更好移植到Windows系統,而在作業系統中增加的一個概念,由作業系統核心根據對應的排程演算法進行控制,也是一種輕量級的執行緒。
纖程和協程的概念一致,都是執行緒的多對一模型,但是有些地方會區分開來,但從協程的本質概念上來談:纖程、綠色執行緒、微執行緒這些概念都是屬於協程範疇。
纖程和協程的區別在於:纖程是OS級別的實現,而協程是語言級別的實現,纖程被OS控制,協程對於核心而言是不可見的。
5、管程【Monitors】
管程提供一種機制,執行緒可以臨時放棄互斥訪問,等待某些條件得到滿足後,重新獲得執行權回覆它的互斥訪問。
6、總結
- 從實現級別上來講:程序、執行緒、纖程是OS級別的實現,而綠色執行緒、協程這些則是語言級別上的實現。
- 從排程方式而言:程序、執行緒、綠色執行緒屬於搶佔式執行,而纖程、協程則屬於合作式排程。
- 從包含關係來說:一個OS中可以有多個程序,一個程序中可以有多條執行緒,而一個執行緒中則可以有多個協程、纖程、微執行緒等。