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(重新设置时间片、找到要运行的线程)

8.Windows线程切换_时间片管理

8.Windows线程切换_时间片管理
8.Windows线程切换_时间片管理

8.Windows线程切换_时间片管理

8.Windows线程切换_时间片管理
8.Windows线程切换_时间片管理

8.Windows线程切换_时间片管理

8.Windows线程切换_时间片管理

8.Windows线程切换_时间片管理

时钟中断会导致线程进行切换,但并不是说,只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换:

  1. 当前的线程CPU时间片到期
  2. 有备用线程(KPCR.PrcbData.NextThread)

存在备用线程(NextThread)
这个值被设置时,即使当前线程的CPU时间片没有到期,仍然会被切换.参见KiDispatchInterrupt代码

8.Windows线程切换_时间片管理

线程切换的三种情况:

(1)、当前线程主动调用API:
API函数->KiSwapThread ->KiSwapContext->SwapContext

(2)、当前线程时间片到期:
KiDispatchlnterrupt->KiQuantumEnd ->KiSwapContext ->SwapContext

(3)、有备用线程(KPCR.PrcbData.NextThread)
KiDispatchInterrupt->SwapContext