天天看點

程序 線程 協程 管程 纖程 概念對比了解

引言

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

相關概念

任務、作業(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。程序對共享資源的申請、釋放和其他操作,都是通過這組過程對共享資料結構的操作來實作的,這組過程還可以根據資源的情況接受或阻塞程序的通路,確定每次僅有一個程序使用該共享資源,這樣就可以統一管理對共享資源的所有通路,實作臨界資源互斥通路。

管程就是代表共享資源的資料結構以及由對該共享資料結構實施操作的一組過程所組成的資源管理程式共同構成的一個作業系統的資源管理子產品。管程被請求和釋放臨界資源的程序所調用。

管程定義了一個資料結構和能為并發程序所執行(在該資料結構上)的一組操作,這組操作能同步程序和改變管程中的資料。

參考資料

  1. 《深入了解計算機系統》 第二版
  2. 《Windows 核心程式設計》 第五版
  3. 《計算機作業系統》 第三版
  4. 《作業系統概念》 第七版
  5. 《計算機程式設計藝術》 卷一
  6. Coroutine 維基百科

繼續閱讀