遍历数组时缓存预取:如果一些内存页被换出怎么办?

Cache pre-fetching while traversing an array: what if some memory pages have being swapped out?

数组的最大优点,例如int,是,如果你顺序读取它,它可以完全预加载到缓存中,因为CPU检查内存访问模式并预取即将读取的下一个位置,因此向量的“下一个”元素始终在缓存中。

这句话在多大程度上只是“理论”?考虑到时间,要做到这一点,预取器必须知道将下一个缓存行发送到缓存需要多少时间(这意味着知道 RAM 有多“慢”),以及在这些数据之前还剩下多少时间CPU 是下一个要读取的指令(这意味着知道剩余的指令有多耗时),因此第一个动作序列花费的时间不超过第二个。

我想到的具体情况:假设 10 页长数组的前 5 页在 RAM 中,后 5 页在交换空间中。如果预取器要加载的下一个地址是第五页的首地址,则预加载时间将不可预测地长,预取器将无法完成任务。

我知道 CPUs 尝试对进程的未来进行大量猜测和推测,例如缓存预取、分支预测以及可能我不知道的许多其他技术其中,他们中的一些人可能正在与 OS 交谈以共同推测(我很想知道更多这方面的信息,每次都让我感到惊讶)。

那么,CPUs and/or OSes 是否尝试解决这种猜测时间问题,例如,通过尝试回答预取程序的问题:我的推测性预取需要提前多少时间才能导致0延迟?

So, does CPUs and/or OSes try to solve that kind of guessing-timing problems

没有

这仅由 CPU 硬件处理。如果您读取某个内存位置,CPU 只会将包含您的位置的内存块放入整个缓存行。