線程、對稱多處理和微內核(OS 筆記三)
線程、對稱多處理
? 這一部分繼續深入探討與進程管理相關的高級概念並了解多處理機的對稱多處理技術。
進程和線程
到目前為止提出的進程的概念包含兩個特點:
- 資源所有權 存放進程映像的虛擬地址空間
- 調度/執行 被執行和接受操作系統調度
上述兩個特點是獨立的,操作系統應該能夠獨立的處理他們。為了區分這兩個特點,分派(接受調度)的單位通常被稱為 線程 或者輕量級進程。而擁有資源所有權的單位通常仍稱為進程或任務。現在,我們提出了線程的概念,並對二者加以了區分。
多線程
? 多線程是指操作系統在單個進程內支持多個並發執行路徑的能力。每個進程中只有一個線程(一條執行路徑)在執行的傳統方法稱為單線程方法。
多線程單線程示意圖:
在多線程環境中,進程被定義成資源分配的單位和一個被保護的單位。與進程相關聯的有:
- 存放進程映像的虛擬地址空間
- 受保護地對處理器、其他進程、文件和 I/O 資源的訪問
在一個進程中,可能有一個或多個線程,每個線程都有:
- 線程執行狀態(執行,就緒等)
- 在未運行時保存的線程上下文:從某種意義上來講,線程可以被看做進程內的一個被獨立操作的程序計數器
- 一個執行棧
- 用於每個線程局部變量的靜態儲存空間
- 與進程內的其他線程共享的對進程的內存和資源的訪問
線程和進程在進程管理角度的不同:
在單線程模型中(即並沒有明確的線程概念),進程的表示包括他的進程控制塊和用戶地址空間,以及在進程執行中對例程調用和返回的行為的用戶棧和內存棧。當進程正在運行時,處理器寄存器將被該進程所控制;當進程不運行時,這些處理器寄存器中的內容將被保存。在多線程環境中,進程仍只有一個與之關聯的進程控制塊和用戶地址空間,但是每個線程都有一個獨立的棧,該有獨立的控制塊用於包含寄存器的值、優先級和其他與線程相關的狀態信息。
因此,進程中的所有線程共享進程的狀態和資源。
如圖:
從性能方面考慮線程的優點:
- 在一個進程中創建一個新線程比創建一個新進程所需要的時間要少許多(約快10倍)
- 終止一個線程比終止一個進程花費的時間要少
- 同一個進程內線程間切換比進程間切換花費時間要少
- 線程提高了不同的執行程序間通信的效率。在大多數操作系統中,獨立進程間的通信需要內核的介入,以提供保護和通信所需的機制。但在同一個進程中的線程共享內存和文件,無需調用內核就可以相互通信
因此,如果一個應用程序或函數被實現為一組相關的線程要比實現為一組分離的進程更高效。
使用線程比較常見的例子是服務器對於多個用戶請求的響應,因為這涉及到頻繁的創建和銷毀任務操作。並且如果計算機具有多個處理器,那麽同一進程的多個線程可以同時被多個處理器同時處理以提高效率。
另外,在單處理機中,為了簡化在邏輯上完成若幹項不同功能的程序的結構,線程也是有用的。
比如:
- 前臺和後臺工作
- 異步處理
- 執行速度
- 模塊化程序結構
在支持線程的操作系統中,調度和分派是在線程基礎上完成的。
線程的功能特性
線程狀態
- 派生
- 阻塞
- 解除阻塞
- 結束
線程阻塞並不會導致擁有該線程的進程發生阻塞。不然便喪失了線程的靈活性。
線程同步
線程同步的問題和解決的技術和進程同步相同,將在之後的進程同步部分一起討論。
用戶級和內核級線程
用戶級線程
? 在一個純粹的用戶級線程程序中,有關線程管理的工作都由應用程序完成,內核意識不到線程的存在。程序默認是以一個單線程程序開始執行,如果需要使用多線程技術,那麽用戶必須使用一個多線程的例程庫,通過多線程例程庫實現對線程的創建、銷毀和調度、恢復線程上下文等操作。此時可以認為線程庫起到了類似操作系統管理進程時的作用。這些活動都發生在用戶進程中,操作系統內核並不知道這一切。
還有一點需要註意的就是線程調度和進程調度的關系。
考慮一種情況,一個進程中有兩個處於運行態的線程,某一時刻這個進程被操作系統設置為阻塞態,但是由於進程內部的線程對於操作系統是不可見的,所以進程中的線程對於管理他的線程庫來說仍處於運行態,不過由於線程所在的進程被阻塞而暫停運行所以進程中的多線程例程庫和他所管理的線程都會贊同運行。等到這個進程恢復運行時,線程繼續恢復運行。對於內部的線程來說,進程的阻塞仿佛沒有發生一樣。
使用用戶級線程的 優點 :
- 線程的切換不需要內核態特權,同時節省了內核態和用戶態之間的狀態轉換時間
- 可以在應用程序內部定制自己的線程調度算法
- 用戶級線程可以在任何操作系統中運行而不必對底層內核進行修改以支持用戶級線程
缺點 :
- 用戶級線程執行一個系統調用時,不僅這個線程會被阻塞,而且進程中所有的線程都會被阻塞
- 純粹用戶級線程策略中,多線程應用程序不能使用多處理技術。內核一次只把一個進程分配給一個處理器,因此同一時間一個進程中只能有一個線程被執行。事實上,在一個進程內,我們相當於實現了應用程序級別的多道程序設計
內核級線程
? 在一個純粹的內核級線程程序中,有關線程的管理操作都是由內核完成的。應用程序沒有對線程進行管理的代碼。只有一個到內核線程設施的應用程序編程接口(API)。
優點 :
- 內核可以把多個線程同時分配到多個處理器上
- 如果一個進程中的線程阻塞,可以調用該進程中的另一個線程
- 內核自身也可以是多線程的
缺點:
- 跨進程的線程切換需要進行用戶態和內核態的轉換
經過統計後能發現,進程、用戶級線程、內核級線程的性能從高到低可以按照這樣的順序(每級相差大約一個數量級):
? 用戶級線程 > 內核級線程 > 進程
這是大多數情況下的結果,實際情況還是要取決於應用程序的性質。
組合的方法
? 一種折中的方法是組合用戶級線程和內核級線程。在組合的系統中,線程的創建完全在用戶空間中進行,線程的調度和同步也是在應用程序中進行。一個應用程序中的多個用戶級線程被映射到一些內核級線程上。程序員可以為特定的應用程序和處理器調節內核級線程的數目以達到最佳效果。
在組合方法中,同一個應用程序中的多個線程可以在多個處理器上 並行 的運行。某個線程引起阻塞的系統用不會阻塞整個進程。設計正確的情況下該方法將會結合用戶級線程和內核級線程的優點同時減少二者的缺點。
對稱多處理
? 傳統上,操作系統被看做是順序機器,大多數計算機編程語言要求程序員把算法定義成指令序列。處理器通過按順序逐條的執行機器指令來執行程序。每條指令都是以操作序列(取指令、取操作數、執行操作、儲存結果)的方式執行的。
然而,對於計算機的這種看法並不完全是真實的。 在微操作級別,同一時間會有多個控制信號產生;長久以來指令流水線技術至少可以把取操作指令和執行操作重疊起來;這些都是並行的例子。
下面分析兩種最主流的通過復制處理器提供並行性的手段:對稱多處理和集群(後面討論)。
對稱多處理體系結構
並行處理器系統的分類:
- 單指令單數據流 單處理器執行單個指令流,對保存在單個內存中的數據進行操作
- 單指令多數據流 一條機器指令控制許多處理器部件步伐一致的同時執行。每個處理部件都有一個相關的數據內存,因此每條指令都由不同的處理器在不同的數據集合上執行
- 多指令單數據流 一系列數據被傳送到一組處理器上,每個處理器執行不同的指令序列。這個結構從未實現過
- 多指令多數據 一組處理器同時在不同的數據集上執行不同的指令序列
對稱多處理系統在提高計算機性能的同時,無疑也引入了其他的問題,例如多個處理器避免同時選擇一個線程執行等等。它增加了操作系統設計的復雜度。
多處理器操作系統
多處理器操作系統負責管理處理器和其他的計算機資源,使得用戶可以把整個系統看做是與多道程序單處理器系統相同的形式。用戶可以構造使用多進程或多線程的應用程序,而無需考慮用到一個處理器還是多個處理器。因此,多處理器操作系統必須提供多道程序系統的全部功能,再加上適應多個處理器的附加功能。
線程、對稱多處理和微內核(OS 筆記三)