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。

相关推荐
像风一样自由20207 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体
sxgzzn8 小时前
如何利用电缆故障定位在线监测系统提升供电安全?
运维·重构·无人机·开关柜局放在线监测·gis局放在线监测
曦夜日长8 小时前
Git系统篇,Git本地使用(一):从“究极进化版“到三个区域的底层原理
大数据·linux·git·elasticsearch
mengchanmian8 小时前
VSFTP 服务器搭建(Centos)
运维·服务器·centos
shimly1234568 小时前
给断网无 sudo ubuntu22.04 机器安装 nodejs
linux
别动我齐刘海10 小时前
Linux 系统调试学习1
linux·运维·服务器·c++·学习·机器学习·机器人
Lsetea10 小时前
OpenSSL报certificate chain too long:error 22与verify_depth深度排查
linux·https·ssl证书·openssl·证书链
不像程序员的程序媛11 小时前
linux常见文本操作命令
linux·运维·服务器
wangbing112511 小时前
开发指南149-IotDB-常用命令
linux·运维·iotdb
Dovis(誓平步青云)11 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus