第05章 内核代码(11):操作系统的“心脏起搏器”——深度拆解 sched.c 的调度、睡眠与唤醒魔法

发布时间:2026/8/26 17:51:31
第05章 内核代码(11):操作系统的“心脏起搏器”——深度拆解 sched.c 的调度、睡眠与唤醒魔法 免责声明本文内容仅限技术学习与交流使用。文中涉及的代码、算法及数据结构基于 1991 年的 Linux 0.11 内核源代码。当前主流 Linux 内核(如 2.6.x 及以上)的调度器(如 CFS 完全公平调度器)与 0.11 基于时间片轮转的调度算法已完全不同,若尝试将文中所述逻辑直接迁移至现代项目,请务必自行验证。因使用不当造成的任何系统异常或数据丢失,责任由使用者自行承担。引子:如何让一颗“单核”的 CPU,同时服侍数百个任务?想象一下,你是一个大饭店里唯一的一位厨师(单核 CPU)。但是,餐桌上坐着几十位客人(进程),他们都等着你炒菜。你不可能一次炒几十个菜,你只有一个灶台。你必须炒一下 A 客人的番茄炒蛋,装盘一半,立刻换到 B 客人的清蒸鱼,蒸一半,再去切 C 客人的回锅肉,然后回头继续炒 A 的番茄炒蛋。每一道菜你只处理极小的一段时间,然后立刻换人。为什么要这样?因为如果你一直只炒一道菜(比如 A 的番茄炒蛋),可能这道菜需要慢炖半小时,其他客人都会饿死。所以,你必须有一套极其严密的“换菜谱逻辑”: