C語言中文網
首頁 > 編程筆記 > 操作系統筆記 閱讀:710

Windows線程調度策略(超詳細)

Windows 采用基于優先級的、搶占調度算法來調度線程。

用于處理調度的 Windows 內核部分稱為調度程序,Windows 調度程序確保具有最高優先級的線程總是在運行的。由于調度程序選擇運行的線程會一直運行,直到被更高優先級的線程所搶占,或終止,或時間片已到,或調用阻塞系統調用(如 I/O)。如果在低優先級線程運行時,更高優先級的實時線程變成就緒,那么低優先級線程就被搶占。這種搶占使得實時線程在需要使用 CPU 時優先得到使用。

調度程序采用 32 級的優先級方案,以便確定線程執行順序。優先級分為兩大類:可變類包括優先級從 1?15 的線程,實時類包括優先級從 16?31 的線程(還有一個線程運行在優先級 0,它用于內存管理)。

調度程序為每個調度優先級采用一個隊列;從高到低檢查隊列,直到它發現一個線程可以執行。如果沒有找到就緒線程,那么調度程序會執行一個稱為空閑線程的特別線程。

在 Windows 內核和 Windows API 的數字優先級之間有一個關系。Windows API 定義了一個進程可能屬于的一些優先級類型。它們包括:
進程通常屬于類 NORMAL_PRIORITY_CLASS。進程屬于這個類,除非進程的父進程屬于類 IDLE_PRIORITY_CLASS,或者在創建進程時指定了某個類。此外,通過 Windows API 的函數 SetPriorityClass(),進程的優先級的類可以修改。除了 REALTIME_PRIORITY_CLASS外,所有其他類的優先級都是可變的,這意味著屬于這些類型的線程優先級能夠改變。

具有給定優先級類的一個線程也有一個相對優先級。這個相對優先級的值包括:

每個線程的優先級基于它所屬的優先級類型和它在該類型中的相對優先級,圖 2 說明了這種關系。

Windows線程優先級
圖 1 Windows 線程優先級

每個類型的值出現在頂行。左列包括相對優先級的值。例如,如果 1 個線程屬于 ABOVE_NORMAL_PRIORITY_CLASS 型,且相對優先級為 NORMAL,那么該線程的優先級數值為 10。

另外,每個線程在所屬類型中有一個優先級基值。默認地,優先級基值為一個類型的優先級相對值 NORMAL。每個優先級類型的優先級基值為:
線程的優先級初值通常為線程所屬進程的優先級基值,但是通過 Windows API 的函數 SetThreadPriority() 也可修改線程的優先級基值。

當一個線程的時間片用完時,該線程被中斷。如果線程屬于可變的優先級類型,那么它的優先級就被降低。不過,該優先級不能低于優先級基值。降低優先級可以限制計算密集型線程的 CPU 消耗。

當一個可變優先級的線程從等待中釋放時,調度程序會提升其優先級。提升數量取決于線程等待什么。例如,等待鍵盤 I/O 的線程將得到一個較大提升;而等待磁盤操作的線程將得到一個中等提升。采用這種策略,正在使用鼠標和窗口的線程往往得到很好的響應時間。這也使得 I/O 密集型線程保持 I/O 設備忙碌,同時允許計算密集型線程使用后臺空閑的 CPU 周期。

此外,用戶正在交互使用的窗口會得到優先級提升,以便改善響應時間。多個操作系統包括 UNIX,采用這種策略。

當用戶運行一個交互程序時,系統需要提供特別好的表現。由于這個原因,對于類 NORMAL PRIORITY CLASS 的進程,Windows 有一個特殊調度規則。Windows 將這類進程分成兩種:
  1. 前臺進程,屏幕上已選的進程;
  2. 后臺進程,屏幕上未選的進程;
當一個進程移到前臺,Windows 增加它的時間片,通常是原來的 3 倍。這個增加給前臺進程 3 倍的時間來運行(在被搶占前)。

Windows 7 引入用戶模式調度(UMS),允許應用程序在內核外創建和管理線程。因此,一個應用程序在不涉及內核調度程序的情況下可以創建和調度多個線程。對于創建大量線程的應用程序,用戶模式的線程調度比內核模式更加有效,因為不需要內核的干預。

早期版本的 Windows 提供了一個類似特征(稱為纖程),允許多個用戶模式線程(纖程)被映射到單個內核線程。然而,使用纖程實際上有限制。一個纖程不能調用 Windows API,因為所有纖程共享線程環境塊(TEB)。這會產生一個問題,當 Windows API 函數將狀態信息放到一個纖程 TEB 上,另一個纖程會改寫這個信息。UMS 對這個問題的解決方法是,為每個用戶模式線程提供它自己的上下文。

此外,與纖程不同的是,UMS 一般不是直接為程序員使用的。編寫用戶模式調度程序的具體細節可能很有挑戰,而且 UMS 并不包括這種調度程序。不過,調度程序來自 UMS 之上的編程語言庫。

例如,微軟提供并發運行時庫(ConcRT),這是一個 C++ 并發編程框架,用于在多核處理器上設計并行任務(更深入了解請猛擊:《什么是多核》一文)。ConcRT 提供用戶模式調度程序,并能將程序分解成任務,以便在可用處理核上進行調度。

所有教程

優秀文章

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo