Operating system 多核调度

Operating system 多核调度,operating-system,Operating System,多处理器调度与单处理器调度通常在涉及多核CPU系统时存在一个巨大的问题—缓存一致性 缓存一致性意味着什么? 对主存储器的访问是困难的。根据内存频率的不同,访问RAM中的一些数据可能需要几千到几百万个周期——这是CPU没有做任何有用工作的大部分时间。如果我们尽可能地减少这一时间,情况会好得多,但这样做所需的硬件非常昂贵,而且通常必须非常接近CPU本身(我们说的是在离核心几毫米的范围内) 这就是缓存的作用。高速缓存将主内存的一小部分保持在靠近核心的位置,允许对该内存的访问速度比主内存快几个数量级。对

多处理器调度与单处理器调度通常在涉及多核CPU系统时存在一个巨大的问题—缓存一致性

缓存一致性意味着什么?

对主存储器的访问是困难的。根据内存频率的不同,访问RAM中的一些数据可能需要几千到几百万个周期——这是CPU没有做任何有用工作的大部分时间。如果我们尽可能地减少这一时间,情况会好得多,但这样做所需的硬件非常昂贵,而且通常必须非常接近CPU本身(我们说的是在离核心几毫米的范围内)

这就是缓存的作用。高速缓存将主内存的一小部分保持在靠近核心的位置,允许对该内存的访问速度比主内存快几个数量级。对于读取,这是一个简单的过程-如果内存在缓存中,则从缓存读取,否则从主存读取

写作有点棘手。写入缓存速度很快,但现在主内存仍保留原始值。我们可以更新内存,但这需要一段时间,有时甚至比读取时间还要长,具体取决于内存类型和电路板布局。我们如何将其最小化

最常见的方法是使用回写缓存,当写入时,将在CPU空闲或不执行操作时,将缓存中包含的数据刷新回主存。根据CPU体系结构的不同,这可以在空闲状态下完成,也可以与CPU指令交叉,或者在计时器上完成(这取决于CPU的设计者/制造商)

为什么这是个问题?

在单核系统中,读写操作只有一条路径——它们必须在进入主存的过程中通过缓存,这意味着CPU上运行的程序只能看到它们期望的内容——如果它们读取一个值,修改它,然后再读回,它就会被更改

然而,在多核系统中,数据返回主存时有多条路径可供选择,具体取决于发出读或写操作的CPU。这给写回缓存带来了一个问题,因为“以后”会引入一个间隙,一个CPU可能会读取尚未更新的内存

想象一下一个双核系统。作业在CPU 0上启动并读取内存块。因为内存块不在CPU 0的缓存中,所以它是从主存读取的。稍后,作业将写入该内存。由于缓存是写回的,因此该写操作将写入CPU 0的缓存,并在稍后刷新回主内存。如果CPU 1随后尝试读取相同的内存,CPU 1将再次尝试从主内存读取,因为它不在CPU 1的缓存中。但是来自CPU 0的修改尚未离开CPU 0的缓存,因此您返回的数据无效-您的修改尚未完成。您的程序现在可能以微妙、不可预测和潜在破坏性的方式中断

因此,缓存同步可以缓解这种情况。存在应用程序ID、地址监视和其他硬件机制来同步多个CPU之间的缓存。所有这些方法都有一个共同的问题——它们都迫使CPU花时间记账,而不是实际的、有用的计算

避免这种情况的最佳方法实际上是尽可能多地将进程保留在一个处理器上。如果进程不在CPU之间迁移,则不需要保持缓存同步,因为其他CPU不会同时访问该内存(除非该内存在多个进程之间共享,但我们在此不进行讨论)

现在我们来讨论如何设计调度器的问题,以及其中的三个主要问题—避免进程迁移、最大限度地提高CPU利用率和可伸缩性

单队列多处理器调度(SQMS)

您建议使用单队列多处理器调度程序—一个队列包含可用进程,每个核心访问该队列以获得要运行的下一个作业。这很容易实现,但有两个主要缺点-它会导致大量进程迁移,并且不能很好地扩展到具有更多内核的大型系统

设想一个系统有四个核心和五个作业,每个作业的运行时间大致相同,并且每个作业完成后都会重新安排。在第一次运行时,CPU 0接受作业A,CPU 1接受B,CPU 2接受C,CPU 3接受D,而E留在队列中。然后,假设CPU 0完成作业A,将其放在共享队列的后面,并寻找另一个作业来执行。E当前在队列的最前面,CPU 0接受E,然后继续。现在,CPU 1完成作业B,将B放在队列的后面,并查找下一个作业。它现在看到A,并开始运行A。但由于A以前在CPU 0上,CPU 1现在需要将其缓存与CPU 0同步,从而导致CPU 0和CPU 1的时间损失。此外,如果两个CPU同时完成它们的操作,它们都需要写入共享列表,这必须按顺序进行,否则列表将损坏(就像在多线程中一样)。这需要两个CPU中的一个等待另一个完成写入,并将其缓存同步回主内存,因为列表位于共享内存中!添加的CPU越多,问题就越严重,导致大型服务器出现严重问题(可能有16个甚至32个CPU核),并且在超级计算机上完全无法使用(其中一些具有1000个以上的核)

多队列多处理器调度(MQMS)

多队列多处理器调度器对每个CPU核心都有一个队列,确保所有本地核心调度都可以完成,而不必获取共享锁或同步缓存。这允许系统具有数百个co