Linux CFS调度算法之虚拟时钟vruntime

时间:2021-11-16 14:37:39

    参考网址:https://blog.csdn.net/gatieme/article/details/52067748

    1.cfs调度算法

        系统使用fair_sched_class调度类调度管理普通进程,采用的策略有:SCHED_NOMAL和SCHED_BATCH。

    CFS调度算法采用红黑树方式组织进程或进程组,红黑树的键值为虚拟时间:vruntime。虚拟时间越小,越靠近红黑树的最左边,那么越容易被调度执行。注意只有等待cpu的就绪态进程在这棵树上,睡眠进程和正在运行的进程都不在树上。

    2.vuntime-虚拟运行时间

    vruntime在时钟中断中周期性的更新,update_curr->calc_delta_fair函数中计算虚拟时间:

    (1)curr.nice != NICE_0_LOAD

            curr->vruntime += delta_exec*(NICE_0_LOAD/curr->se->load.weight)

    (2)curr.nice == NICE_0_LOAD

            curr->vruntime += delta_exec

        delta_exec:curr进程在CPU上运行的时间

    优先级越高,权重越大,vruntime行走的就越慢,那么在红黑树种向右移动的速度就越慢,cpu调度该进程的几率就越大。

    进程入就绪队列和出就绪队列的时候,也会调用update_curr更新虚拟时间

    3.调度周期

   sysctl_sched_latency: 调度延迟:保证每个可运行的进程应该至少运行一次的某个时间间隔,可以通过/proc/sys/kernel/sched_latency_ns查看和修改。换句话说:就绪队列中多有进程运行一遍所需要的时间,这个是经验值:sum_runtime。

    sched_nr_latency:延迟周期中处理的最大活动进程数目。

    sum_runtime(就绪队列中所有进程运行一遍所用的时间):

    (1)就绪队列中进程数目>sched_nr_latency,sum_runtime = sysctl_sched_min_granularity*nr_running

    (2)就绪队列中进程数目<sched_nr_latency,sum_runtime = sysctl_sched_latency