多处理器调度的设计要点之一是如何把进程分配给处理器。
假定在多处理器系统中所有的处理器都是相同的,即对主存和 I/O设备的访问方式相同,那么所有的处理器可以被作为一个处理器池 ( pool) 来对待 。 我们可以采取静态分配策略,把一个进程永久的分配给一个处理器,分配在进程创建时执行,每个处理器对应一个低级调度队列 。 这种策略调度代价较低,但容易造成在一些处理器忙碌时另一些处理器空闲 。 我们也可以采取动态分配策略,所有处理器共用一个就绪进程队列,当某一个处理器空闲时,就选择一个就绪进程占有该处理器运行,这样,一个进程就可以在任意时间在任意处理器上运行 。
对于紧密耦合的共享内存的多处理器系统来说,由于所有处理器的现场相同,因此采用此策略时进程调度实现较为方便,效率也较好 。
无论采取哪一种分配策略,操作系统都必须提供一些机制来执行分配和调度,那么操作系统程序在多处理器系统中又是怎样分布呢? 方法之一是采用主从式 ( master/slave) 管理结构,操作系统的和形成运行在一个特殊的处理器上,其他处理器运行用户程序,当用户程序需要请求操作系统服务时,请求将被传递到主处理器上的操作系统程序 。 显然这种方式实现上较为简单,并且比多道程序系统的调度效率高,但也有两个缺点,1) 整个系统的坚定性与在主处理器上运行的操作系统程序关系过大; 2) 主处理器极易成为系统性能的瓶颈 。 因此还可以采用分布式 ( peer-to-peer) 管理结构,在此种管理结构下,操作系统程序可以在所有处理器上执行,每一个处理器也可以自我调度 。 这种方式虽然比较灵活,
但实现比较复杂,操作系统程序本身也需要同步 。
作为前面两种方法的折衷,我们可以把操作系统内核程序组成成几部分,分别放在不同的处理器上 。
多处理器调度的设计要点之二是是否要在单个处理器上支持多道程序设计。
对于独立,超粗粒度和粗粒度并行性的进程来说,回答是肯定的 。 但是对于中粒度并行性的进程来说,答案这是不明朗的 。
当很多的处理器可用时,尽可能的使单个处理器繁忙已经是那么重要,系统要追求的可能是给应用提供最好的性能,事实上,
一个带有大量线程的进程可能会一直运行下去 。
多处理器调度的设计要点之三是如何指派进程。
在单处理器的进程调度中我们讨论了很多复杂的调度算法,但是在多处理器环境中这些复杂的算法可能是不必要的,甚至难以达到预期目的,调度策略的目标是简单有效且实现代价低,线程的调度尤其是这样 。