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