Windows執行緒排程策略(超詳細)

2020-07-16 10:04:35
Windows 採用基於優先順序的、搶佔排程演算法來排程執行緒。

用於處理排程的 Windows 核心部分稱為排程程式,Windows 排程程式確保具有最高優先順序的執行緒總是在執行的。由於排程程式選擇執行的執行緒會一直執行,直到被更高優先順序的執行緒所搶佔,或終止,或時間片已到,或呼叫阻塞系統呼叫(如 I/O)。如果在低優先順序執行緒執行時,更高優先順序的實時執行緒變成就緒,那麼低優先順序執行緒就被搶占。這種搶占使得實時執行緒在需要使用 CPU 時優先得到使用。

排程程式採用 32 級的優先順序方案,以便確定執行緒執行順序。優先順序分為兩大類:可變類包括優先順序從 1?15 的執行緒,實時類包括優先順序從 16?31 的執行緒(還有一個執行緒執行在優先順序 0,它用於記憶體管理)。

排程程式為每個排程優先順序採用一個佇列;從高到低檢查佇列,直到它發現一個執行緒可以執行。如果沒有找到就緒執行緒,那麼排程程式會執行一個稱為空閒執行緒的特別執行緒。

在 Windows 核心和 Windows API 的數位優先順序之間有一個關係。Windows API 定義了一個進程可能屬於的一些優先順序型別。它們包括:
  • IDLE_PRIORITY_CLASS
  • BELOW_NORMAL_PRIORITY_CLASS
  • NORMAL_PRIORITY_CLASS
  • ABOVE NORMAL_PRIORITY_CLASS
  • HIGH_PRIORITY_CLASS
  • REALTIME_PRIORITY_CLASS

進程通常屬於類 NORMAL_PRIORITY_CLASS。進程屬於這個類,除非進程的父進程屬於類 IDLE_PRIORITY_CLASS,或者在建立進程時指定了某個類。此外,通過 Windows API 的函數 SetPriorityClass(),進程的優先順序的類可以修改。除了 REALTIME_PRIORITY_CLASS外,所有其他類的優先順序都是可變的,這意味著屬於這些型別的執行緒優先順序能夠改變。

具有給定優先順序類的一個執行緒也有一個相對優先順序。這個相對優先順序的值包括:
  • IDLE
  • LOWEST
  • BELOW_NORMAL
  • NORMAL
  • ABOVE_NORMAL
  • HIGHEST
  • TIME_CRITICAL

每個執行緒的優先順序基於它所屬的優先順序型別和它在該型別中的相對優先順序,圖 2 說明了這種關係。

Windows線程優先級
圖 1 Windows 執行緒優先順序