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。

相关推荐
佛山个人技术开发7 分钟前
GitCode SSH连接配置教程
运维·ssh·gitcode
Qt程序员11 分钟前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu
The Sheep 202323 分钟前
Vue复习
linux·服务器·数据库
兄台の请冷静25 分钟前
Linux 安装es
linux·elasticsearch·jenkins
fengyehongWorld39 分钟前
Linux rg命令
linux
pride.li1 小时前
海思视觉Hi3516CV610--开机自动设置ip
linux·网络·网络协议·tcp/ip
我叫张小白。1 小时前
CentOS 7 安装 Docker并配置镜像加速(完整指南)
linux·docker·centos
OpsEye1 小时前
系统负载高一定是CPU问题吗?
运维·cpu·it
源图客2 小时前
Minio配置HTTPS服务
服务器·网络协议·https
修炼室2 小时前
外网环境原生直连校内服务器:基于内网穿透 + SSH 密钥认证的完整实践指南
服务器·ssh·php