调度器真实模型的主要成员变量及与抽象模型的对应关系

I、cfs_rq结构体
    a) struct sched_entity *curr
        指向当前正在执行的可调度实体。调度器的调度单位不是进程,而是可调度的实体。每个task_struct都嵌入了一个可调度实体sched_entity,所以每个进程是一个可调度实体。可以将多个进程捆绑在一起作为一个调度单位(即调度实体)进行调度。因此,可调度实体可以是一个进程,也可以是多个进程构成的一个组。为了简化,暂时把curr理解为指向当前正在运行的进程。
    d) struct rboot tasks_timeline                                                                                 
        cfs就绪队列是用红黑树来组织的,tasks_timeline存放红黑树的根节点。
    c) struct rb_node *rb_leftmost
        指向红黑树最左边的那个节点。即,vruntime值最小的那个进程对应的节点。
    d) unsigned long nr_running
        可运行进程的总数,即队列进程的总数加上正在运行的那个进程。
    e) struct load_weight load
        struct load_weight {
            unsigned long weight, inv_weight;
        }
        load.weight保存着cfs_rq队列上所有进程(包括当前正子运行的进程)的权重值weight的总和。
    f) min_vruntime
        min_vruntime用来解决下列问题:
        min_runtime调度模型的遗留问题————原有系统上运行A、B、C三个进程,新进程D被创建时它的runtime应该如何设置???或者,睡眠的进程醒来后其runtime该如何设置???
        min_vruntime的值初始的时候为0, schedule_tick周期性调度器负责周期性地调用min_vruntime的值和可运行的进程中最小的vruntime值比较,如果该进程的vruntime值比min_vruntime大,那么就将min_vruntime值更新为较大值。min_vruntime的值只会随着时间的推移增加,不会减少。(注意:min_vruntime的值有可能比一些进程的vruntime大)。

II、sched_entity结构体
    a) unsigned int on_rq
        用来标识该实体上是否在就绪的队列上,如果在就绪队列上则该值非零。
    b) struct load_weight load
        load.weight表示该调度实体的权重
    c) u64 sum_exec_runtime
        表示进程已经执行的实际时间,对应抽象模型中的runtime
    d) u64 pre_sum_exec_runtime
        进程在切换经CPU时的sum_exec_runtime值
        sum_exec_runtime - pre_sum_exec_runtime等于进程获得CPU使用权后总的总时间。(ideal_runtime已被消耗了多少)
    e) u64 vruntime
        该进程已经运行的虚拟时间,对应抽象模型中的vruntime。
    f)u64 exec_start
         表示上次tick中断时设置的时间戳。

注意rq:clock表示本次tick发生时的时间戳。

抽象模型和真实模型的对应关系
    
    抽象模型                           真实模型                                                    说明
-----------------------------------------------------------------------------------------------
    task->runtime             task->se.sum_exec_runtime     每个进程对应一个可调度实体,

在task_struct的结构体,该实体

就是成员变量se。
-----------------------------------------------------------------------------------------------
    task->weight              task->se.load.weight
-----------------------------------------------------------------------------------------------
    task->vruntime           task->se.vruntime
-----------------------------------------------------------------------------------------------
    sum_weight(task,N)  cfs_rq->load.weight                    在抽象模型中,我们计算ideal_runtime

的时候需要求所有进程的权重值

的和,在实现的时候, 没有求和

的过程,而是把该值记录在就绪

队列 的load.weight中。向就绪队

列中添加新进程时,就加上新进

程的权重值,进程被移除就绪队

列时则减去被移除的进程的权重。
-----------------------------------------------------------------------------------------------
                                   cfs_rq->min_vruntime                   该值用来解决之前在抽象模型中遗留

的问题(新加入进程的runtime如

何处理,进程睡眠唤醒后的 runtime

如何处理……),因此没有抽象

模型中与之对应的值。
-----------------------------------------------------------------------------------------------
    task->ideal_runtime     sched_slice()函数                  每个进程的ideal_runtime并没有用

变量保存起来,而是在需要用

到时用函数sched_slice()计算

得到。
                                                                                                                 task[i]->se.load.weight
                                                                             task[i]->ideal_runtime = -------------------------  * period
                                                                                                                  cfs_rq->load.weight
-----------------------------------------------------------------------------------------------
    period                       __sched_period()函数              period也没有用变量来保存,用函

数计算得到。
                                                                   sysctl_sched_latency * (nr_running / sysctl_nr_latency)
-----------------------------------------------------------------------------------------------

linux cfs调度器_模型实现相关推荐

  1. 用c语言实现对n个进程采用“短进程优先”算法的进程调度_为什么Linux CFS调度器没有带来惊艳的碾压效果?...

    文章转自公众号"人人都是极客" 但凡懂Linux内核的,都知道Linux内核的CFS进程调度算法,无论是从2.6.23将其初引入时的论文,还是各类源码分析,文章,以及Linux内核 ...

  2. 为什么Linux CFS调度器没有带来惊艳的碾压效果? | CSDN博文精选

    任何领域,革命性的碾压式推陈出新并不是没有,但是概率极低,人们普遍的狂妄在于,总是认为自己所置身的环境正在发生着某种碾压式的变革,但其实,最终大概率不过是一场平庸. 作者 | dog250 责编 | ...

  3. Linux CFS调度器:原理和实现

    目录 CFS调度器的重点 基本概念 一些问题 源码和补充 调度类和调度策略 优先级分类 多处理器系统 rq的平衡 概念部分只讲解CFS调度器 CFS调度器的重点 基本概念 Linux 2.6版本在我看 ...

  4. Linux CFS调度器分析

    进程被调度的条件是什么,以及真正发生调度的时刻又是在哪里? 以下结论和代码分析都是基于最新Linux master分支(Linux5.0) 1. 调度的时刻 1.1 当前进程主动放弃CPU或者调用ms ...

  5. cpu调度的最小单位_Linux CFS调度器

    一直没有写过关于Linux内核调度器的内容,这几天被问起,简单的讲了讲,收到一堆challenge,这次决定做一个通篇总结方便自己整理思路. 要说Linux2.4和2.6最大的差异就在于CFS调度器的 ...

  6. 【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 | 五种调度类 )

    文章目录 一.CFS 调度器概念 ( 完全公平调度器 ) 二.CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三.进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实 ...

  7. Linux调度器及CFS调度器

    Linux调度器及CFS调度器 调度器 调度器类sched_class结构体 进程的优先级 调度策略 CFS调度器 实际运行时间 虚拟运行时间 调度器结构分析 调度器 ​ 调度:就算按照某种调度的算法 ...

  8. 【Linux 内核】CFS 调度器 ⑥ ( CFS 调度器就绪队列 cfs_rq | Linux 内核调度实体 sched_entity | “ 红黑树 “ 数据结构 rb_root_cached )

    文章目录 一.CFS 调度器就绪队列 cfs_rq 二.Linux 内核调度实体 sched_entity 三." 红黑树 " 数据结构 rb_root_cached 一.CFS ...

  9. 【Linux 内核】CFS 调度器 ⑤ ( CFS 调度器类 fair_sched_class 源码 | next 赋值 | enqueue_task 赋值 | dequeue_task 赋值 )

    文章目录 一.调度器类 sched_class 简介 二.CFS 调度器类源码 三.next 赋值 四.enqueue_task 赋值 五.dequeue_task 赋值 一.调度器类 sched_c ...

最新文章

  1. 《大道至简》第一章编程的精义伪代码读后感
  2. 网页怎么在图片上添加文字_想给图片添加文字,留白,添加小印章?用手机三步搞定...
  3. 学习笔记57_WCF基础
  4. 面向对象的程序设计-模块二课程总结
  5. C语言试题五十六之计算并输出给定整数n的所有因子(不包括1与自身)之和。规定n的值不大于1000。
  6. Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护
  7. Java 死锁及解决方法
  8. 20190920 On Java8 第二十章 泛型
  9. 工厂和反射的使用方法
  10. IDL where函数与array_indices函数
  11. 第一章:WTL的5个W
  12. Idea集成使用SVN教程
  13. 云服务器安装不了声卡,驱动精灵怎么安装声卡 声卡驱动安装方法
  14. android toast 大小,Android Toast实现全屏显示
  15. MAC 外接键盘卡顿处理
  16. 高校选课系统的设计与实现
  17. python元组使用什么符号表示方括号_Python的精髓居然是方括号、花括号和圆括号!...
  18. BS 476-31 与BS 476-33 测试方法是类似的吗?
  19. 国产芯片---超高速、高输出电流,电压反馈放大器MS8241兼容替代LM7171
  20. c#语言用XmlReader解析超大XML文件

热门文章

  1. Redis数据结构——字典-hashtable
  2. No valid Qt version set. Set one in Tools/Options 问题(QT)
  3. 插入数据前查询是否存在_异步检测数据是否存在的修订
  4. 关于配置中心的几个问题
  5. 深入理解RocketMQ中的NameServer
  6. java使用rabbitmq
  7. 【C++探索之旅】第二部分第一课:面向对象初探,string的惊天内幕
  8. dp、sp 转换为 px 的工具类
  9. 关于Java Collections Framework的一些总结(2)
  10. javascript脚本中使用json2.js解析json