引言
不知道是不是我自己本身就有那么一絲絲的密集恐懼,,把這么一大堆看起來很相似很相關的概念放在一起,,開起來是有點麻,捋一捋感覺舒服多了,。
相關概念
任務,、作業(yè)(Job,Task,,Schedule)
在進程的概念出現(xiàn)之前,,進程有著這樣的稱謂。
進程
為了使多個程序能夠并發(fā)(同一時刻只有一個在運行,,但感覺起來像多個同時運行,;并行(同一時刻真的多個在運行,不是感覺像多個))的執(zhí)行,,操作系統(tǒng)需要一個結構來抽象和表示這個程序的運行,。
- 進程是操作系統(tǒng)對一個正在運行的程序的一種抽象結構。
- 進程是指在操作系統(tǒng)中能獨立運行并作為資源分配的基本單位,,由一組機器指令,、數(shù)據和堆棧等組成的能獨立運行的活動實體。
- 操作系統(tǒng)可以同時運行多個進程,,多個進程直接可以并發(fā)執(zhí)行和交換信息,。
- 進程在運行是需要一定的資源,如CPU,、存儲空間和I/O設備等,。
線程
進程是資源分配的基本單位,進程的調度涉及到的內容比較多(存儲空間,,CPU,,I/O資源等,進程現(xiàn)場保護),,調度開銷較大,,在并發(fā)的切換過程效率較低。為了更高效的進行調度,,提出了比進程更輕量的獨立運行和調度的基本單位,。
- 線程比進程更輕量
- 線程能獨立運行,獨立調度,,擁有資源(一般是CPU資源,,程序計數(shù)器等)
- 線程調度能大幅度減小調度的成本(相對于進程來說),,線程的切換不會引起進程的切換
- 線程的引入進一步提高了操作系統(tǒng)的并發(fā)性,線程能并發(fā)執(zhí)行
- 同一個進程的多個線程共享進程的資源(省去了資源調度現(xiàn)場保護的很多工作)
協(xié)程,、共行程序、Coroutine
- 協(xié)程是用戶模式下的輕量級線程,,操作系統(tǒng)內核對協(xié)程一無所知
- 協(xié)程的調度完全有應用程序來控制,,操作系統(tǒng)不管這部分的調度
- 一個線程可以包含一個或多個協(xié)程
- 協(xié)程擁有自己的寄存器上下文和棧,協(xié)程調度切換時,,將寄存器上細紋和棧保存起來,,在切換回來時恢復先前保運的寄存上下文和棧
- 協(xié)程能保留上一次調用時的狀態(tài),,看到這里各種生成器(生成器是被閹割的協(xié)程)的概念浮現(xiàn)出來了,。。
- Windows下的實現(xiàn)叫纖程
纖程
代碼易移植性一直是平臺間交互考慮的重點,,在將引用程序從Unix移植到Windows的過程中,,會存在一些類似于線程棧管理的不一致,、結構和異常處理等問題,增加移植難度和成本,。
為了幫助各公司更快,、更正確地將他們的代碼移植到Windows,Microsoft 在操作系統(tǒng)中增加了纖程(Fiber),。纖程與纖程對比,,有如下的特性:
- 線程是在Windows內核中實現(xiàn)的,操作系統(tǒng)會根據系統(tǒng)的調度算法對纖程程進行調度,。
- 纖程是在用戶模式下實現(xiàn)的,,內核對纖程一無所知。
- 纖程是更輕量級的線程,,一個線程可以包含一個或多個纖程
- 內核會對纖程進行搶占式調度,,線程一次只能執(zhí)行一個纖程的代碼(具體執(zhí)行哪一個纖程由用戶調度算法決定)
- 纖程的調度與線程的調度沒有直接關系,操作系統(tǒng)隨時可能會奪取纖程所在線程的運行權
- 除非正在運行的纖程顯式的切換到另一個纖程,,否則其他纖程將無法運行
- Windows有一套API來講線程轉換為纖程或者在同一個線程里面創(chuàng)建多個纖程
管程
把管程放最后還加了一道分割線原因是管程跟上面的幾個概念不是同一類東東,,雖然長得很像,就像Car和Bar一樣,。
臨界資源的概念:
- 一次只允許一個進程訪問的資源
- 多個進程只能互斥訪問的資源
臨界資源的訪問需要同步操作,,比如信號量就是一種方便有效的進程同步機制。但信號量的方式要求每個訪問臨界資源的進程都具有wait和signal操作,。這樣使大量的同步操作分散在各個進程中,,不僅給系統(tǒng)管理帶來了麻煩,而且會因同步操作的使用不當導致死鎖,。管程就是為了解決這樣的問題而產生的,。
操作系統(tǒng)中管理的各種軟件和硬件資源,,均可用數(shù)據結構抽象地描述其資源特性,即用少量信息和對該資源所執(zhí)行的操作來表征該資源,,而忽略它們的內部結構和實現(xiàn)細節(jié),。利用共享數(shù)據結構抽象地表示系統(tǒng)中的共享資源。而把對該共享數(shù)據結構實施的操作定義為一組過程,,如資源的請求和釋放過程request和release,。進程對共享資源的申請、釋放和其他操作,,都是通過這組過程對共享數(shù)據結構的操作來實現(xiàn)的,,這組過程還可以根據資源的情況接受或阻塞進程的訪問,確保每次僅有一個進程使用該共享資源,,這樣就可以統(tǒng)一管理對共享資源的所有訪問,,實現(xiàn)臨界資源互斥訪問。
管程就是代表共享資源的數(shù)據結構以及由對該共享數(shù)據結構實施操作的一組過程所組成的資源管理程序共同構成的一個操作系統(tǒng)的資源管理模塊,。管程被請求和釋放臨界資源的進程所調用,。
管程定義了一個數(shù)據結構和能為并發(fā)進程所執(zhí)行(在該數(shù)據結構上)的一組操作,這組操作能同步進程和改變管程中的數(shù)據,。
超線程
這個也是一個跟上面的概念不是一類事的概念,,超線程是Intel CPU設計上的一種技術。
一個CPU物理核在同一時間只能執(zhí)行一個線程,,而線程的切換會消耗掉上萬的始終周期,,效率還不夠高。超線程就是在實現(xiàn)同一個CPU物理核在同一時間能幾乎執(zhí)行兩個線程的技術,。這就是我們在Intel CPU的機子上的任務管理器中經??吹絛ouble的CPU物理核心的緣由。
參考資料
- 《深入理解計算機系統(tǒng)》 第二版
- 《Windows 核心編程》 第五版
- 《計算機操作系統(tǒng)》 第三版
- 《操作系統(tǒng)概念》 第七版
- 《計算機程序設計藝術》 卷一
- Coroutine 維基百科