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

引言

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

相關概念

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

在進程的概念出現以前,進程有着這樣的稱謂。編程

進程

爲了使多個程序可以併發(同一時刻只有一個在運行,但感受起來像多個同時運行;並行(同一時刻真的多個在運行,不是感受像多個))的執行,操做系統須要一個結構來抽象和表示這個程序的運行。數據結構

  • 進程是操做系統對一個正在運行的程序的一種抽象結構。
  • 進程是指在操做系統中能獨立運行並做爲資源分配的基本單位,由一組機器指令、數據和堆棧等組成的能獨立運行的活動實體。
  • 操做系統能夠同時運行多個進程,多個進程直接能夠併發執行和交換信息。
  • 進程在運行是須要必定的資源,如CPU、存儲空間和I/O設備等。

線程

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

  • 線程比進程更輕量
  • 線程能獨立運行,獨立調度,擁有資源(通常是CPU資源,程序計數器等)
  • 線程調度能大幅度減少調度的成本(相對於進程來講),線程的切換不會引發進程的切換
  • 線程的引入進一步提升了操做系統的併發性,線程能併發執行
  • 同一個進程的多個線程共享進程的資源(省去了資源調度現場保護的不少工做)

協程、共行程序、Coroutine

  • 協程是用戶模式下的輕量級線程,操做系統內核對協程一無所知
  • 協程的調度徹底有應用程序來控制,操做系統無論這部分的調度
  • 一個線程能夠包含一個或多個協程
  • 協程擁有本身的寄存器上下文和棧,協程調度切換時,將寄存器上下紋和棧保存起來,在切換回來時恢復先前保運的寄存上下文和棧
  • 協程能保留上一次調用時的狀態,看到這裏各類生成器(生成器是被閹割的協程)的概念浮現出來了。。
  • Windows下的實現叫纖程

纖程

代碼易移植性一直是平臺間交互考慮的重點,在將引用程序從Unix移植到Windows的過程當中,會存在一些相似於線程棧管理的不一致、結構和異常處理等問題,增長移植難度和成本。spa

爲了幫助各公司更快、更正確地將他們的代碼移植到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 維基百科
相關文章
相關標籤/搜索