朴素的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函数来决定的,代码太多无益,看下面的图解即可:


wKioL1Q6FC6T364aAACwP_f2avU972.jpg


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



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1562879


相关文章
|
7月前
|
存储 Shell Linux
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
【Shell 命令集合 网络通讯 】Linux 显示Unix-to-Unix Copy (UUCP) 系统的状态信息 uustat命令 使用指南
85 0
|
9天前
|
Unix Linux 编译器
UNIX/Linux 上的安装
UNIX/Linux 上的安装。
26 2
|
1月前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
27天前
|
算法 前端开发 Linux
深入理解Linux内核调度器:CFS与实时性的平衡####
本文旨在探讨Linux操作系统的核心组件之一——完全公平调度器(CFS)的工作原理,分析其在多任务处理环境中如何实现进程间的公平调度,并进一步讨论Linux对于实时性需求的支持策略。不同于传统摘要仅概述内容要点,本部分将简要预览CFS的设计哲学、核心算法以及它是如何通过红黑树数据结构来维护进程执行顺序,同时触及Linux内核为满足不同应用场景下的实时性要求而做出的权衡与优化。 ####
|
2月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
4月前
|
Ubuntu 安全 Unix
在Linux中,有哪几种linux/unix发行版本?
在Linux中,有哪几种linux/unix发行版本?
|
4月前
|
Ubuntu Unix Linux
在Linux中,Unix和Linux之间的关系是什么?
在Linux中,Unix和Linux之间的关系是什么?
|
4月前
|
算法 Linux 调度
Linux源码阅读笔记03-调度器及CFS调度器
Linux源码阅读笔记03-调度器及CFS调度器
|
4月前
|
Unix Linux 程序员
Unix:Linux的“逗趣祖师爷”与它的不凡传承
在科技长河中,Unix犹如一颗恒星,既是历史见证者也是未来的启发者。1969年,因程序员肯·汤普森想在他的PDP-7上玩“Space Travel”游戏,意外创造了Unix,以简洁优雅的代码改变了操作系统的世界。进入90年代,林纳斯·托瓦兹受Unix启发,开发了开源免费的Linux,像是Unix调皮的孙子,不仅继承其精髓还增添了开放共享的精神。Unix与Linux之间的传承,就像是智者与追蝶孩童的故事,充满了岁月的智慧与新生的活力,提醒我们科技传奇往往源于不起眼的小事。下次使用Linux时,不妨会心一笑吧!
60 0
|
4月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
60 0