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。

相关推荐
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者5 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo6 天前
Linux系统中网线与USB网络共享冲突
linux
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维