Skip to content

操作系统笔记:多处理器调度的两种方法

介绍多处理器调度的两种方法:对称多处理与非对称多处理。

多处理器调度的两种方法

第一种是非对称多处理(Asymmetric Multiprocessing,AMP)。这种方法是在处理器集群中让一个处理器处理系统活动(IO、调度决策等)的代码,这个处理器成为主处理器,其他处理器执行用户程序代码。这种方法相对简单,而且由于主处理器只专门处理系统代码,可以减轻数据共享的需求。

第二种是对称多处理(Symmetric Multiprocessing,SMP)。它要求每个处理器都具备自我调度的功能。针对就绪队列与进程执行的情形,这种方法细分之下有两种不同的实现方式。

其一,每个处理器都有一个针对进程的私有就绪队列。

其二,为所有进程建立一个公共就绪队列。

上述两种方法都必须确保一个前提,那就是在调度时必须非常小心,实现精确的调度算法,为每个处理器在取进程执行前检查就绪队列、弹出一个进程并执行。如果多个处理器要访问公共数据区,必须保证进程不会从队列中消失,也不会出现两个处理器执行同一个进程的情况。否则,进程可能缺失或被重复执行,从而导致难以预料的错误。

如今的操作系统,例如 Linux、Windows、Mac OS 等,都采用 SMP 方法。

处理器亲和性

对于采用 SMP 方法的操作系统,必须加入处理器亲和性,以保证处理器处理进程的效率。因为当一个进程在处理器中执行时,处理器中通常会建立缓存,以便多次使用处理器中的数据,减少重复工作、提高效率。但当进程在不同处理器之间迁移时,需要使原处理器中的缓存失效,并在新处理器中重建缓存。然而,这样做会急剧增加成本与开销,导致工作效率下降。因此,操作系统应尽量保证进程只在一个处理器中执行,避免多次迁移到不同处理器。这种措施称为处理器亲和性。简单来说,就是让一个进程亲和于某个处理器。

然而,亲和性有两种强制执行的类型。一种是软亲和性(soft affinity)。操作系统尽量让进程在一个处理器中被处理,但无法保证进程是否会被迁移。另一种是硬亲和性(hard affinity),它强制一个进程只能在一个处理器中被处理,不允许在不同处理器之间迁移。例如,Linux 系统就实现了硬亲和性策略。

负载均衡

对于采用 SMP 方法的系统,在处理器集群中,如果各处理器的空闲程度不均,可以从繁忙的处理器中抽取一些进程放到空闲的处理器上,从而实现整体的忙闲均衡,提高处理器资源利用率。这就是负载均衡策略。

上文提到,根据就绪队列的分配方式,有建立公共就绪队列和为每个处理器建立私有就绪队列两种方法。如果存在公共就绪队列,通常就不需要负载均衡,因为可以随时从公共队列中拉取进程分配给空闲的处理器。然而,在现代大多数操作系统中,会为不同的处理器建立私有就绪队列,这就必须使用负载均衡,定期检查每个处理器的负载,把过载处理器上的进程迁移到未过载的处理器中。把进程从过载处理器迁移到空闲处理器,称为推送迁移(push migration)。而空闲处理器从过载处理器中拉取进程,称为拉取迁移(pull migration)。

事实上,负载均衡会因进程迁移而抵消处理器亲和性带来的优势。因此,处理器亲和性与负载均衡之间存在一定的对立效果。这就需要设计更好的调度算法。

对称多线程

对称多线程技术又称超线程技术(SMT)。这是在处理器的硬件技术中实现的,并不属于操作系统技术。其主要思想是将一个真实的物理处理器逻辑上划分为若干个逻辑处理器,使得一个物理处理器在功能上被分成多个逻辑处理器,每个逻辑处理器负责各自的进程工作。如果操作系统能够利用划分出的逻辑处理器来运行进程,就可以设计特定的调度算法,充分利用处理器资源,获得更高的性能。