CPU 和 外部设备 访问内存时都必须经过总线仲裁,现在使用一个专门的硬件模块记录在缓存中的内存区域,当外部设备对内存进行写入操作时,该模块判断这个区域是否位于 CPU 缓存中,如果是则使缓存无效。缓存无效后,就会重新加载内存刷新缓存。当外部设备读取内存时,如果这个内存区域在缓存中,并且缓存已经被 CPU 修改,就把缓存写到内存中。这样内存就得到了更新。
所以,在 X86 的单 CPU 平台上,软件不需要考虑内存一致性问题,但是在多 CPU 平台上情况会变得复杂。
在多 CPU 的系统中,各个 CPU 都有各自独立的缓存,而缓存大小远远小于内存大小,因此缓存和内存是一对多的关系。也就是说一个缓存行可以对应多个内存区域。在这种情况下,可能 CPU1 对缓存的修改还没回写到内存中,但此时 CPU2 已经已经发出读取操作(假设 CPU2 读取的内存区域还未曾经加载到缓存中),这时 CPU2 读取到的是旧的数据。即使 CPU1 及时地把修改的内容回写到内存中,但由于 CPU2 在此之前已经把对应的内存区域读取到缓存中,因此 CPU2 仍然是从换从中读取旧数据。