解析 Linux ‘CFS’ (完全公平调度器):红黑树是如何在 (log N)$ 时间内找到下一个运行进程的?

各位同仁,各位技术爱好者,大家好。 今天,我们齐聚一堂,将深入探讨Linux内核调度器中一个极其精妙且核心的组件:完全公平调度器(Completely Fair Scheduler, 简称CFS)。CFS自Linux 2.6.23版本引入以来,以其卓越的性能和优雅的设计,成为了现代Linux系统调度进程的基石。我们将聚焦于CFS的核心数据结构——红黑树,并解析它是如何在对数时间复杂度(O(log N))内高效地找到下一个需要运行的进程。 引言:操作系统的调度艺术与CFS的哲学 在多任务操作系统中,CPU是核心资源。如何高效、公平地分配CPU时间,是调度器永恒的挑战。早期的调度器往往采用固定时间片、优先级队列等机制,但随着系统负载的增加和处理核心数量的增长,这些调度器暴露出一些问题:例如,难以在响应时间、吞吐量和公平性之间取得平衡;优先级反转问题;以及在大量进程存在时,调度决策的复杂度过高。 Linux在CFS之前,经历了O(1)调度器、RSDL等演进。CFS的诞生,标志着Linux调度器设计理念的一次重大革新。它的核心哲学是“完全公平”。CFS不追求为每个进程分配精确的时间片,而是致力 …

C++ 实现一个基于红黑树的简化版 `std::map`

哈喽,各位好!今天我们要一起手搓一个简化版的红黑树std::map,保证大家听完之后,感觉自己也能去写STL了(当然,只是感觉)。 首先,我们要明确目标:我们需要一个类似std::map的东西,它能存储键值对,并且能高效地查找、插入和删除。红黑树就是实现这个目标的绝佳选择,因为它能在最坏情况下保证O(log n)的时间复杂度。 一、红黑树的基础知识:不怕,我用人话讲给你听 红黑树,听起来很高大上,其实就是一种特殊的二叉搜索树。为了保持平衡,它给自己加了一些限制(或者说规则): 每个节点要么是红色,要么是黑色。 就像交通信号灯,非红即黑,简单粗暴。 根节点是黑色。 树的根基一定要稳,所以必须是黑色的。 每个叶子节点(NIL节点,空节点)是黑色。 这些叶子节点其实就是nullptr,也是黑色的。 如果一个节点是红色,那么它的两个子节点都是黑色。 红色节点不能连在一起,不然就乱套了。想象一下红色的多米诺骨牌不能连续摆放。 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。 这条规则保证了树的平衡性。我们把这个黑色节点的数量叫做“黑高”。 这些规则确保了红黑树不 …