Linux: 重新理解调度

https://mzhan017.blog.csdn.net/article/details/128420974

接着之前的一片关于might_sleep继续讨论调度。

在Linux内核语境中,"schedule"(调度)是操作系统核心功能之一,指决定哪个进程获得CPU执行时间的过程;而"调度点"则是内核主动触发这一决策的时机。当调度发生时,当前进程可能被新进程"顶替"(即上下文切换),但并非必然,调度器会根据进程优先级、资源需求等策略选择最适合运行的进程,当前进程可能继续执行,也可能被暂停并让位于其他进程。

调度的核心逻辑:从"谁该运行"到"如何切换"。操作系统的核心任务之一是高效分配CPU资源。内核通过"调度器"(scheduler)实现这一目标,其核心工作包括:

选择下一个运行进程:基于优先级(如实时进程>普通进程)、时间片(进程已运行的CPU时间)、资源需求(如I/O等待进程优先唤醒)等策略,从就绪队列中挑选"最值得运行"的进程。

上下文切换:若选中的不是当前进程,内核会保存当前进程的CPU寄存器、栈指针等状态(上下文),加载新进程的上下文,完成控制权转移。

这里的"schedule"既指调度器选择进程的决策过程,也指执行上下文切换的动作。当用户提到"当前进程被新的进程顶替",描述的正是上下文切换的结果。但需注意:调度器可能选择当前进程继续运行(例如当前进程优先级最高且未用完时间片),此时不会发生"顶替"。

为何在might_sleep()中添加调度点?

用户引用的场景(2.6内核自愿抢占补丁)揭示了调度的实际意义。might_sleep()是标记"可能睡眠的函数"的调试工具(例如调用kmalloc(GFP_KERNEL)可能因内存不足而睡眠)。这类函数执行时,内核处于"可抢占"状态(允许中断或主动让出CPU)。

Ingo和Arjan的优化思路是:既然might_sleep()标记的函数已处于安全睡眠的上下文,不妨在此处添加cond_reschedule,它会检查是否有更高优先级的进程等待运行,若有则主动触发调度(调用schedule)。这相当于在"潜在等待点"增加了100多个"主动让贤"的机会,避免低优先级进程长时间占用CPU,提升系统响应性。

调度的本质是"动态资源分配",不是简单的"进程顶替",而是内核动态平衡CPU资源的机制:通过在安全时机(如might_sleep()标记的函数)主动检查并切换进程,确保高优先级任务及时执行,同时避免低优先级任务饥饿。当cond_reschedule()触发调度时,若存在更紧急的进程(如实时任务),当前进程会被"顶替"(暂停并放入就绪队列);若当前进程仍是最优选择,则继续运行。

这种设计体现了内核"效率"与"响应性"的权衡,自愿抢占通过在安全点主动调度,既避免了内核代码被长时阻塞,又不引入过多切换开销。理解调度的关键在于:它不是"顶替"的过程,而是"选择最优进程运行"的决策与执行。

所以might-sleep的意思,是让调度器做一下调度的工作,决定下一个可以运行的task是哪一个。所以不一定会让当前调用might-sleep的进程进入sleep,也不一定不进sleep,所以才叫做might sleep。

相关推荐
霸道流氓气质32 分钟前
ApiPost 中配置自动获取 Token 并调用业务接口完整指南
java·服务器·数据库
时空无限1 小时前
vllm 大模型启动缓存相关环境变量 export
linux·缓存·vllm
Echo_cy_1 小时前
基于ZYNQ-7000的Ethernet驱动配置
linux·驱动开发·嵌入式硬件·fpga开发·ethernet·zynq
ShineWinsu1 小时前
对于Linux:模版方法类的解析以及socket、TcpSocket的封装
linux·c++·面试·socket·模板方法模式·封装·tcpsocket
D2aZXN3FhrDa7e2121 小时前
佛山乐从低预算实体店如何选择?看美诚AI自动化获客方案
运维·人工智能·自动化·佛山美诚科技有限公司
无足鸟ICT2 小时前
【RHCA+】查看变量
linux·运维·服务器
Kina_C2 小时前
Linux DNS 服务器-从高速缓存到辅助 DNS 部署指南
linux·运维·服务器·dns
EasyGBS2 小时前
ONVIF设备接入国标GB28181视频平台EasyGBS:不用国标也能一键拉流!
服务器·php·音视频
suaizai_2 小时前
TypeScript 7 正式发布!Vue 暂被 “拒之门外“ !!!
linux·运维·ubuntu
小小代码狗3 小时前
SQLi-Labs 基础注入实战教程(Less-1 ~ Less-5and Less-9)
服务器·python·php