CFS简介
Linux中大名鼎鼎的CFS调度器是专门为普通进程设计的调度器,CFS调度器的核心是虚拟运行时间vruntime。虚拟运行时间一方面跟进程运行时间有关,另一方面跟进程优先级有关,总的来说,进程占用CPU时间越长,进程优先级越低,其vruntime就越大。vruntime越小,代表CPU对进程的宠幸越少,那么后续就需要优先宠幸它;反之,vruntime越大,代表CPU对进程的宠幸越多,那么后续就需要对它做出一定的惩罚,减少对它的宠幸。CFS调度器就是要在各个进程间维持一种相对的公平,既不能过多宠幸某个进程,也不多过分亏欠某个进程,所有进程同属于一个大家庭,任何一个进程受到亏欠,都会影响整个大家庭。
所有的普通进程以vruntime为键值加入红黑树,vruntime越小,在红黑树的位置越靠左,vruntime越大,在红黑树的位置越考右。CFS调度器从最左边的进程开始调度,进程被调度后,vruntime增加,进程因而向右移动。
更新虚拟运行时间
update_curr函数更新虚拟运行时间,更新虚拟运行时间的时机有很多,主要有以下几种:
- 定时器tick中断中
task_tick_fair->entity_tick(cfs_rq, se, queued);->update_curr(cfs_rq);
- 进程入CFS调度队列的时候
enqueue_task_fair->enqueue_entity(cfs_rq, se, flags);->update_curr(cfs_rq);
- 进程出CFS调度队列的时候
dequeue_task_fair->dequeue_entity(cfs_rq, se, flags);->update_curr(cfs_rq);
- 进程创建的时候
task_fork_fair->update_curr(cfs_rq);
更新虚拟运行时间的函数如下,逻辑并不复杂,我们下面详细分析:
static void update_curr(struct cfs_rq *cfs_rq)
{