千家信息网

朴素的UNIX之-Linux CFS一个注释

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本系列名为朴素的UNIX,但是也包括各个类UNIX系统的细节,本系列文章整理自本人几年来的学习笔记,着重分析各个UNIX,类UNIX的实现思想以及感悟。本文比较短,只是分析一下Linux CFS调度器
千家信息网最后更新 2026年11月01日朴素的UNIX之-Linux CFS一个注释

本系列名为朴素的UNIX,但是也包括各个类UNIX系统的细节,本系列文章整理自本人几年来的学习笔记,着重分析各个UNIX,类UNIX的实现思想以及感悟。
本文比较短,只是分析一下Linux CFS调度器的一个细节。
在进程寻找下一个将被运行的进程时,难道仅仅只是在红黑树上取下左下角的进程吗?事实上最朴素的实现就是这样,但是考虑到优化的话,就没有这么简单了。要 考虑CPU缓存的利用率,即如果一个进程A抢占了进程B,那么在A进程的上下文中,pick next是选择进程B呢还是选择红黑树的左下角进程呢?另外如果进程A刚被唤醒,企图抢占进程B,但是没有成功,那么下一个是选择红黑树的左下角进程呢还 是选择进程A呢?是的,这些都是问题。
我们看一下pick next的实现:

static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq){    struct sched_entity *se = __pick_next_entity(cfs_rq);    struct sched_entity *left = se;    if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1)        se = cfs_rq->next;    /*     * Prefer last buddy, try to return the CPU to a preempted task.     */    if (cfs_rq->last && wakeup_preempt_entity(cfs_rq->last, left) < 1)        se = cfs_rq->last;    clear_buddies(cfs_rq, se);    return se;}

很显然,要把红黑树最左下角的进程和另外两个进程,即next和last最比较,next是抢占失败的进程,而last则是抢占成功后被抢占的进程,这三个进程到底哪一个是最优的next进程呢?Linux CFS实现的判决条件是:
1.尽可能满足需要刚被唤醒的进程抢占其它进程的需求;
2.尽可能减少以上这种抢占带来的缓存刷新的影响。
Linux CFS实现是怎么做到的呢?Linux保存了两个变量,即抢占失败的进程和抢占成功后被抢占的进程,在权衡的时候,优先选择的顺序是:
抢占成功后被抢占的进程>抢占失败的进程>红黑树最左下角的进程

到底能不能选择前两个进程,则是wakeup_preempt_entity函数来决定的,代码太多无益,看下面的图解即可:



这个CFS的细节在Linux 2.6.23最初实现CFS时并没有实现。因此从最朴素的时×××始,你才能逐渐理解细节的来龙去脉,看Changelog是有好处的。不得不说,读史使人明智。


进程 选择 成功 细节 朴素 两个 只是 尽可能 缓存 分析 明智 来龙去脉 几年来 三个 上下 上下文 事实 事实上 代码 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司简介 鸠鸠互联网科技 互联网医疗科技 互联网科技的未来发展 互联网科技有限公司 翻译 互联网科技大会案例 美国互联网前沿科技 银川新华互联网科技学校地址 互联网对科技的发展 互联网科技产业特征 乌鲁木齐新华智原互联网科技学校 高科技互联网套路 元气玛特互联网科技公司是外包吗 艺电能源互联网科技有限公司招聘 悟空问答互联网科技 科技互联网专业工作会议发言稿 瑞安市蟠桃会互联网科技有限公司 北京瑞云互联网科技有限公司 互联网高科技绘画 互联网科技自媒体灵感 互联网 的科技创新 科技大学互联网专业好不好 互联网汽车科技小镇 现代科技和互联网有关系吗 广州优美互联网科技 互联网科技革命什么开始 知域互联网科技有限公司大骗子 乌鲁木齐新华智原互联网科技学校 互联网时代高科技布局 武汉亿视互联网科技有限公司
0