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

使用完全公平调度程序(CFS)进行多任务处理(1)

使用完全公平调度程序(CFS)进行多任务处理(1)

Linux 2.6.23 内核的调度程序为其他调度模块并行处理内核打好了基础(这里所说的 “模块化” 并不意味着将调度程序分解为若干可加载的模块,而是指代码本身模块化)。有关调度程序工作原理的更多细节,请参考 developerWorks 文章 “Inside the Linux scheduler”(参见本文末尾  小节中的链接)。  
主要特性和策略 最新版调度程序引入的主要特性包括:
  • 模块化调度程序
  • 完全公平调度程序(Completely Fair Scheduler,CFS)
  • CFS 组调度
模块化调度程序 调度类的引入显著增强了内核调度程序的可扩展性。这些类(调度程序模块)封装了调度策略。这个调度程序将调度策略模块化,但是与 Pluggable CPU 调度程序框架不同的是,并没有把调度程序本身模块化(后者在内核编译时选择默认调度程序,而通过在启动时向内核传递参数来使用其他 CPU 调度程序)。
CFS完全公平调度程序(CFS)试图按照对 CPU 时间的 “最大需求(gravest need)” 运行任务;这有助于确保每个进程可以获得对 CPU 的公平共享。如果某个任务休眠时间 “非常短”,那么 CFS 不会将该任务视为休眠任务 — 短暂休眠的进程可能会获得一些额外时间,但是决不会超过它的未休眠时间。
CFS 组调度考虑一个两用户示例,用户 A 和用户 B 在一台机器上运行作业。用户 A 只有两个作业正在运行,而用户 B 正在运行 48 个作业。组调度使 CFS 能够对用户 A 和用户 B 进行公平调度,而不是对系统中运行的 50 个作业进行公平调度。每个用户各拥有 50% 的 CPU 使用。用户 B 使用自己 50% 的 CPU 分配运行他的 48 个作业,而不会占用属于用户 A 的另外 50% 的 CPU 分配。                                                                                    
CFS 调度模块(在 kernel/sched_fair.c 中实现)用于以下调度策略:SCHED_NORMAL、SCHED_BATCH 和 SCHED_IDLE。对于 SCHED_RR 和 SCHED_FIFO 策略,将使用实时调度模块(该模块在 kernel/sched_rt.c 中实现)。
鉴于以下原因,需要对策略作出一些更改:
  • 更好地支持服务器和台式机调度。
  • 提供用户要求的新特性。
  • 改进启发式(heuristic)处理。vanilla 调度程序使用启发式处理可以更轻易地实现调度。同样,如果启发式处理错误估测了场景,将导致意料之外的行为。
CFS 和 RSDL 对比RSDL(Rotating Staircase Deadline Scheduler)RSDL 是一个进程调度程序,以前的 Linux 进程调度程序尝试使用统计信息推测启发式处理的预期行为(或出现的故障),而 RSDL 可以消除这种交互性评估代码和算法。RSDL 以 “公平” 概念为基础,平等对待所有进程并分配相同的时间片。这种调度程序并不关心或者试图猜测进程是 CPU 密集型还是 IO 密集型。RSDL 增强了用户感知的 “交互性”,并且,当 original O(1) 进程调度程序的创建者 Ingo Molnar 用来自 RSDL 的公平调度基本设计原理创建 CFS 后,RSDL 已被合并到 2.6 内核中。这一举措受到众多计算机爱好者的普遍认同,而 RSDL(创建者为 Con Kolivas)功不可没。

Con Kolivas 证明了实现 “公平调度” 不会与交互性的延迟目标相冲突。他已经使用 RSDL/SD 调度程序证明,公平性可以很轻易地实现,不需要使用复杂的启发式处理来判断进程的交互性。
CFS 没有使用优先级数组,它去掉了 vanilla 调度程序的数组切换工件。RSDL 和 CFS 之间的重要区别包括以下几点:
  • RSDL 基于 “严格的公平性” 概念;然而,CFS 还考虑到交互式进程的休眠时间长度,因此,短暂休眠进程对 CPU 时间的占用会略微多一些。
  • RSDL 使用诸如 vanilla 调度程序这样的优先级队列,而 CFS 没有使用。
  • RSDL 和 vanilla 调度程序会受到数组切换工件的影响,而 CFS 不会。
CFS 不会跟踪休眠时间,也不会使用启发式处理识别交互式任务 — 它仅仅确保在既定时间内,对于一定数量的可运行进程,每个进程获得公平的 CPU 占用。
返回列表