linux fair调度器
本文也是人三个方向来研究fair调度器的调度策略实现
1、fair权重的设置
2、task的入队操作
3、task的挑选
4、tick定时器的处理
fair调度器回调函数如下 :

fair权重的设置
大体的调用顺序如下:

也可以通过nice调用set_user_nice来重新设置权重
void reweight_task(struct task_struct *p, int prio)
{struct sched_entity *se = &p->se;struct cfs_rq *cfs_rq = cfs_rq_of(se);struct load_weight *load = &se->load;unsigned long weight = scale_load(sched_prio_to_weight[prio]);reweight_entity(cfs_rq, se, weight);load->inv_weight = sched_prio_to_wmult[prio];
}
const int sched_prio_to_weight[40] = {/* -20 */ 88761, 71755, 56483, 46273, 36291,/* -15 */ 29154, 23254, 18705, 14949, 11916,/* -10 */ 9548, 7620, 6100, 4904, 3906,/* -5 */ 3121, 2501, 1991, 1586, 1277,/* 0 */ 1024, 820, 655, 526, 423,/* 5 */ 335, 272, 215, 172, 137,/* 10 */ 110, 87, 70, 56, 45,/* 15 */ 36, 29, 23, 18, 15,
};
const u32 sched_prio_to_wmult[40] = {/* -20 */ 48388, 59856, 76040, 92818, 118348,/* -15 */ 147320, 184698, 229616, 287308, 360437,/* -10 */ 449829, 563644, 704093, 875809, 1099582,/* -5 */ 1376151, 1717300, 2157191, 2708050, 3363326,/* 0 */ 4194304, 5237765, 6557202, 8165337, 10153587,/* 5 */ 12820798, 15790321, 19976592, 24970740, 31350126,/* 10 */ 39045157, 49367440, 61356676, 76695844, 95443717,/* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153,
};
这里会通过优先级对weight和inv_weight两个成员变量进行赋值
task的入队
enqueue_task_fair->enqueue_entity->update_curr
_____________________________->place_entity
_____________________________->__enqueue_entity
vruntime的赋值:

对于一个全新的task,其值将会被设置成当前队列的了小vruntime.也就是说不管其优先级如何,其第一次调用的优先级是最高的。
update_curr 更新当前task的vruntime
static void update_curr(struct cfs_rq <