進程 線程 協程 管程 纖程 概念對比理解

數據結構 Windows CPU 程序設計 堆棧HeapStack 2017-05-09

引言

不知道是不是我自己本身就有那麼一絲絲的密集恐懼,把這麼一大堆看起來很相似很相關的概念放在一起,開起來是有點麻,捋一捋感覺舒服多了。

相關概念

任務、作業(Job,Task,Schedule)

在進程的概念出現之前,進程有著這樣的稱謂。

進程

為了使多個程序能夠併發(同一時刻只有一個在運行,但感覺起來像多個同時運行;並行(同一時刻真的多個在運行,不是感覺像多個))的執行,操作系統需要一個結構來抽象和表示這個程序的運行。

  • 進程是操作系統對一個正在運行的程序的一種抽象結構。

  • 進程是指在操作系統中能獨立運行並作為資源分配的基本單位,由一組機器指令、數據和堆棧等組成的能獨立運行的活動實體。

  • 操作系統可以同時運行多個進程,多個進程直接可以併發執行和交換信息。

  • 進程在運行是需要一定的資源,如CPU、存儲空間和I/O設備等。

線程

進程是資源分配的基本單位,進程的調度涉及到的內容比較多(存儲空間,CPU,I/O資源等,進程現場保護),調度開銷較大,在併發的切換過程效率較低。為了更高效的進行調度,提出了比進程更輕量的獨立運行和調度的基本單位。

  • 線程比進程更輕量

  • 線程能獨立運行,獨立調度,擁有資源(一般是CPU資源,程序計數器等)

  • 線程調度能大幅度減小調度的成本(相對於進程來說),線程的切換不會引起進程的切換

  • 線程的引入進一步提高了操作系統的併發性,線程能併發執行

  • 同一個進程的多個線程共享進程的資源(省去了資源調度現場保護的很多工作)

協程、共行程序、Coroutine

  • 協程是用戶模式下的輕量級線程,操作系統內核對協程一無所知

  • 協程的調度完全有應用程序來控制,操作系統不管這部分的調度

  • 一個線程可以包含一個或多個協程

  • 協程擁有自己的寄存器上下文和棧,協程調度切換時,將寄存器上細紋和棧保存起來,在切換回來時恢復先前保運的寄存上下文和棧

  • 協程能保留上一次調用時的狀態,看到這裡各種生成器(生成器是被閹割的協程)的概念浮現出來了。。

  • Windows下的實現叫纖程

纖程

代碼易移植性一直是平臺間交互考慮的重點,在將引用程序從Unix移植到Windows的過程中,會存在一些類似於線程棧管理的不一致、結構和異常處理等問題,增加移植難度和成本。為了幫助各公司更快、更正確地將他們的代碼移植到Windows,Microsoft 在操作系統中增加了纖程(Fiber)。纖程與纖程對比,有如下的特性:

  • 線程是在Windows內核中實現的,操作系統會根據系統的調度算法對線程進行調度。

  • 纖程是在用戶模式下實現的,內核對纖程一無所知。

  • 纖程是更輕量級的線程,一個線程可以包含一個或多個纖程

  • 內核會對線程進行搶佔式調度,線程一次只能執行一個纖程的代碼(具體執行哪一個纖程由用戶調度算法決定)

  • 纖程的調度與線程的調度沒有直接關係,操作系統隨時可能會奪取纖程所在線程的運行權

  • 除非正在運行的纖程顯式的切換到另一個纖程,否則其他纖程將無法運行

  • Windows有一套API來講線程轉換為纖程或者在同一個線程裡面創建多個纖程


管程

把管程放最後還加了一道分割線原因是管程跟上面的幾個概念不是同一類東東,雖然長得很像,就像Car和Bar一樣。臨界資源的概念:

  • 一次只允許一個進程訪問的資源

  • 多個進程只能互斥訪問的資源

臨界資源的訪問需要同步操作,比如信號量就是一種方便有效的進程同步機制。但信號量的方式要求每個訪問臨界資源的進程都具有wait和signal操作。這樣使大量的同步操作分散在各個進程中,不僅給系統管理帶來了麻煩,而且會因同步操作的使用不當導致死鎖。管程就是為了解決這樣的問題而產生的。操作系統中管理的各種軟件和硬件資源,均可用數據結構抽象地描述其資源特性,即用少量信息和對該資源所執行的操作來表徵該資源,而忽略它們的內部結構和實現細節。利用共享數據結構抽象地表示系統中的共享資源。而把對該共享數據結構實施的操作定義為一組過程,如資源的請求和釋放過程request和release。進程對共享資源的申請、釋放和其他操作,都是通過這組過程對共享數據結構的操作來實現的,這組過程還可以根據資源的情況接受或阻塞進程的訪問,確保每次僅有一個進程使用該共享資源,這樣就可以統一管理對共享資源的所有訪問,實現臨界資源互斥訪問。管程就是代表共享資源的數據結構以及由對該共享數據結構實施操作的一組過程所組成的資源管理程序共同構成的一個操作系統的資源管理模塊。管程被請求和釋放臨界資源的進程所調用。管程定義了一個數據結構和能為併發進程所執行(在該數據結構上)的一組操作,這組操作能同步進程和改變管程中的數據。

超線程

這個也是一個跟上面的概念不是一類事的概念,超線程是Intel CPU設計上的一種技術。一個CPU物理核在同一時間只能執行一個線程,而線程的切換會消耗掉上萬的始終週期,效率還不夠高。超線程就是在實現同一個CPU物理核在同一時間能幾乎執行兩個線程的技術。這就是我們在Intel CPU的機子上的任務管理器中經常看到double的CPU物理核心的緣由。

參考資料

  1. 《深入理解計算機系統》 第二版

  2. 《Windows 核心編程》 第五版

  3. 《計算機操作系統》 第三版

  4. 《操作系統概念》 第七版

  5. 《計算機程序設計藝術》 卷一

  6. Coroutine 維基百科

相關推薦

推薦中...