计算机组成原理——高速缓冲存储器
高速缓冲存储器
|| 什么是 cache ?
cache 是一种小容量高速缓冲存储器,由 SRAM(static random access of memory)组成。直接制作在 CPU 芯片内,速度几乎与 CPU 一样快。程序运行时,CPU 使用的一部分数据/指令会预先拷贝在 cache中,cache 中的内容是主存储器中部分内容的映像。当CPU 需要从内存读写数据或指令时,先检查 cache,若有,就直接从 cache 中读取,而不访问主存。
实现 cache 机制需要解决的问题:
- 分块?
- 主存块与 cache 之间如何映射?
- cache 的替换机制?
- 写数据如何保持一致?
|| Cache 映射
把主存空间划分成大小相等的 主存块(block)
cache中存放一个主存块的对应单位称为 槽(slot)或行(line)
cache 映射就是把访问的局部主存区域取到 cache 中,cache 行比主存块少,多个主存块映射到一个 cache 行中。
下面介绍三种映射方法:
- 直接映射(direct):每个主存块映射到cache的固定行
- 全相联映射:每个主存块可装到cache任意一行中
- 组相联映射
|| 替换算法
下面介绍几种淘汰策略:
1、先进先出 FIFO
最早装入的最早被替换
2、最近最少用 LRU
3、最不经常用 LFU
替换 cache 中引用次数最少的块。LFU 也用与每个行相关的计数器来实现。
4、随机替换算法
随机选择一行淘汰,与使用情况无关。
例题:
|| 写策略
1、全写法 (write through)
对于读操作来说我们都已经知道 CPU 读操作的流程,但是对于写操作来说,由于Cache中的内容只是主存内容的副本,当对 cache 中内容更新的时候,主存并没有更新,为了保持主存与Cache内容的一直,我们就有了对于写操作的策略:
写操作时,若写命中,则同时写 cache 和主存;若写不命中,则有以下两种处理方式:
(1)写分配法 (write allocate)。先在主存块中更新相应存储单元,然后分配一个 cache 行,将更新后的主存块装入到分配的 cache 行中。这种方式可以充分利用空间局部性,但每次写不命中都要从主存读一个块到 cache 中,增加了读主存块的开销。
(2)非写分配法(not write allocate)。仅更新主存单元而不装入到 cache 中,可以减少读入主存块的时间,但没有很好地利用空间局部性。
当然,为了减少写主存的开销,通常在 cache 和主存之间加一个写缓冲(write buffer)。在 CPU写 cache 的同时,也将信息写入写缓冲,然后由存储控制器将写缓冲中的内容写入主存。写缓冲是一个 FIFO 队列,如果写动作太频繁可能导致写缓冲区溢出。
2、回写法 (write back)
若写命中,则信息只被写入 cache 而不被写入主存;若写不命中,则在 cache 中分配一行,将主存块调入该 cache 行中并更新相应单元的内容。
在 CPU 执行写操作时,回写法不会主动更新主存单元,只有当 cache 行中的主存块被替换时,才将该块内容一次性写回主存。这种方式减少了写主存的次数,但是存在不一致的隐患,如果一直不被替换出去,那它的内容与主存块中的内容就不一致。而且这种方法还需要给每一块配置一位“脏位”,如果脏位为1则表明发生过写操作,那么替换出去就要更新主存块。
|| 多级 cache
|| 综合题目
如有错误,还望指正 ~ O(∩_∩)O~~