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。

相关推荐
一路往蓝-Anbo1 小时前
第 4 章:串口驱动进阶——GPDMA + Idle 中断实现变长数据流接收
linux·人工智能·stm32·单片机·嵌入式硬件
SakitamaX1 小时前
haproxy七层代理介绍与实验
linux·运维·服务器
only_Klein1 小时前
Ansible变量详解
运维·自动化·ansible
武帝为此1 小时前
【Linux strace命令介绍】
linux·运维·策略模式
请为小H留灯1 小时前
Docker 命令速通指南:从入门到封神的 100 + 必学指令,一篇搞定容器全操作
运维·docker·容器
一只鹿鹿鹿2 小时前
数据治理文档(word原件)
java·运维·spring boot·后端
『往事』&白驹过隙;2 小时前
Linux VFS虚拟文件系统杂谈
linux·c语言·arm开发·物联网·操作系统·iot
亓才孓2 小时前
【MyBatis Exception】省略动态SQL中的‘‘,会造成Runtime Exception
java·服务器·mybatis