2.6.2.3 调度逻辑 - 调度周期
/* file: kernel/sched/fair.c */
/* 参数 nr_running 表示当前 cfs_rq 中的任务总数 */
static u64 __sched_period(unsigned long nr_running) {
/* sched_nr_latency: 8 */
if (unlikely(nr_running > sched_nr_latency))
/* sysctl_sched_min_granularity: 0.75ms */
return nr_running * sysctl_sched_min_granularity;
else
/* sysctl_sched_latency: 6ms*/
return sysctl_sched_latency;
}/* file: kernel/sched/fair.c */
static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) {
unsigned int nr_running = cfs_rq->nr_running;
u64 slice;
/* 调度周期 */
slice = __sched_period(nr_running + !se->on_rq);
/* 暂时不考虑组调度,此处的循环只会执行一次 */
for_each_sched_entity(se) {
struct load_weight *load;
struct load_weight lw;
cfs_rq = cfs_rq_of(se);
/* 整个运行队列 cfs_rq 的总权重 */
load = &cfs_rq->load;
/* se->load.weight为se的权重,调用函数__calc_delta得到slice*se->load.weight/load.weight,
* 即根据 se 在整个队列中的权重比例分配时间 */
slice = __calc_delta(slice, se->load.weight, load);
}
if (sched_feat(BASE_SLICE))
slice = max(slice, (u64)sysctl_sched_min_granularity);
return slice;
}Last updated