计算机组成原理——高速缓冲存储器

高速缓冲存储器

|| 什么是 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~~

猜你喜欢

转载自blog.csdn.net/tian__si/article/details/106378685