线程优先级调度

Windows优先级调度算法

系统维护了一个全局的处理器数组KiProcessorBlock,其中每个元素对应于一个处理器的KPRCB对象。其次,另有一个全局变量KiIdleSummary记录了哪些处理器当前是空闲的。所谓一个处理器是空闲的,是指该处理器正在执行空闲循环。KiIdleSummary每一位对应于一个处理器,在32位系统中,由于KiIdleSummary是32位的。所以只支持至多32个处理器。

当一个处理器没有找到合适的线程运行时,会调用KiSetIdleSummary函数来设置KiIdleSummary中相应位,相反,如果一个空闲处理器被分配了一个线程来运行,则需要通过调用KiClearIdleSummary函数来清除KiIdleSummary中相应位。

在每个处理器的KPRCB结构中,都有一个单链表DeferredReadyListHead记录了那些在该处理器上处于延迟就绪状态的线程,以及一个双链表数组DispatcherReadyListHead记录了在每个优先级上已经被分配到此处理器上的就绪状态的线程。另有一个32位摘要位码ReadySummary反映了哪些优先级的就绪链表是非空的,所以,KiSelectReadyThread和KiFindReadyThread函数利用链表数组和摘要位码信息,能很快地找到满足条件地线程。
当一个线程进入等待状态时,会调用KeDelayExecutionThread,KeWaitForSingleObject或KeWaitForMultipleObjects函数,若等待条件未满足,则线程会放弃当前处理器。其次,一个线程在执行过程中由于系统的某些原因,不得不放弃对于当前处理器的执行权,比如一个线程用完了它的当前时限时,只要还存在优先级大于等于它的其他线程,那么它就必须交出处理器的执行权。分为自愿放弃执行权和被迫放弃执行权。

自愿放弃执行权

调用KiSwapThread函数,当前线程自愿把控制权交给线程调度器,然后通过KiSwapContext来完成线程切换

线程自愿进入等待状态,即KeDelayExecutionThread,KeWaitForSingleObject和KeWaitForMultipleObject函数

线程进入门等待状态,发生在KeWaitForGate函数中

在队列对象中,如果一个线程调用KeRemoveQueue,但又不能马上获得队列中的项,该线程也会进入等待状态,并且调用KiSwapThread函数把控制权交给线程调度器

当一个线程attach到一个进程的地址空间时,若目标进程还没有换入内存,尽管当前线程是就绪的,但是它不能继续执行,所以调用KiSwapThread函数把控制权交给线程调度器

被迫放弃执行权

时限用完

被抢占

相关推荐
paul_chen213 小时前
解决Windows “此电脑”出现两个“图片”文件夹的问题
windows
SoulRoar.4 小时前
在 Windows 上面部署 StartLux
windows·大模型·startlux
爱吃提升4 小时前
DirectX修复工具安装配置教程-运行权限检测修复与运行库更新参数速查
windows
ddshub_cc6 小时前
Claude Code 接入 DDS Hub:Windows/macOS 配置、验证与报错排查
windows·macos·ai编程·claude·codex·ai模型·aiapi
第25小时记录6 小时前
[windows] windows下将文件夹映射为磁盘
windows
天空有片七色的云6 小时前
AutoTrigger:开源的 Windows 离线安装自动化工具(GUI+CLI,自动操作安装向导)
windows
2601_967980118 小时前
Python之wxPython模块的安装
linux·windows·python·wxpython·gui设计·1024程序员节
启观川9 小时前
[windows] windows下将文件夹映射为磁盘
windows·笔记
鬼手点金11 小时前
带工具调用的多轮交互:Agent 的核心循环
服务器·人工智能·windows·深度学习·microsoft·机器学习·交互
jiangliushi611 小时前
GPT-6.1 Sol 免费用:Windows 装完 Codex 提示“不是内部或外部命令”?三步加好 PATH
windows·gpt