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

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. linux cfs调度器_理论模型

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

  2. linux cfs调度器

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

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

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

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

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

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

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

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

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

  7. Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)

    1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个 ...

  8. Linux CFS调度器之虚拟时钟vruntime与调度延迟--Linux进程的管理与调度(二十六)

    1 虚拟运行时间(今日内容提醒) 1.1 虚拟运行时间的引入 CFS为了实现公平,必须惩罚当前正在运行的进程,以使那些正在等待的进程下次被调度. 具体实现时,CFS通过每个进程的虚拟运行时间(vrun ...

  9. Linux CFS调度器之负荷权重load_weight--Linux进程的管理与调度(二十五)

    1. 负荷权重 1.1 负荷权重结构struct load_weight 负荷权重用struct load_weight数据结构来表示, 保存着进程权重值weight.其定义在/include/lin ...

随机推荐

  1. PHP重载以及Laravel门面Facade

    目录 重载的概念 魔术方法中的重载 属性重载 方法重载 Laravel中的Facade 扩展 谈谈__invoke Laravel提供了许多易用的Facade,让我们用起来特步顺手,那么这些Facad ...

  2. MAC版Eclipse的常用快捷键

    一.Command类 Command+1 快速修复 Command+d 删除当前行 Command+Option+↓ 复制当前行到下一行 Command+Option+↑ 复制当前行到上一行 Comm ...

  3. Extjs4.2 Tree使用技巧小结demo

    本案例使用了Ext.Tree.Panel的如下知识点: 1.刷新.重新加载Tree,定位到上次的节点位置 2.Tree的右键操作 3.Extjs4.x Tree获取当前选中的节点 4.新增.修改.删除 ...

  4. 前端CSS - 相对定位,绝对定位,固定定位

    前端CSS - 相对定位,绝对定位,固定定位 1.1 相对定位 position:relative 相对定位,就是微调元素位置的.让元素相对自己原来的位置,进行位置的微调. 也就是说,如果一个盒子想进 ...

  5. python 读写二进制文件实例

    本程序,首先写入一个矩阵到二进制文件中,然后读取二进制文件恢复到另外一个矩阵中. #coding:utf--8 #https://www.cnblogs.com/cmnz/p/6986979.html ...

  6. Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.

    在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点 ...

  7. Pandas DataFrame 函数应用和映射

    apply Numpy 的ufuncs通用函数(元素级数组方法)也可用于操作pandas对象: 另一个常见的操作是,将函数应用到由各列或行所形成的一维数组上.Dataframe的apply方法即可实现 ...

  8. Ext3.4实现增删查改(form版)

    var TaskPolicyStore = new Ext.data.JsonStore( {    autoLoad : false,    url : 'PolicyServlet?method= ...

  9. (笔记)Linux内核中内存相关的操作函数

    linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) ...

  10. Apache Commons CLI

    简单的说,就是对命令的参数进行定义和解析的工具 -- 这里说的参数是我们常用的说法,而CLI里则是Option.Options,参数值(如果有)则是Option的arg(s). ## 为什么 那么,为 ...