07 Windows线程切换--时间片管理

1、时钟中断时发生线程切换的两种情况
<1>当线程CPU时间片到期
<2>有备用线程(KPCR.PrcbData.NextThread)

2、关于CPU的时间片
<1>当一个线程开始执行时,初始化程序会在_KTHREAD.Quantum赋初始值,该值的大小由_KPROCESS.ThreadQuantum决定
下面我们来观察一下该值:
!process 0 0 列出所有进程选择其中一个进程
在这里插入图片描述
dt _kPROCESS 8663aba0 查看ThreadQuantum属性值
在这里插入图片描述
<2>每次系统时钟中断都会调用KwUpdateRunTime(),该函数每次将线程的Quantum属性减少3个单位,如果减到0,KPCR.PrcbData.QuantumEnd的值设为非0
<3>KiDispatchInterrupt判断时间片到期

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

4、线程切换的三种情况
<1>当前线程主动调用API
API函数–>KiSwapThread–>KiSwapContext–>SwapContext
<2>当线程时间片到期
KiDispatchInterrupt–>KiQuantumEnd–>SwapContext
<3>有备用线程(KPCR.PrcbData.NextThread)
KiDispatchInterrupt–>SwapContext

你可能感兴趣的:(07 Windows线程切换--时间片管理)