参考网址: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