3

我们知道,内存中的页面缺失会带来页面错误,并且页面处理程序必须将页面加载到物理内存中。这里我想知道缓存中的未命中是否也是系统故障?如果不是,内存故障和缓存故障有什么区别?非常感谢。

4

4 回答 4

5

“缓存故障”是指处理器的 L1/L2/L3 缓存中的缓存未命中吗?如果是这样,那么不会,至少在我听说过的每个处理器架构上都不会产生故障。

原因是页面错误需要软件干预来确定访问是否无效,访问是否是对已换出到磁盘的页面等。相反,根据定义,高速缓存未命中可以由处理器处理本身 - 由于它没有导致页面错误,因此数据必须已经存储在主内存或较低级别的缓存中,处理器可以直接访问这些缓存。处理器会机械地将正在访问的内存地址从虚拟地址转换为物理地址,然后向低级缓存或主内存请求数据。

同样的想法也适用于同步多处理器,其中一个高速缓存行可能会被一个写入它的核心无效,即使另一个核心将它存储在高速缓存中。处理器定义了自己的一致性协议以确保不会读取过时的副本,通常是通过强制具有无效缓存行的内核从较低级别的缓存刷新它,或者通过要求它监视共享的写入总线,其中所有处理器都可以看到正在写入的值。

于 2013-05-21T07:34:17.080 回答
1

不,它只会导致处理器停顿。也许一个适当的心理形象是一个或多个 NOP 指令被插入到管道中。也称为“泡沫”。不太确定这是适合现代处理器所做的模型,但效果肯定是相同的,处理器停止执行指令,直到数据可用。

于 2013-05-21T07:49:11.147 回答
1

缓存故障是指一个核心被阻止读取/写入,因为另一个核心打算同时读取/写入相同的数据。这是多核并行的问题。例如,考虑两个内核(0 和 1)需要来自 RAM 的变量x,x 的副本放置在所有内核共享的最高级别缓存(L2 或 L3)上,然后是x的第二个副本被放置在核心 0 的最内部缓存 (L1) 中,而核心 1 请求使用相同的变量进行操作。在执行从 core_0 更新变量值的冲突时,必须阻止核心 1。阻塞操作是缓存故障。

于 2016-09-11T05:35:14.003 回答
0

Nobody else has mentioned TLB so far. Some CPUs (e.g. MIPS) have a software-filled TLB and a TLB miss actually triggers execution of the dedicated exception handler, which then needs to provide to the CPU the sought virtual to physical mapping. IOW, some cache misses/faults may not be handled automatically by hardware.

于 2016-09-11T05:47:40.887 回答