多处理器调度完全攻略

  • 内容
  • 评论
  • 相关

迄今为止,我们主要集中讨论单处理器系统的 CPU 调度问题。如果有多个 CPU,则负载分配成为可能,但是调度问题就相应地更为复杂。许多可能的方法都已试过,但与单处理器调度一样,没有最好的解决方案。

多处理器调度的方法

对于多处理器系统,CPU 调度的一种方法是让一个处理器(主服务器)处理所有调度决定、I/O 处理以及其他系统活动,其他的处理器只执行用户代码。这种非对称多处理很简单,因为只有一个处理器访问系统数据结构,减少了数据共享的需要。

第二种方法是使用对称多处理(SMP),即每个处理器自我调度。所有进程可能处于一个共同的就绪队列中,或每个处理器都有它自己的私有就绪进程队列。不管如何,调度这样进行:每个处理器的调度程序都检查共同就绪队列,以便选择执行一个进程。如果多个处理器试图访问和更新一个共同的数据结构,那么每个处理器必须仔细编程,必须确保两个处理器不会选择同一进程,而且进程不会从队列中丢失。

几乎所有现代操作系统,包括 Windows、Linux 和 Mac OSX,都支持 SMP。本节余下部分讨论有关 SMP 系统的多个问题。

处理器亲和性

考虑一下,当一个进程运行在一个特定处理器上时缓存会发生些什么。进程最近访问的数据更新了处理器的缓存。结果,进程的后续内存访问通常通过缓存来满足。

现在考虑一下,如果进程移到其他处理器上则会发生什么。第一个处理器缓存的内容应设为无效,第二个处理器缓存应重新填充。由于缓存的无效或重新填充的代价高,大多数 SMP 系统试图避免将进程从一个处理器移到另一个处理器,而是试图让一个进程运行在同一个处理器上。这称为处理器亲和性,即一个进程对它运行的处理器具有亲和性。

处理器的亲和性具有多种形式。当一个操作系统试图保持进程运行在同一处理器上时(但不保证它会这么做),这种情况称为软亲和性。这里,操作系统试图保持一个进程在某个处理器上,但是这个进程也可迁移到其他处理器。相反,有的系统提供系统调用以便支持硬亲和性,从而允许某个进程运行在某个处理器子集上。

许多系统提供软的和硬的亲和性。例如,Linux 实现软亲和性,但是它也提供系统调用 sched_setaffinity() 以支持硬亲和性。


NUMA与CPU调度
图 1 NUMA 与 CPU 调度

本文标题:多处理器调度完全攻略

本文地址:https://www.hosteonscn.com/3607.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注