Skip to content

Latest commit

 

History

History
92 lines (39 loc) · 5.07 KB

4.调度.md

File metadata and controls

92 lines (39 loc) · 5.07 KB

4.调度

在多道程序设计系统中,内存中有多个进程,每个进程要么正在处理器上运行,要么正在等待某些事件的发生,比如I/O完成。处理器调度的目的是:以满足系统目标(如响应时间、吞吐率、处理器效率)的方式,把进程分配到一个或多个处理器上执行。处理器(或处理器组)通过执行某个进程而保持忙状态,而此时其他进程处于堵塞状态。典型的调度有四种:

长程调度

决定哪个程序可以进入系统中处理,因此它控制了系统的并发度。一旦允许进入,作业或用户程序就成为进程,并添加到供短程调度程序使用的队列中,等待调度。

中程调度

决定加入部分或全部位于内存中的进程集合。它是交换功能的一部分。典型情况下,换入(swapping-in)决定取决于管理系统并发度的需求。

短程调度

决定处理器执行哪个可运行进程。

长程调度程序执行的频率相对较低,并且只是大致决定是否接受新进程和接受哪个新进程。要进行交换决定,中程调度程序需要执行的稍频繁一些。短程调度程序,也成为分派程序(dispatcher),执行的最频繁,它精确的决定下次执行哪个进程。导致当前进程堵塞或抢占当前运行进程的事发生时,调用短程调度程序。这类事件包括:

  • 时钟中断
  • I/O中断
  • 操作系统调用
  • 信号(如信号量)

I/O调度

决定可用I/O设备处理哪个进程挂起的I/O请求

多处理器调度

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

  • 松耦合、分布式多处理器、集群:由一系列相对自治的系统组成,每个处理器都有自身的内存和I/O通道。
  • 专用处理器:I/O处理器是一个典型的例子。此时,有一个通用的主处理器,专用处理器由主处理器控制,并为主处理器提供服务。
  • 紧耦合多处理器:由一些列共享同一个内存并受操作系统完全控制的处理器组成。

多处理器中的调度涉及三个相互关联的问题:

  • 把进程分配到处理器

    假设多处理器的结构是统一的,即没有哪个处理器在访问内核和I/O设备时具有物理上的特别优势,那么最简单的调度方法是把处理器视为一个资源池,并按照要求把进程分配到相应的处理器。但是这样就牵扯到静态还是动态的问题。如果一个进程从被激活到完成,一直被分配给同一个处理器,那么就需要为每个处理器维护一个专门的短程队列。这种方法的优点是调度的开销较小,因为相对于所有进程,关于处理器的分配只进行一次。静态分配的缺点就是一个处理器可能处于空闲状态,这时其队列为空,而另一个处理器却积压了许多工作。为了防止这种情况,需要使用一个公共队列。所有进程都进入一个全局队列,然后调度到任何一个可用的处理器中。这样,在一个进程的生命周期中,它可以在不同的时间于不同的处理器上执行。另一种分配策略是动态负载平衡,在该策略中,线程能在不同处理器所对应的队列之间转移。Linux采用的就是这种动态分配策略。

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

    单处理器能够在许多进程间切换,以达到较高的利用率和更好的性能。

  • 一个进程的实际分派

    与多处理器调度相关的最后一个设计问题是选择哪个进程运行。在多道程序单处理器上,与简单的先来先服务策略相比,使用优先级或基于使用历史的高级调度算法可以提高性能。考虑多处理器时,这些复杂性可能是不必要的,甚至可能起到相反的效果,而相对比较简单的方法可能会更有效,而且开销比较低。

线程调度

在多处理器线程调度和处理器分配的各种方案中,有四个比较突出的方法:

  • 负载分配:进程不分配到某个特定的处理器。系统维护一个就绪线程的全局队列,每个处理器只要空闲就从队列中选择一个线程。
  • 组调度:一组相关的的线程基于一对一的原则,同时调度到一组处理器上运行。
  • 专用处理器分配:这种方法与负载分配方法正好相反,它通过把线程指定到处理器来定义隐式的调度。每个程序在其执行过程中,都分配给一组处理器,处理器的数量与程序中线程的数量相等。程序终止时,处理器返回总处理器池,以便分配给另一个程序。
  • 动态调度:在执行期间,进程中线程的数据可以改变,允许动态地改变进程中的线程数量,这就使得操作系统可以通过调整负载情况来提高利用率。