• linux操作系统的调度策略


    linux的进程分为两种

    1.实时进程,优先级高,操作系统会优先执行这种进程

    2.普通进程,大多数的进程都是这种进程

    调度策略

    unsigned int policy;

    调度策略的定义

    #define SCHED_NORMAL 0
    #define SCHED_FIFO 1
    #define SCHED_RR 2
    #define SCHED_BATCH 3
    #define SCHED_IDLE 5
    #define SCHED_DEADLINE 6

    配合调度策略的还有刚才我们说的优先级

    int prio, static_prio, normal_prio;
    unsigned int rt_priority;

    优先级其实就是一个数值,实时进程的取值范围是0-99,普通进程的取值范围是100-139,

    数字越小,优先级越高,可以看出来,所有实时进程的优先级都比普通进程的优先级高

     

    实时调度策略

    SCHED_FIFO SCHED_RR SCHED_DEADLINE 

    这三种调度策略都是针对实时进程的调度策略

     

    SCHED_FIFO 这种调度策略是遵从先到先得的规则,

    但是如果某个进程的优先级比另一个进程的优先级高

    那么可以抢占该进程,也就是说高优先级的进程可以抢占低优先级的进程

     

    SCHED_RR(轮流调度算法),采用时间片的方式,相同优先级的进程用完cpu的时间片后,就会被放到队列尾部,保证公平性

     

    SCHED_DEADLINE

    因为对于实时进程来说,进程需要在某个时间周期内执行完,否则就会出错

    所以这种策略就是优先执行deadline时间距离当前时间最近的进程

     

    普通调度策略

    SCHED_NORMAL:针对普通进程

    SCHED_BATCH:针对后台进程

    SCHED_IDLE:是特别空闲的时候才跑的进程

    我们重点说下普通进程的调度策略

    普通进程的调度策略是

    fair_sched_class,顾名思义,对于普通进程来说公平是最重要的

     

    完全公平调度算法

    linux里面实现了一个基于CFS的算法,全程是完全公平算法

    在linux中,每一个进程都有一个vruntime(虚拟运行时间),如果一个进程正在运行,那么该进程的vruntime就会变大,没有运行的进程的vruntime不会改变

    显然,那些vruntime少的进程需要优先执行,那么当cpu上当前正在运行的进程可以被抢占时就会选取所有进程中vruntime最小的进程

    还有个问题,就是优先级的这个问题咋解决呢

    在更新进程的运行统计量的时候可以看出来

    /*
    * Update the current task's runtime statistics.
    */
    static void update_curr(struct cfs_rq *cfs_rq)
    {
    struct sched_entity *curr = cfs_rq->curr;
    u64 now = rq_clock_task(rq_of(cfs_rq));
    u64 delta_exec;
    ......
    delta_exec = now - curr->exec_start;
    ......
    curr->exec_start = now;
    ......
    curr->sum_exec_runtime += delta_exec;
    ......
    curr->vruntime += calc_delta_fair(delta_exec, curr);
    update_min_vruntime(cfs_rq);
    ......
    }


    /*
    * delta /= w
    */
    static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se)
    {
    if (unlikely(se->load.weight != NICE_0_LOAD))
    /* delta_exec * weight / lw.weight */
    delta = __calc_delta(delta, NICE_0_LOAD, &se->load);
    return delta;
    }

     

    delta_exec = now - curr->exec_start;

    实际运行时间=当前时间-当前进程在cpu上运行的开始时间

    当时这样得到的只是实际运行时间,需要一定的转化才能得到虚拟运行时间

    虚拟运行时间 vruntime += 实际运行时间 delta_exec * NICE_0_LOAD/ 权重

    这个权重就是优先级的意思

    也就是说通过这个计算公式,对于同样的实际运行时间,给高权重的算少了,给低权重的算多了,但是选取下个进程的时候还是选取vruntime最少的一个进程

    这样高权重的进程获得的实际运行时间自然就多了

     了解更多:https://www.toutiao.com/c/user/83293539887/#mid=1633933053814798

  • 相关阅读:
    缺失的第一个正数
    tuple用法
    整数转罗马数字
    三种时间格式的转换
    不同包的调用
    正则表达式
    lgb模板
    线性回归
    时间序列的特征
    3D聚类
  • 原文地址:https://www.cnblogs.com/sjks/p/10852303.html
Copyright © 2020-2023  润新知