CFS调度器的原理明白了但是有个地方,搜遍了整个网络也没找到一个合理的解释:

if (delta > ideal_runtime)

  resched_task(rq_of(cfs_rq)->curr);

这出代码是在patch:f685ceaca

sched: Strengthen buddies and mitigate buddy induced latencies

patch中描述和是LAST_BUDDY 和 wakeup preemption相关

buddy是什么意思?是调度队列中的而一个缓存,一个缓存LAST_BUDDY,一个是NEXT_BUDDY,其中LAST_BUDDY是上次执行唤醒操作的进程,NEXT_BUDDY是上次被唤醒的进程,这两个操作为什么这么不同?上面的调度还是考虑到普通的大众进程,还是没有考虑到进程冷热性。

为什么这里要单独考虑进程的冷热性?

为什么软件层面要考虑进程的冷热性?

为什么要考虑唤醒的进程和被唤醒的进程,唤醒的进程有什么特征,非唤醒的进程有什么特征?唤醒别人的进程|被别人唤醒的进程

目前网上没有一个让人信服的回答,还是kernel里的patch comment靠谱些:

patch:4793241be408b3926ee00c704d7da3b3faf3a05f

======================================

Currently we only have a forward looking buddy, that is, we prefer to
    schedule to the task we last woke up, under the presumption that its
    going to consume the data we just produced, and therefore will have
    cache hot benefits.

  刚刚被唤醒的进程的进程是有更高的优先级,因为在生产者-消费者模型中,生产者的内容内容很可能是hot的
    
    This allows co-waking producer/consumer task pairs to run ahead of the
    pack for a little while, keeping their cache warm. Without this, we
    would interleave all pairs, utterly trashing the cache.

否则的话,所有的进程都同等对待,这样对cache的利用不是好事情
    
    This patch introduces a backward looking buddy, that is, suppose that
    in the above scenario, the consumer preempts the producer before it
    can go to sleep, we will therefore miss the wakeup from consumer to
    producer (its already running, after all), breaking the cycle and
    reverting to the cache-trashing interleaved schedule pattern.

这个patch中,会反向看看buddy,在上面的生产者消费者模型中,消费者在sleep之前抢占了
    
    The backward buddy will try to schedule back to the task that woke us
    up in case the forward buddy is not available, under the assumption
    that the last task will be the one with the most cache hot task around
    barring current.

除了当前的进程之外,last task是占用cache资源最丰富的task
    
    This will basically allow a task to continue after it got preempted.
    
    In order to avoid starvation, we allow either buddy to get wakeup_gran
    ahead of the pack.

======================================

CFS 调度器的更多相关文章

  1. CFS调度器(1)-基本原理

    首先需要思考的问题是:什么是调度器(scheduler)?调度器的作用是什么?调度器是一个操作系统的核心部分.可以比作是CPU时间的管理员.调度器主要负责选择某些就绪的进程来执行.不同的调度器根据不同 ...

  2. Linux进程管理 (2)CFS调度器

    关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 ( ...

  3. CFS调度器

    一.前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了.这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭.我有一个循序渐进的方法,那就是先 ...

  4. Linux内核——进程管理之CFS调度器(基于版本4.x)

    <奔跑吧linux内核>3.2笔记,不足之处还望大家批评指正 建议阅读博文https://www.cnblogs.com/openix/p/3262217.html理解linux cfs调 ...

  5. 【原创】(五)Linux进程调度-CFS调度器

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  6. 从几个问题开始理解CFS调度器

    本文转载自从几个问题开始理解CFS调度器 导语 CFS(完全公平调度器)是Linux内核2.6.23版本开始采用的进程调度器,它的基本原理是这样的:设定一个调度周期(sched_latency_ns) ...

  7. linux cfs调度器_模型实现

    调度器真实模型的主要成员变量及与抽象模型的对应关系 I.cfs_rq结构体    a) struct sched_entity *curr        指向当前正在执行的可调度实体.调度器的调度单位 ...

  8. linux cfs调度器_理论模型

    参考资料:<调度器笔记>Kevin.Liu <Linux kernel development> <深入Linux内核架构> version: 2.6.32.9 下 ...

  9. linux cfs调度器

    在抽象模型中vruntime决定了进程被调度的先后顺序,在真实模型中决定被调度的先后顺序的参数是由函数entity_key决定的.   static inline s64 entity_key(str ...

随机推荐

  1. ABAP术语-Interface

    Interface 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/22/1077086.html Information tool that ...

  2. Mybatis中多个参数的问题&&动态SQL&&查询结果与类的对应

    ### 1. 抽象方法中多个参数的问题 在使用MyBatis时,接口中的抽象方法只允许有1个参数,如果有多个参数,例如: Integer updatePassword( Integer id, Str ...

  3. [Git add . ] 遇到The file will have its original line endings in your working directory 解决办法

    1.在新项目中使用[ git add . ]时出现: warning: LF will be replaced by CRLF in ...... The file will have its ori ...

  4. shell 输出带颜色字体

    输出特效格式控制:\033[0m  关闭所有属性  \033[1m   设置高亮度  \03[4m   下划线  \033[5m   闪烁  \033[7m   反显  \033[8m   消隐  \ ...

  5. 初学Node.js -环境搭建

    从毕业一直到现在都是在做前端,总感觉缺少点什么,java? PHP? .Net? 框架太多了,学起来不好掌握,听说node.js挺牛的,我决定把node.js好好的学一下.首先是环境的配置,这个配置真 ...

  6. 【tp5.1】微信公众号授权登录及获取信息录入数据库

    微信公众号开发文档链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432 微信公众号授权登录分为两种: 1.以 ...

  7. php-5.6.26源代码 - include_once、require_once、include、require、eval 的opcode处理器

    # ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER 实现在文件 php-\Zend\zend_vm_execute.h static int ZEND_FASTCALL ...

  8. Python学习手册之控制结构(二)

    在上一篇文章中,我们介绍了Python的一些控制结构,现在我们继续介绍剩下的 Python 控制结构.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9972 ...

  9. 当安装mongodb客户端出现了Failed to load list of databases

    在装mongodb最新版(4.1.5开发版)服务后,我用robo3t打开它的时候遇到了这个问题. 最直接的解决办法就是换一个mongodb版本,https://github.com/Studio3T/ ...

  10. LOOP AT SCREEN

    用法 主に.画面の属性を変更させるために使用する. 照会モードでは入力不可とするが入力可能モードでは入力可能とする.ラジオボタンAが選択された場合はラジオボタンBに関連する項目は非表示とするなど.   ...