操作系统中的多处理器调度
在多处理器调度中,多个 CPU可用,因此负载共享成为可能。然而,与单处理器调度相比,多处理器调度更复杂。在多处理器调度中,有时处理器是相同的,即同质的,就其功能而言,我们可以使用任何可用的处理器来运行队列中的任何进程。
多处理器调度方法——
一种方法是当所有调度决策和 I/O 处理由称为主服务器的单个处理器处理,而其他处理器仅执行用户代码时。这很简单,并且减少了数据共享的需要。整个场景称为非对称多处理。
第二种方法使用对称多处理,其中每个处理器都是自调度的。所有进程可能都在一个公共就绪队列中,或者每个处理器可能有自己的就绪进程专用队列。通过让每个处理器的调度程序检查就绪队列并选择要执行的进程来进一步进行调度。
处理器亲和力 –
Processor Affinity 意味着进程与其当前运行的处理器具有亲缘关系。
当进程在特定处理器上运行时,会对缓存内存产生一定的影响。进程最近访问的数据填充处理器的缓存,因此进程的连续内存访问通常在缓存中得到满足。现在,如果进程迁移到另一个处理器,则必须使第一个处理器的高速缓存内容无效,并且必须重新填充第二个处理器的高速缓存。由于使缓存失效和重新填充的成本很高,大多数 SMP(对称多处理)系统都尽量避免将进程从一个处理器迁移到另一个处理器,并尽量保持进程在同一处理器上运行。这称为处理器亲和力。
有两种类型的处理器关联:
- 软关联——当操作系统有一个策略试图让进程在同一处理器上运行但不保证它会这样做时,这种情况称为软关联。
- Hard Affinity – Hard Affinity 允许进程指定它可以运行的处理器子集。某些系统(例如 Linux)实现了软关联,但也提供了一些系统调用,例如支持硬关联的sched_setaffinity()。
负载均衡 -
负载平衡是一种使工作负载在 SMP 系统中的所有处理器上均匀分布的现象。只有在每个处理器都有自己的可以执行的私有进程队列的系统上才需要负载平衡。负载平衡是不必要的,因为一旦处理器空闲,它会立即从公共运行队列中提取一个可运行的进程。在 SMP(对称多处理)上,重要的是在所有处理器之间保持工作负载平衡,以充分利用拥有多个处理器的好处,否则一个或多个处理器将处于空闲状态,而其他处理器具有高工作负载以及等待处理的处理器列表中央处理器。
负载平衡有两种通用方法:
- 推送迁移——在推送迁移中,任务会例行检查每个处理器上的负载,如果发现不平衡,则通过将进程从过载转移到空闲或不那么繁忙的处理器来平均分配每个处理器上的负载。
- 拉式迁移——当空闲处理器从繁忙的处理器中拉出等待任务以供其执行时,会发生拉式迁移。
多核处理器 –
在多核处理器中,多个处理器内核位于同一物理芯片上。每个内核都有一个寄存器集来维护其架构状态,因此对于操作系统来说,它是一个单独的物理处理器。与每个处理器都有自己的物理芯片的系统相比,使用多核处理器的SMP 系统速度更快,功耗更低。
然而,多核处理器可能会使调度问题复杂化。当处理器访问内存时,它会花费大量时间等待数据变得可用。这种情况称为MEMORY STALL 。它的发生有多种原因,例如缓存未命中,即访问不在缓存中的数据。在这种情况下,处理器可能会花费多达 50% 的时间来等待数据从内存中可用。为了解决这个问题,最近的硬件设计已经实现了多线程处理器内核,其中两个或多个硬件线程被分配给每个内核。因此,如果一个线程在等待内存时停顿,内核可以切换到另一个线程。
处理器多线程有两种方法:
- 粗粒度多线程——在粗粒度多线程中,线程在处理器上执行,直到发生内存停顿等长延迟事件,由于长延迟事件引起的延迟,处理器必须切换到另一个线程才能开始执行。线程之间切换的成本很高,因为指令流水线必须在另一个线程开始在处理器内核上执行之前终止。一旦这个新线程开始执行,它就开始用它的指令填充管道。
- 细粒度多线程 –这种多线程主要在指令周期的边界以更精细的级别在线程之间切换。细粒度系统的架构设计包括线程切换逻辑,因此线程之间切换的成本很小。
虚拟化和线程 -
在这种类型的多处理器调度中,即使是单个 CPU 系统也像多处理器系统一样工作。在具有虚拟化的系统中,虚拟化为系统上运行的每个虚拟机提供一个或多个虚拟 CPU,然后在虚拟机之间调度物理 CPU 的使用。大多数虚拟化环境都有一个主机操作系统和多个客户操作系统。主机操作系统创建和管理虚拟机。每个虚拟机都安装了客户操作系统,应用程序在该客户操作系统中运行。每个客户操作系统都可以分配给特定的用例、应用程序或用户,包括分时甚至实时操作。任何假设在给定时间内取得一定进度的客户操作系统调度算法都将受到虚拟化的负面影响。分时操作系统试图为每个时间片分配 100 毫秒,以便为用户提供合理的响应时间。给定的 100 毫秒时间片可能需要比 100 毫秒多得多的虚拟 CPU 时间。根据系统的繁忙程度,时间片可能需要一秒或更长时间,这会导致登录该虚拟机的用户的响应时间很短。这种调度分层的净效应是单个虚拟化操作系统仅接收可用 CPU 周期的一部分,即使它们相信它们正在接收所有周期并且它们正在调度所有这些周期。通常,时间虚拟机中的时钟不正确,因为计时器的触发时间不会比在专用 CPU 上的触发时间长。
因此,虚拟化可以取消虚拟机内操作系统的良好调度算法工作。
参考 -
操作系统原理 – Galvin