多处理器调度

多处理器系统分类:

  1. 松耦合、分布式多处理器(集群):一系列相对自治的系统组成,每个处理器有属于自己的内存和 I/O 通道。
  2. 专用处理器:有一个通用的主处理器,专用处理器由主处理器控制并为它提供服务。
  3. 紧耦合多处理器:一系列共享同一内存并受 OS 完全控制的处理器组成。

粒度:

  1. 无约束并行性(independent parallelism):进程间没有显式的同步,每个进程都表示独立的应用或者作业。
  2. 粗粒度(coarse)和极粗粒度(very coarse)并行性:进程之间存在同步。
  3. 中粒度(medium-grain)并行性:应用程序按照进程中的一组线程实现,这组线程之间的合作和交互性更高。
  4. 细粒度(fine-grain)并行性:与线程并行相比,更复杂。具体是啥玩意,不知道。这个领域目前研究不成体系(译者翻译的意思)。

当所有处理器访问内存和 I/O 设备时从物理上来说公平的情况下,最简单的调度策略是把所有处理器看作一个资源池。

静态分配:一个进程从创建到运行完成,完全由一个特定的处理器进行执行。
优点:调度开销较小。
缺点:一个处理器可能空闲,而其他处理器可能忙碌且相关队列积压很多的就绪进程等待执行。

主从式:OS 的核心功能在某个特定的处理器上运行,其他处理器可能仅执行用户程序。
缺点:主处理器失败会导致整个系统失败;主处理器可能成为系统瓶颈。

对等式:OS 能在任何一个处理器上执行。
缺点:OS 的复杂性增加。

在多处理器系统中运行中粒度的应用程序时,要求提高每个处理器的利用率不是很重要,提高应用的平均性能更重要。

在处理器系统中,相对简单的进程调度算法可能更有效,开销也较低。调度算法的选择不那么重要,使用 FCFS 或在静态优先级中使用 FCFS 即可。

一个应用程序的各个线程同时在各个独立的处理器中执行时,其性能会显著提升。

负载分配:系统维护一个全局就绪线程队列,处理器空闲时就从队列中选择一个线程执行。
优点:

  1. 当有工作可做时,没有处理器处于空闲状态。
  2. 不需要集中调度程序。
  3. 可以执行任意的调度算法。

缺点:

  1. 中心队列(central queue)占据了必须互斥访问的存储器区域。
  2. 被抢占的线程可能不在同一个处理器上恢复执行。
  3. 若所有线程被视为一个公共线程池,那么一个程序中的所有线程不可能同时访问处理器。

三种负载分配的调度算法

  1. FCFS
  2. 最少线程数优先:一个作业包含的未调度线程的数量最少时,给它指定最高的优先级。该策略为非抢占式。
  3. 可抢占的最少线程数优先:和上述第 2 个算法一样,不过是可抢占式。
    三种策略,FCFS 效果最好。

组调度(gang scheduling):同时调度组成一个进程的一组线程。
优点:进程切换的开销最小;节省资源分配时间。

专用处理器分配:一种极端的组调度。一个应用程序被调度时,它的每个线程被分配给一个处理器,直到进程执行完成。
使用该方法的原因:

  1. 多处理器中,单个处理器只占系统资源的一小部分,单个处理器的利用率不再是重要因素。
  2. 一个进程的生命周期中,避免进程切换可以加快执行速度。

对于专用处理器分配,为了提高性能,限制活跃线程的数量,使其不超过系统中处理器的数量。

多处理器系统中的处理器分配问题类似单处理器系统中的存储器分配问题。

动态调度:进程执行过程中可以动态改变该进程中线程的数量。

对于适用动态调度的应用程序,动态调度优于组调度和专用处理器分配。

缓存共享需要考虑的因素:合作资源共享(多个线程访问相同内存区域)和资源抢占(独占内存区域)。

实时调度

实时计算:系统的正确性不仅取决于计算的逻辑结果,而且取决于产生结果的时间。

实时 OS 的需求:

  1. 可确定性:可以按照固定的、预先确定的时间或者时间间隔执行操作。
  2. 可响应性:获知中断后,OS 为中断提供服务的时间。
    具体包括:最初处理中断并开始执行中断服务例程(ISR)所需的时间总量;执行 ISR 所需的时间总量;中断嵌套的影响。
  3. 用户控制:允许用户细粒度地控制任务的优先级。
  4. 可靠性。
  5. 故障弱化操作(fail-soft operating):系统在故障时尽可能多地保存其性能和数据的能力。

实时 OS 常见功能:

  1. 使用优先级更严格。
  2. 中断延迟相对较短。
  3. 时序特征更精确、更可预测。

实时调度算法:

  1. 静态表调度法:分析任务的到达时间、执行时间、优先级等信息确定任务何时执行。适用周期性任务。
  2. 静态优先级抢占调度法:基于优先级的抢占式调度。
  3. 基于动态规划的调度法:一个任务已到达但未执行时,尝试创建一个包含前面被调度的任务和新到达的任务的调度。
  4. 动态尽力调度法:一个任务到达时,系统根据任务特性指定一个优先级。优点是易于实现。

调度需要的信息:

  1. 就绪时间:任务开始准备执行时的时间。
  2. 启动最后期限:任务必须开始的时间。
  3. 完成最后期限:任务必须完成的时间。
  4. 处理时间:从执行任务到完成任务所需的时间。
  5. 资源需求:任务在执行过程中需要的除处理器之外的资源。
  6. 优先级:度量任务的相对重要性。
  7. 子任务结构:一个任务可分解为一个必须执行的子任务和一个可选执行的子任务。

速率单调调度(rate monotonic scheduling, RMS):任务的周期越短,其优先级越高。

优先级反转(priority inversion):系统环境迫使一个较高优先级的任务等待一个较低优先级的任务。
解决方法:
优先级继承:优先级较低的任务继承任何一个与其共享同一资源的优先级较高任务的优先级。
优先级置顶:优先级与每个资源相关联,资源的优先级被设定为比使用该资源的最高优先级的任务的优先级高一级。

参考

[1] William Stallings, 操作系统——精髓与设计原理(8th), 2017.

 posted on 2021-08-22 11:43  x-yun  阅读(80)  评论(0编辑  收藏  举报