【深入理解计算机系统】第六章-存储器层次结构
还记得期中考试被这章的计算搞得神志不清……重新做了一下书中题目,竟然觉得还挺有趣。
- 【DRAM,SRAM】动态/静态随机存取存储器。
- 【磁盘】扇区(一般有512B/sector)。扇区间间隙,不存储数据位,只用来标识扇区格式化位。磁盘操作,扇区访问时间的三个主要部分,寻道时间(通常为6~9ms)、旋转时间(依赖于旋转速度和每条磁道的扇区数目)、传送时间(花时较少)。
- 【局部性】时间、空间局部性。时间局部性较差的例子,每个向量元素只被访问一次。步长为k的引用模式:访问一个连续的向量的每第k个元素,一般随着k增加,空间局部性下降。
- 【存储器层次结构】。中心思想:对于每个k,位于k+1层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存。 存储器中数据被划分成块。层与层之间的数据传送总是以块为单位。L0<=>L1: 1B, L1<=>L2 L2<=>L3: 4~8B, L3<=>L4:几百几千B。越往下层数据传输越慢,倾向于用较大的块。
- 高速缓存关于读:
- 程序需要第k+1层中的数据时,先在第k层中寻找。找到了,就叫做缓存命中;没有找到,就是缓存不命中,此时如果第k层满了,就需要用替换策略,将某个块用从第k+1层传输过来的块覆盖掉,经典策略LRU(最近最少被使用)需要掌握。
- 缓存不命中有:冷缓存(第k层为空,也称强制性不命中/冷不命中)、冲突不命中(限制性放置数据块,比如第k+1层的第i个数据块被放在第k层的第i%4的位置,尽管第k层缓存够大,但被引用的数据对象可能一直在交替占有同一个位置)、容量不命中(缓存太小,处理不了)。
- 注:t=m-s-b. E和t没有直接关系。组索引放在中间的好处:如果用高位做索引,连续地址的数据将被映射到同一个缓存块,降低了缓存使用效率。
- 根据E(每个组的高速缓存行数),高速缓存被分为:
- 直接映射高速缓存(E=1)
- 组相联高速缓存(1<E<C/B)
- 全相联高速缓存(E=C/B,S=1,只适合做小的高速缓存,例如TLB,缓存页表项)
- 直接映射高速缓存存在抖动冲突不命中的问题,比如在循环里的两个变量会映射到相同的高速缓存组。一个简单的方法是“加塞错开”(我自己的话)。
- 高速缓存关于读:
-
- 高速缓存关于写
- 高速缓存中改变了被缓存的值(写命中),更新到存储器中的做法:
- 直写
- 延迟写(需要额外的修改位,当替换算法要驱逐已更新的块时才写到存储器)。
- 写不命中的处理
- 写分配
- 非写分配(避开告诉缓存,直接写到存储器)
- 直写高速缓存通常是非写分配,延迟写通常是写分配。
- 高速缓存参数的性能影响
- 不命中率
- 命中率
- 命中时间
- 不命中处罚
- 高速缓存中改变了被缓存的值(写命中),更新到存储器中的做法:
- 出于私心,保存这张图
- 高速缓存关于写