首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用完全公平调度程序(CFS)进行多任务处理(4)内核中的变化

使用完全公平调度程序(CFS)进行多任务处理(4)内核中的变化

Linux 2.6.24 版本中有哪些值得期待的新变化?新版本中不再追赶全局时钟(fair_clock),任务之间将彼此追赶。将引入每个任务(调度实体)的时钟 vruntime(wall_time/task_weight),并且将使用近似的平均时间初始化新任务的时钟。
其他重要改动将影响关键数据结构。下面展示了 struct sched_entity 中的预期变动:
清单 6. 2.6.24 版本中 sched_entity 结构的预期变动
1
2
3
4
5
6
7
8
9
struct sched_entity { /* Defined in /usr/include/linux/sched.h */
- long    wait_runtime;
- s64     fair_key;
+ u64     vruntime;
- u64     wait_start_fair;
- u64     sleep_start_fair;
      ...
      ...
}




以下是 struct cfs_rq 中的变动:
清单 7. 2.6.24 版本中 cfs_rq 结构的预期变动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct cfs_rq { /* Defined in kernel/sched.c */
-         s64 fair_clock;
-         s64 wait_runtime;
-         u64 sleeper_bonus;
-         unsigned long wait_runtime_overruns, wait_runtime_underruns;
+        u64 min_vruntime;
  
+        struct sched_entity *curr;
  
+#ifdef CONFIG_FAIR_GROUP_SCHED
       ...
+        struct task_group *tg;    /* group that "owns" this runqueue */
       ...
#endif
};




组任务中引入了一个全新结构:
清单 8. 新添加的 task_group 结构
1
2
3
4
5
6
7
8
9
10
11
12
13
struct task_group { /* Defined in kernel/sched.c */
    #ifdef CONFIG_FAIR_CGROUP_SCHED
        struct cgroup_subsys_state css;
   #endif
        /* schedulable entities of this group on each cpu */
        struct sched_entity **se;
        /* runqueue "owned" by this group on each cpu */
        struct cfs_rq **cfs_rq;
        unsigned long shares;
        /* spinlock to serialize modification to shares */
        spinlock_t lock;
        struct rcu_head rcu;
};




每个任务都跟踪它的运行时,并根据该值对任务进行排队。这意味着运行最少的任务将位于树的最左侧。同样,通过对时间加权划分优先级。每个任务在下面的时间段内力求获得精确调度:
sched_period = (nr_running > sched_nr_latency)  ? sysctl_sched_latency : ((nr_running * sysctl_sched_latency) / sched_nr_latency)
其中 sched_nr_latency =        (sysctl_sched_latency / sysctl_sched_min_granularity)。这表示,当可运行任务数大于 latency_nr 时,将线性延长调度周期。sched_fair.c 中定义的 sched_slice() 是进行这些计算的位置。
因此,如果每个可运行任务运行与 sched_slice() 等价的时间,那么将花费的时间为 sched_period,每个任务将运行与其权重成比例的时间量。此外,在任何时刻,CFS 都承诺超前运行 sched_period,因为最后执行调度的任务将在这个时限内再次运行。
因此,当一个新任务变为可运行状态时,对其位置有严格的要求。在所有其他任务运行之前,此任务不能运行;否则,将破坏对这些任务作出的承诺。然而,由于该任务确实进行了排队,对运行队列的额外权重将缩短其他所有任务的时间片,在 sched_priod 的末尾释放一点位置,刚好满足新任务的需求。这个新的任务就被放在这个位置。
2.6.24 中的组调度增强在 2.6.24 中,您将能够对调度程序进行调优,从而实现对用户或组的公平性,而不是任务公平性。可以将任务进行分组,形成多个实体,调度程序将平等对待这些实体,继而公平对待实体中的任务。要启用这个特性,在编译内核时需要选择 CONFIG_FAIR_GROUP_SCHED。目前,只有 SCHED_NORMAL 和        SCHED_BATCH 任务可以进行分组。
可以使用两个独立的方法对任务进行分组,它们分别基于:
  • 用户 ID。
  • cgroup pseudo 文件系统:这个选项使管理员可以根据需要创建组。有关更多细节,阅读内核源文档目录中的 cgroups.txt 文件。
内核配置参数 CONFIG_FAIR_USER_SCHED 和        CONFIG_FAIR_CGROUP_SCHED 可帮助您进行选择。
返回列表