zoukankan      html  css  js  c++  java
  • 朴素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有利的是。不得不说。读史使人明智。

  • 相关阅读:
    XO Wave-数字音频编纂软件
    LSS:撰写 LaTeX 的扶直对象
    Ubuntu 推出能主动装置编码器、Flash、Java、MS 字体的新包
    目前国内主要有4家“播客”网站
    开始换用 Delphi 2009
    关于 Delphi 中流的使用(10): 压缩与解压缩进度 回复 "ilst" 的问题
    试试带参数的 Exit
    在 Delphi 中调用 JavaScript(2)
    在 Delphi 中调用 JavaScript(1) 回复 "fancy" 的问题
    如何获取重载函数的地址 回复 "flq_00000" 的问题
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5035040.html
Copyright © 2011-2022 走看看