zoukankan      html  css  js  c++  java
  • linux cfs调度器_模型实现

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

    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)
    -----------------------------------------------------------------------------------------------                   

  • 相关阅读:
    学习jQuery必须知道的几种常用方法
    Jquery技巧总结
    代码测试
    NOIP2003 神经网络
    NOIP2003 传染病控制
    NOIP2003 加分二叉树
    NOIP2004 虫食算
    NOIP2004 合唱队列
    NOIP2004 合并石子
    NOIP2004 津津的储蓄计划
  • 原文地址:https://www.cnblogs.com/openix/p/3256411.html
Copyright © 2011-2022 走看看