操作系统精髓与设计原理,多处理器和实时调度

概述

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

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调度中,一个长进程很少被中断,其他进程可以使用其他的处理器,因此相对单处理器短进程等待时间较少)

操作系统精髓与设计原理,多处理器和实时调度