在像 x86 这样提供缓存一致性的 CPU 上,从实际角度来看这有何用处?据我所知,这个想法是让一个核心上完成的内存更新在所有其他核心上立即可见。这是一个有用的属性。然而,如果不是用汇编语言编写,就不能太依赖它,因为编译器可以将变量赋值存储在寄存器中,并且永远不会将它们写入内存。这意味着仍然必须采取明确的步骤来确保其他线程中完成的操作在当前线程中可见。那么,从实际角度来看,缓存一致性实现了什么?
简而言之,非缓存一致性系统非常难以编程,特别是如果您想保持效率 - 这也是当今大多数 NUMA 系统都是缓存一致性的主要原因。
如果缓存不一致,则“显式步骤”必须强制执行一致性 - 显式步骤通常是诸如关键部分/互斥锁之类的东西(例如,C/C++ 中的 volatile 很少足够)。对于互斥体等服务来说,仅跟踪所有缓存中发生变化且需要更新的内存是非常困难的,即使不是不可能,它也可能必须更新所有内存,也就是说,如果它甚至可以跟踪哪些核心的缓存中有哪些内存片段。
据推测,硬件可以更好、更高效地跟踪已更改的内存地址/范围,并保持它们同步。
并且,想象一个进程在核心 1 上运行并被抢占。当它再次被调度时,它被调度到核心 2 上。
如果缓存不一致,这将是相当致命的,否则核心 1 的缓存中可能会有进程数据的残留,而核心 2 的缓存中不存在这些残留数据。不过,对于以这种方式工作的系统,操作系统必须在调度线程时强制执行缓存一致性 - 这可能是“更新所有核心之间缓存中的所有内存”操作,或者它可能可以通过以下方式跟踪脏页:在 MMU 的帮助下,仅同步已更改的内存页面 - 同样,硬件可能以更细粒度和更有效的方式保持缓存的一致性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)