1. 程式人生 > >8.Windows執行緒切換_時間片管理

8.Windows執行緒切換_時間片管理

時鐘中斷會導致執行緒進行切換,但並不是說只要有時鐘中斷就一定會切換執行緒,時鐘中斷時,兩種情況會導致執行緒切換:

  1. 當前的執行緒CPU時間片到期
  2. 有備用執行緒(KPCR.PrcbData.NextThread)

關於CPU時間片

  1. 當一個新的執行緒開始執行時,初始化程式會在KTHREAD.Quantum賦初始值,該值的大小由KPROCESS.ThreadQuantum決定(觀察ThreadQuantum大小)
  2. 每次時鐘中斷會呼叫KeUpdateRunTime函式,該函式每次將當前執行緒 Quantum減少3個單位,如果減到0,則將KPCR.PrcbData.QuantumEnd的值設定為非0
  3. KiDispatchlnterrupt
    判斷時間片到期:呼叫KiQuantumEnd(重新設定時間片、找到要執行的執行緒)

在這裡插入圖片描述

在這裡插入圖片描述 在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述 在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

時鐘中斷會導致執行緒進行切換,但並不是說,只要有時鐘中斷就一定會切換執行緒,時鐘中斷時,兩種情況會導致執行緒切換:

  1. 當前的執行緒CPU時間片到期
  2. 有備用執行緒(KPCR.PrcbData.NextThread)

存在備用執行緒(NextThread) 這個值被設定時,即使當前執行緒的CPU時間片沒有到期,仍然會被切換.參見KiDispatchInterrupt程式碼

在這裡插入圖片描述

執行緒切換的三種情況:

(1)、當前執行緒主動呼叫API: API函式->KiSwapThread ->KiSwapContext->SwapContext

(2)、當前執行緒時間片到期: KiDispatchlnterrupt->KiQuantumEnd ->KiSwapContext ->SwapContext

(3)、有備用執行緒(KPCR.PrcbData.NextThread) KiDispatchInterrupt->SwapContext