linux2.6 CFS 调度算法分析
概述
CFS( completely fair schedule )是最终被内核采纳的
调度器。它从 RSDL/SD 中吸取了完全公平的思想,不再跟 踪进程的睡眠时间,也不再企图区分交互式进程。它将所有
的进程都统一对待,这就是公平的含义。 CFS 的算法和实现
都相当简单, 众多的测试表明其性能也非常优越。CFS
都相当简单, 众多的测试表明其性能也非常优越。
CFS
背后的主要想法是维护为任务提供处理器时间方面的平衡
公平性)。这意味着应给进程分配相当数量的处理器。分 给某个任务的时间失去平衡时(意味着一个或多个任务相对
于其他任务而言未被给予相当数量的时间) ,应给失去平衡 抛弃了复杂的算法,从一个新的起点开始了调度器的新时 代,最开始的 2.6.23 版本, CFS 提供一个虚拟的时钟,所有 进程复用这个虚拟时钟的时间, CFS 将时钟的概念从底层体 系相关的硬件中抽象出来,进程调度模块直接和这个虚拟的 时钟接口 而不必再为硬件时钟操作而操心,如此一来,整个进程调度 模块就完整了, 从时钟到调度算法, 到不同进程的不同策略, 全部都由虚拟系统提供,也正是在这个新的内核,引入了调 度类。因此新的调度器就是不同特性的进程在统一的虚拟时
的任务分配时间,让其执行。CFS 抛弃了时间片,
的任务分配时间,让其执行。
CFS 抛弃了时间片,
钟下按照不同的策略被调度。按照作者
钟下按照不同的策略被调度。
按照作者 Ingo Molnar
的说法: "CFS 百分之八十的工作可以用一句话概括:CFS
在真实的硬件上模拟了完全理想的多任务处理器 "。在“完全
理想的多任务处理器 “下,每个进程都能同时获得 CPU 的 执行时间。当系统中有两个进程时, CPU 的计算时间被分成 两份,每个进程获得 50% 。然而在实际的硬件上,当一个进 程占用 CPU 时,其它进程就必须等待。这就产生了不公平。
相关概念
调度实体(sched entiy):就是调度的对象,可以理解为进程。
虚拟运行时间 (vruntime) :即每个调度实体的运行时间。 任务 的虚拟运行时间越小, 意味着任务被允许访问服务器的时间越短 — 其对处理器 的需求越高。
公平调度队列(cfs_rq):采取公平调度的调度实体的运行队 列。 3.CFS 的核心思想
全公平调度器(CFS)的设计思想是:在一个真实的
硬件上模型化一个理想的、精确的多任务 CPU
硬件上模型化一个理想的、
精确的多任务 CPU
该理想 CPU
模型运行在 100%的负荷、在精确
平等速度下并行运行每个任务, 每个任务运行在1/n
平等速度下并行运行每个任务, 每个任务运行在
1/n 速度下,
CPU 整个即理想 CPU 有 n
CPU 整个
负荷的 1/n。
由于真实硬件上,每次只能运行一个任务,这就得引
入"虚拟运行时间 "(virtual runtime )的概念,虚拟运行时间 为一个任务在理想 CPU 模型上执行的下一个时间片
(timeslice) 。实际上, 一个任务的虚拟运行时间为考虑到运行
任务总数的实际运行时间。CFS
任务总数的实际运行时间。
CFS 背后的主要想法是
维护为任务提供处理器时间方面的平衡(公平性)。
维护为任务提供处理器时间方面的平衡(公平性)
。CFS 为
了体现的公平表现在 2 个方面
(1)进程的运行时间相等
CFS 在叫做虚拟运行时 的地方维持提供给某个任务
的时间量。任务的虚拟运行时越小, 意味着任务被允许访问服务器的时间越短 — 其对处理器 的需求越高。
例如,如果具有 4 个可运行的任务,那么 fair_clock
将按照实际时间速度的四分之一增加。每个任务将设法跟上 这个速度。这是由分时多任务处理的量子化特性决定的。也 就是说, 在任何一个时间段内只有一个任务可以运行; 因此, 其他进程在时间上的拖欠将增大( wait_runtime )。因此,
旦某个任务进入调度,它将努力赶上它所欠下的时间(并且 会停止计时)。
要比所欠时间多一点,因为在追赶时间期间,fair_clock
要比所欠时间多一点,因为在追赶时间期间,
fair_clock 不
加权任务引入了优先级。假设我们有两个任务:其
中一个任务占用 CPU 的时间量是另一个任务的两倍,比例 为 2:1 。执行数学转换后,对于权重为 0.5 的任务,时间流 逝的速度是以前的两倍。
(2)睡眠的进程进行补偿
CFS 还包含睡眠公平概念以便确保那些目前没有运
行的任务(例如,等待 I/0 )在其最终需要时获得相当份额
的处理器。CFS 调度器的运行时间是 O(logN) ,而以
的处理器。
前的调度器的运行时间是0(1),这是不是就是说 CFS的