时钟中断会导致线程进行切换,但并不是说只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换:
- 当前的线程CPU时间片到期
- 有备用线程(KPCR.PrcbData.NextThread)
关于CPU时间片
- 当一个新的线程开始执行时,初始化程序会在KTHREAD.Quantum赋初始值,该值的大小由KPROCESS.ThreadQuantum决定(观察ThreadQuantum大小)
- 每次时钟中断会调用KeUpdateRunTime函数,该函数每次将当前线程 Quantum减少3个单位,如果减到0,则将KPCR.PrcbData.QuantumEnd的值设置为非0
- KiDispatchlnterrupt判断时间片到期:调用KiQuantumEnd(重新设置时间片、找到要运行的线程)
时钟中断会导致线程进行切换,但并不是说,只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换:
- 当前的线程CPU时间片到期
- 有备用线程(KPCR.PrcbData.NextThread)
存在备用线程(NextThread)
这个值被设置时,即使当前线程的CPU时间片没有到期,仍然会被切换.参见KiDispatchInterrupt代码
线程切换的三种情况:
(1)、当前线程主动调用API:
API函数->KiSwapThread ->KiSwapContext->SwapContext
(2)、当前线程时间片到期:
KiDispatchlnterrupt->KiQuantumEnd ->KiSwapContext ->SwapContext
(3)、有备用线程(KPCR.PrcbData.NextThread)
KiDispatchInterrupt->SwapContext