高速缓存cache
cpu<–>cache<–>内存(主存)<–>外存(辅存)
- 计算机存储层次结构:金字塔型
- 空间、时间局部性:引入cache
- 例子:访问二维数组A[0][0]-A[0][1]。。。空间局部性好
- 了解cache才能写出高效程序
- 操作过程:
- cpu通过地址需要一块主存数据
- 判断是否在cache中,hit直接从cache中取,miss加入到cache
疑问:如何从elf的虚存地址,转换成cpu需要的实际内存地址
- cache映射方式:
- 直接映射:主存块 映射到mod之后的 cache块,cache需要一个标记来
确定是哪一个主存块(块群号)。
块群号+行号+块内号
特点:容易实现,命中时间很短(按地址找)。无需考虑淘汰问题。命中率低。 - 全相联映射:要标记11位块号。
特点:命中时间长(按内容找),比较器长。成本高,命中率高。 - 组相联映射:组间取模,组内任意。
- 直接映射:主存块 映射到mod之后的 cache块,cache需要一个标记来
- cache替换算法(逻辑演示):
- FIFO:先进先出,先进的在上面,淘汰最上面的
- LRU:最近最少用,最近使用的提到最上面,淘汰最下面的。实际用计数值方式标记最近用。
- cache一致性问题:
- 写命中(要写块的在cache中)
- write through:直写,立即写入cache和二级cache,二级cache受存储器控制写回主存。
- write back:回写,cache中标记一个‘脏’位来判断是否有更改,当cache块被淘汰时一次性写回。同时要锁定对应主存块,不能被io访问。
- 写未命中:
- 写分配:加到cache后在写
- 非写分配:直接在主存中写
直写:写分配/非写分配
回写:非写分配
- 写命中(要写块的在cache中)