谁决定内存访问模式?

Who decides the memory access pattern?

我正在尝试了解内存访问模式。我的问题很简单。谁决定内存访问模式?

Who decides the memory access pattern?

大部分;编写代码的人通过他们所做的选择来决定内存访问模式。

举个愚蠢的例子;如果您决定遍历一个数组(如 for(i = 0; i <= size; i++) { do_something(&my_array[i]); }),那么您已经形成了一个很好的线性访问模式;如果您决定改为遍历链表(如 while(current != NULL) { do_something(current); current = current->next; }),那么您的访问模式可能会相对不稳定。

但是;在某些情况下,compiler/linker 可能会尝试优化内存访问模式。这主要只是稍微改变了细节(个别 reads/writes 的确切顺序,而不是整体模式本身),但在某些情况下,编译器可以进行更明显的优化(主要涉及嵌套循环和数组)。

注1:结果很可能是“虚拟内存访问模式”。在下面会有一个完整的内存层次结构——OS 将控制虚拟内存到物理内存的映射(并处理诸如交换 space 等的事情);然后会有多级缓存和其他内置于硬件中的“类似缓存的东西”。 None 这件事。它使实际访问的内容变得复杂(哪个缓存的哪一部分,或者哪个物理内存,或者交换 space 的哪一部分,或者......)但是访问仍然会以相同的顺序发生(并且以相同的模式) 不管实际访问的是什么。

注2:典型的程序很少是simple/single算法。如果一个程序(网络浏览器、电脑游戏、编译器等)有数百个部分,那么该程序的访问模式将是每个部分的各个访问模式的某种组合。