概述

    对于多处理器调度,此处概述了多个处理器可能带来的问题和设计上的一些问题;对于实时调度,概述了两种调度方法:限时调度和速率单调调度。

1 多处理器调度

    多处理器系统可以分为以下几类:

  • 松耦合、分布式处理器、集群:有一系列相对自治的系统组成,每个处理器有自己的内存和I/O通道。

  • 专门功能的处理器:I/O处理器时一个例子,此时有一个通用的主处理器,专门处理器受主处理器的控制,并给主处理器提供服务。

  • 紧耦合多处理器:由一系列共享同一个内存并在操作系统完全控制的处理器组成,这里详细分析。

1.1 多处理器带来的问题

    调度上需要考虑三种问题:

  • 将进程分配到处理器。

  • 在单个处理器上使用多道程序设计。

  • 一个进程 的实际分派。

1.1.1将进程分配到处理器

    如果多处理器结构统一,即在内存、I/O设备的访问时没有特殊的优势,最简单的方法时将处理器看作一个资源池,然后按照要求分配到对应处理器。那么要静态还是动态分配呢?

    如果一个进程的生命周期都被分配到一个处理器上(静态分配),则需要为每个处理器维护一个短程队列,优点是开销小(所有进程只分配一次,使用专门处理器的一个策略时组调度),缺点时一个处理器可能一直处于空闲状态,而另一个处理器积压许多工作,避免此方法是使用一个公共队是列,所有进程进入并分配到任意一个可用的处理器上。在紧密耦合的共享储存器结构中,所有处理器可以得到任意进程的上下文环境信息(调度进程的开销与被调度到的处理器无关)。另一种分配方法是动态负载均衡(动态分配),线程可以在不同处理器所对应的队列里转移,Linux使用此策略。

    在分配到处理器的过程中,主要有两种方法:主从式、对等式。

  • 主从试:操作系统的主要核心功能在某个特定的处理器上运行,其他处理器可能仅仅用于执行用户进程。主处理器负载调度作业,如果从处理器需要I/O调用等服务,则必须给主处理器发送请求,然后等待服务执行。由于主处理拥有对所有存储器和I/O资源的控制,可以简化冲突解决方案,所以几乎不需要对单处理器多道程序操作系统进程增强。同时主处理器的失败会导致整个系统的失败,主处理器可能为性能瓶颈。

  • 对等式:操作系统可以在任何处理器上执行。每个处理器从进场池里进行自调度。操作系统的稳定性和性能相对主从试较高,但同时增加了操作系统的复杂性:操作系统必须确保不能一个进程被多个处理器选择,进程也不能在队列里丢失,所以要采用一些可以解决同步竞争资源请求的技术。

  • 当然还有在两个极端之前的方法:可以提供处理器子集而非一个处理器,以专门用于内核的处理;基于优先级和执行历史来管理内核进程和其他进程之前的需求差异。

1.1.2 在单处理器上使用多道程序设计

    如果每个进程使用静态分配,就会有一个新问题:此处理器支持多道程序吗?如果绑定后因为等待I/O或考虑到并发/同步而被频繁阻塞,则会有处理器的浪费。

1.1.3 进程分派

    这是关于选择那个进程运行的策略,在多道单处理器上面,使用优先级或基于历史的高级调度算法比简单的FCFS策略性能更好。而在多处理器上,这些复杂性可能不必要,甚至有相反效果,而简单的方法可能更有效。对于线程调度则有比优先级或执行历史更重要的新问题。

1.2 进程调度

    实际大多数传统处理器系统,使用多条基于优先级的队列,且都在相同的处理池中执行。并非指定专门处理器或一个处理器使用一个队列。

    在一个双处理器和单处理器系统里,多处理的每个处理器处理速度是单处理的一半。使用FCFS调度、轮转法和最短剩余时间法后进行比较,得到进程服务时间的对比,即一个进程的生命周期里使用处理器的时间。轮转法的时间片长度比上下文环境切换的开销大,且比平均服务时间短。该执行结果取决于每个进程之间的服务时间变化,从每个服务时间的差异从0增加,可得到一个结论:对于双处理器,不同调度算法的差距没有单处理表现的大,当处理器增多时该结论更加确定。因此多处理器使用简单的FCFS或静态优先级方案的FCFS即可。(在多处理器的FCSF调度中,一个长进程很少被中断,其他进程可以使用其他的处理器,因此相对单处理器短进程等待时间较少)

(见文献Sauer, C. and Chandy, K. Computer Systems Performance Mondling. Englewood Cliffs, NJ:Prentice Hall, 1981)

1.3 线程调度

    有4种比较突出的方法:

1.3.1 负载分配

    进程不是分配到固定的处理器,而是有系统维护一个就绪进程的全局队列,当处理器空闲时就从队列里选择一个进程。

    优点是:

  • 负载均匀分布在各处理器上,有工作可做时,没有处理器空闲。

  • 不需要集中调度器。操作系统调度例程在空闲的处理器上运行以选择就绪线程。

  • 可以选择单处理调度的方案组织和访问全局队列,包括基于优先级和执行历史或预处理请求的方案。 负载分配方案:

  • FCFS:为空闲处理器选择全局共享队列末尾的就绪线程,直到完成或阻塞。

  • 最少线程数优先:空闲就绪队列被组织成优先级队列,如果一个作业的位调度线程数目最少则优先级最高,优先级相同则优先执行先到达的作业,被调度的线程一直运行直到阻塞或结束。

  • 可抢占最少线程数优先:如果一个新到的作业包含线程数少于当前正在执行的作业,则抢占执行。 通过实验得出,FCFS的效果优于其他两个调度策略。

    缺点是:

  • 中心队列占据了必须互斥访问的存储器区域,当特别多的处理器同时查找工作时可能出现瓶颈。

  • 被抢占的线程可能不在同一个处理器上恢复运行,如果每个处理器都配备一个本地高速缓存,则缓存效率较低。

  • 如果所有线程看做公共的线程池,则一个程序的线程不能同时被多个处理器访问。如果一个程序的线程之间需要高度的合作,则涉及的进程切换可能会影响性能。

1.3.2 组调度

    一组相关进程基于一对一的原则,同时调度到一组处理器上运行。提高程序性能的显著方式是使进程切换开销最小,即让有联系的线程可以同时运行。可以按照每个应用程序的线程个数加权分配不同的组调度时间,以减少处理器浪费的时间。

    优点:

  • 如果紧密相关的进程并行执行,则同步阻塞的可能会减少,并且进程切换也会变少,性能会提高。

  • 调度开销可能减少,因为一个决策可以影响到许多的处理器和进程。

1.3.3 专用处理器分配

    与负载分配的方法相反,指定线程运行到某个处理器。处理器数目与线程数相等,线程结束时处理器返回到处理器池里。

    看上去会浪费处理器时间,即应用程序一个线程被阻塞且等待I/O或与其他线程的同步,则该处理会一直空闲,属于非多道程序设计。但有以下两点的情况可以解释使用此策略的原因:

  • 在高度并行的系统中,有几十或几百个处理器,每个处理器只占用系统总代价的一笑部分,处理器利用率不是衡量有效性或性能的一个重要因素。

  • 在一个程度的声明周期里要避免进程切换而加快程序的运行速度,类似操作系统的单处理器的存储器分配问题,即一定时刻分配给一个程序多少处理器(一定时刻给进程分配多少页框)。

    在其他方案里提出一个类似虚拟内存的工作集术语--活动工作集:为了保证应用程序以可接受的速度运行,在处理器上必须同时调度的最少数目的线程。和存储器管理方案一样,调度活动工作集中所有元素是的失败可能导致处理器抖动:调度其他线程时,取消了未来将要调度执行的线程。类似内存碎片,处理器碎片指当一些处理器剩余的数目和合适程度上不满足正在等待的应用程序的需要。而组调度和专用处理器分配则有意避免这些问题。

1.3.4 动态调度

    线程数可变,通过调整负载提高利用率。

    将处理器分配给作业,每个作业将他的部分可以运行任务映射到线程,使用当前分配的处理器运行。而关于运行那个子集以及需要挂起那个线程的决策留个单个应用程序决定。

    调度策略:

  • 有请求到来时:

  1. 如果有空闲的处理器,则使用并执行。

  2. 否则,如果是新到达的请求(不是未满足分配需求而等待的请求),则选择当前已分配的多个处理器的作业,分出处理器去执行新作业。

  3. 如果分配不能得到满足,则保持未完整状态,直到满足的处理器可用,或请求废除。

  • 处理器被释放时: 扫描未满足分配而等待的请求队列,按照FCFS分配处理器资源。

2 实时调度

    实时任务或进程是指该进程的执行与计算机系统外部的某些进程、功能或事件集合有关,并且为了保证有效和正确的与外部环境交互,必须满足一个或多个最后期限。

    实时操作系统是指能够管理实时进程的操作系统。在实时的操作系统中,传统的调度算法原则不适用,关键因素是满足最后期限,很大程度上依靠抢占和对相对最后期限有反应的算法适合于这种上下文。

2.1 限期调度

    目标是尽可能快速启动实时任务,因此强调快速中断处理和任务分派。尽管存在动态资源请求和冲突、处理过载和软硬件故障,实时应用程序不关注绝对速度,关注在最有价值的时间完成或启动任务。

    关于实时任务调度的有效、合适的方法,都基于每个任务的额外信息,常见信息有:

  • 就绪时间:任务开始准备执行时间,对于周期性或重复的任务,该时间序列提前可以知道。对于非周期性任务,或者事先知道,或者操作系统仅仅知道什么时候任务就绪。

  • 启动最后时间:必须开始的时间。

  • 完成最后时间:必须完成的时间,典型实时应用程序有启动最后时间或完成最后时间的一个。

  • 处理时间:开始执行到完成的时间,某些情况操作系统度量指数平均值而不是提供此时间。

  • 资源需求:执行时需要的资源集合(除处理器)。

  • 优先级:硬实时任务可能有绝对优先级,错过则导致系统失败。如果系统无论如何都要运行,则硬、软实时任务可以被指定相关的优先级以指导调度器。

  • 子任务结构:一个任务可被分解为必须运行或可选的子任务。

    相关的策略有:

  • 最早最后期限:选择就绪任务里有最近的最后期限任务。

  • 有自愿空闲时间的最早最后期限:只优先调用最近的最后期限任务,即使要等待还没有就绪的任务。

2.2 速率单调调度

    速率单调调度RMS是基于任务的周期给它们指定优先级,周期越短(速率越高)优先越高,周期与速率互为倒数。处理器利用率为执行时间/周期时间。

    由于每个任务的处理器利用率和不大于1,所以可以通过计算总处理器利用率以判断是否所以任务可以实时执行完毕。而RMS对于以下不等式成立:n个任务的总利用率和不大于n*(2^(1/n) -1)。

    选择RMS的原因是:

  • 该公式是保守值,实际上通常能到达90%。

  • 大多数硬实时系统也有软时间部件,如非关键性的显示与内置的自测试,可以在低优先上执行,占用硬实时任务的RMS调度中没有使用的处理器时间。

  • RMS易于实现稳定性。当由于超载和瞬时错误而不能满足最后期限时,原则上对一些基本任务只要是可调度的,其最后期限就应该被保证。如果使用静态优先级分配方法,只需要确保基本任务具有相对较高的优先级;如果使用RMA,可以让基本任务有较短的周期,或通过修改RMS优先级以说明基本任务实现;对于最早最后期限调度,周期性任务的优先级从一个周期到另一个周期是不断变化的,使得基本任务的最后期限难以满足。