深入理解计算机系统第六章,存储器层次结构
局部性通常有两种不同的形式:时间局部性(temporal locality)和空间局部性(spatial locality)。在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次使用。在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。
存储技术:不同存储技术的访问时间差异很大。速度较快的技术每字节的成本要比速度较慢的技术高,而且容量较小。CPU和主存之间的速度差距在增大。
存储器层次结构:
一般而言,从高层往底层走,存储设备变得更慢、更便宜和更大。在最高层(L0),是少量快速的CPU寄存器,CPU可以在一个时钟周期内访问它们。接下来是一个或多个小型到中型的基于SRAM的高速缓存存储器,可以在几个CPU时钟周期内访问它们。然后是一个大的基于DRAM的主存,可以在几十到几百个时钟周期内访问它们。接下来是慢速但是容量很大的本地磁盘。最后,有些系统甚至包括了一层附加的远程服务器上的磁盘,要通过网络来访问它们。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:1)组选择;2)行匹配;3)字抽取。
有关写的问题
直写(write-through),就是立即将w的高速缓存块写回到紧接着的低一层中。
写回(write-back),尽可能的推迟更新,只有当替换算法要驱逐这个更新过的块时,才把它写到紧接着的低一层中。
高速缓存必须为每个高速缓存行维护一个额外的修改位(dirty bit),表明这个高速缓存块是否被修改过。
写分配(write-allocate),加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。非写分配(not-write-allocate),避开高速缓存,直接把这个字写到低一层中。
一个程序从存储系统中读数据的速率称为读吞吐量(read throughput),或者有时称为读带宽(read bandwidth)。
run函数的参数size和stride允许我们控制产生出的读序列的时间和空间局部性程度。size的值越小,得到的工作集越小,因此时间局部性越好。stride的值越小,得到的空间局部性越好。如果我们反复以不同的size和stride值调用run函数,那么我们就能得到一个读带宽的时间和空间局部性的二维函数,称为存储器山(memory mountain)。

浙公网安备 33010602011771号