调度实体和调度组
任务组在每个处理器上有公平调度实体、公平运行队列、实时调度实体和实时运行队列,根任务组比较特殊:没有公平调度实体和实时调度实体。
任务组的下级
实时调度实体加入任务组的实时运行队列,任务组的实时调度实体加入上级任务组的实时运行队列。
为什么任务组在每个处理器上有一个公平调度实体和一个公平运行队列呢?因为任务组包含多个进程,每个进程可能在不同的处理器上运行。同理,任务组在每个处理器上也有一个实时调度实体和一个实时运行队列。
在每个处理器上,计算任务组的公平调度实体的权重的方法如下(参考源文件“kernel/sched/fair.c”中的函数update_cfs_shares)。
- 公平调度实体的权重=任务组的权重×负载比例
- 公平调度实体的负载比例=公平运行队列的权重/(任务组的平均负载−公平运行队列的平均负载+公平运行队列的权重)
- 公平运行队列的权重=公平运行队列中所有调度实体的权重总和
- 任务组的平均负载=所有公平运行队列的平均负载的总和
为什么负载比例不是公平运行队列的平均负载除以任务组的平均负载?公平运行队列的权重是实时负载,而公平运行队列的平均负载是上一次计算的负载值,更新被延迟了,我们使用实时负载计算权重。
当向队列中enqueue_entity或者dequeue_entity,或者当tick到达时定时更新entity_tick更新当前task的权重值。也就是当前实体的权重从整个group里面按照实际运行的实时负载的占比进行分配。