Windows进程与线程学习笔记(七)—— 时间片管理
前言
一、学习自
滴水编程达人
中级班课程,官网:https://bcdaren.com
二、海东老师牛逼!
要点回顾
- 在上一篇中,学习了线程切换的三种方式,其中一种是时钟中断
- 时钟中断最终会导致线程切换,但要注意不是说只要产生时钟中断就一定会发生线程切换
基本概念
时钟中断发生时,以下两种情况会导致线程切换:
- 当前线程的CPU时间片到期
- 存在备用线程(
KPCR.PrcbData.NextThread
)
CPU时间片
描述:
- 当一个新的线程开始执行时,初始化程序会在
_KTHREAD.Quantum
赋初始值,该值的大小由_KPROCESS.ThreadQuantum
决定(观察ThreadQuantum
大小) - 每次时钟中断会调用
KeUpdateRunTime
函数,该函数每次将当前线程Quantum
减少3个单位,如果减到0,则将KPCR.PrcbData.QuantumEnd
的值设置为非0。 KiDispatchInterrupt
判断时间片到期:
调用KiQuantumEnd
(重新设置时间片、找到要运行的线程)
分析 KeUpdateRunTime
分析 KiDispatchInterrupt
若CPU时间片到期,则跳转至 loc_405920
KiQuantumEnd 重新设置了时间片
然后调用了 KiFindReadyThread,找到下一个要运行的线程
KiQuantumEnd 结束后,若存在下一个将要运行的线程,跳转至 loc_4058D1
KiReadyThread 将原线程挂载到调度链表中
备用线程
总结
- 当前线程主动调用 API:
KiSwapThread -> KiSwapContext -> SwapContext - 当前线程时间片到期:
KiDispatchInterrupt -> KiQuantumEnd -> SwapContext - 存在备用线程:
KiDispatchInterrupt -> SwapContext