Linux进程调度

1 CFS调度

CFS没有时间片的概念,也不是根据优先级来决定下一个该运行的进程

CFS是通过计算进程消耗的CPU时间(加权之后)来确定下一个该运行的进程。从而到达所谓的公平性。

分配给进程的运行时间 = 调度周期 * 进程权重 / 所有进程权重之和

Linux通过引入virtual runtime(vruntime)来实现CFS

实际上vruntime就是根据权重将实际运行时间标准化

谁的vruntime值较小就说明它以前占用cpu的时间较短,受到了“不公平”对待,因此下一个运行进程就是它。这样高nice值的进程能得到迅速响应,低nice值的进程能获取更多的cpu时间。

Linux采用了一颗红黑树(对于多核调度,实际上每一个核有一个自己的红黑树),记录下每一个进程的vruntime

红黑树操作的算法复杂度最大为O(lgn)

请阅读2.6.34内核kernel/sched_fair.c中的下列结构体或函数:

调度器实体结构: struct sched_entity

虚拟时间记账: update_curr、__update_curr

进程选择: pick_next_entity、enqueuer_entity、dequeuer_entity

调度器入口: pick_next_task