8.Windows執行緒切換_時間片管理
阿新 • • 發佈:2018-12-16
時鐘中斷會導致執行緒進行切換,但並不是說只要有時鐘中斷就一定會切換執行緒,時鐘中斷時,兩種情況會導致執行緒切換:
- 當前的執行緒CPU時間片到期
- 有備用執行緒(KPCR.PrcbData.NextThread)
關於CPU時間片
- 當一個新的執行緒開始執行時,初始化程式會在KTHREAD.Quantum賦初始值,該值的大小由KPROCESS.ThreadQuantum決定(觀察ThreadQuantum大小)
- 每次時鐘中斷會呼叫KeUpdateRunTime函式,該函式每次將當前執行緒 Quantum減少3個單位,如果減到0,則將KPCR.PrcbData.QuantumEnd的值設定為非0
- KiDispatchlnterrupt
時鐘中斷會導致執行緒進行切換,但並不是說,只要有時鐘中斷就一定會切換執行緒,時鐘中斷時,兩種情況會導致執行緒切換:
- 當前的執行緒CPU時間片到期
- 有備用執行緒(KPCR.PrcbData.NextThread)
存在備用執行緒(NextThread) 這個值被設定時,即使當前執行緒的CPU時間片沒有到期,仍然會被切換.參見KiDispatchInterrupt程式碼
執行緒切換的三種情況:
(1)、當前執行緒主動呼叫API: API函式->KiSwapThread ->KiSwapContext->SwapContext
(2)、當前執行緒時間片到期: KiDispatchlnterrupt->KiQuantumEnd ->KiSwapContext ->SwapContext
(3)、有備用執行緒(KPCR.PrcbData.NextThread) KiDispatchInterrupt->SwapContext