基于Linux 4.5的进程模型与调度器分析(5)

调度器不限于调度进程, 还可以调度更大的实体, 比如实现组调度: 可用的CPUI时间首先在一半的进程组(比如, 所有进程按照所有者分组)之间分配, 接下来分配的时间再在组内进行二次分配,这种一般性要求调度器不直接操作进程, 而是处理可调度实体, 因此需要一个通用的数据结构描述这个调度实体,即seched_entity结构, 其实际上就代表了一个调度对象,可以为一个进程,也可以为一个进程组。linux中针对当前可调度的实时和非实时进程, 定义了类型为seched_entity的3个调度实体:

调度实体   名称   描述   对应调度器类  
sched_dl_entity   DEADLINE调度实体   采用EDF算法调度的实时调度实体   dl_sched_class  
sched_rt_entity   RT调度实体   采用Roound-Robin或者FIFO算法调度的实时调度实体   rt_sched_class  
sched_entity   CFS调度实体   采用CFS算法调度的普通非实时进程的调度实体   fair_sched_class  
  2.5CFS调度器.

    CFS完全公平调度器的调度器类叫fair_sched_class,下面是linux 4.5中的数据结构:

/*
 * All the scheduling class methods:
 */
const struct sched_class fair_sched_class = {
    .next            = &idle_sched_class,
    .enqueue_task        = enqueue_task_fair,
    .dequeue_task        = dequeue_task_fair,
    .yield_task        = yield_task_fair,
    .yield_to_task        = yield_to_task_fair,

.check_preempt_curr    = check_preempt_wakeup,

.pick_next_task        = pick_next_task_fair,
    .put_prev_task        = put_prev_task_fair,

#ifdef CONFIG_SMP
    .select_task_rq        = select_task_rq_fair,
    .migrate_task_rq    = migrate_task_rq_fair,

.rq_online        = rq_online_fair,
    .rq_offline        = rq_offline_fair,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12804.html