缓存的实现原理(计算机缓存的原理及应用)

高速缓存 cache 是一个小而快速的存储设备,用作存储在更大、更慢设备中的数据对象的缓冲区域,使用高速缓存的过程称为缓存。
存储器层次结构的思想是,每个层次的存储都是其下一层的缓存,换句话说,每个层次的缓存都装载自其较低层的数据对象。
本地磁盘作为远程磁盘取出的文件的缓存, 内存条作为本地磁盘上数据的缓存。
缓存数组如何组织?
存储器层次结构中,数据的组织和管理至关重要。第 K+1 层的存储器是一个连续的数据块集合,每个块都被赋予唯一的地址或标识,以使其与其他块区分开来。

这些块可以是固定大小的,也可以是可变大小的。在图中,我们可以看到第 K+1 层的存储器被划分成了 16 个大小固定的块,它们被依次编号为 0 到 15。
在此基础上,第 k 层的存储器被组织成了更小的块集合,每个块的大小与第 K+1 层的块大小相同。值得注意的是,第 k 层的缓存始终保持着第 K+1 层块的一个子集的副本。
在上图中,第 k 层的缓存被设计成可以容纳四个块,这些块的标识分别是 4、9、14 和 3。这意味着在需要的时候,这四个块的副本可以在第 k 层的缓存中找到。

在存储器层次结构中,数据在不同层次之间的传输采用了不同的策略。通常,在 L0 层(最内层)和 L1 层之间的传输会使用单字大小的块,这表示每次传输一个字(通常是 4 字节)。
而在 L1 层和 L2 层,或者 L2 层和 L3 层,以及 L3 层和 L4 层之间的传输则会采用几十个字节大小的块。
当数据需要在 L4 层和 L5 层之间传输时,会使用几百或几千字节大小的块。这是因为通常情况下,存储器层次结构中较低层的设备访问时间相对较长。为了弥补这些较长的访问时间,系统倾向于使用较大的块来传输数据,以减少频繁的数据传输次数。
一、 缓存命中
当程序需要访问存储在第 k+1 层的某个数据对象 d 时,它首先会检查当前第 k 层缓存中是否已经存在这个数据对象。如果数据对象 d 正好缓存在第 k 层,这就是缓存命中。
程序可以直接从第 k 层缓存中读取数据对象 d。根据存储器层次结构的原理,从第 k 层读取数据要比从第 k+1 层读取更快。
二、 缓存不命中
如果第 k 层缓存中没有存储数据对象 d,这就是缓存不命中。在发生缓存不命中时,第 k 层缓存会从第 k+1 层缓存中取出包含数据对象 d 的块。如果第 k 层缓存已满,那么可能需要替换(覆盖)一个现有的块。
这个替换块的过程也被称为“牺牲块”。
确定替换哪个块由缓存的替换策略决定。一个使用随机替换策略的缓存会随机选择一个「牺牲块」,而其他替换策略可能会选择最长时间未被访问的块。
三、 缓存不命中的种类
强制性不命中:如果第 k 层缓存是空的,任何数据的访问都会导致不命中。缓存空间未被使用时的状态被称为“冷缓存”。这种情况下的不命中称为强制性不命中。
冲突不命中:硬件缓存通常使用较严格的放置策略,将第 k+1 层的某个块限制为放置在第 k 层的块子集中。
例如:
k+1 层的块 0、4、8、12 映射到第 k 层的块 0;
k+1 层的块 1、5、9、13 映射到第 k 层的块 1。
如果程序请求块 0,然后块 8,然后块 0,然后块 8,这种情况下对这两个块的引用都会不命中,因为缓存与读取的顺序不一致。
四、缓存管理
存储器层次结构的关键在于每一层存储设备充当着较低一层的缓存。在每个层次上,一定的逻辑必须对缓存进行管理。
首先,缓存需要将数据分割成块,并在不同层次之间传递这些块。随后,对于请求的数据,逻辑需要判断它是否在当前层的缓存中,即命中或不命中,并作出相应处理。
缓存的管理逻辑可以是硬件、软件,或者二者的结合。在这个层次上,编译器管理着寄存器文件,这可看作是缓存层次结构的最顶层;而 L1、L2、L3 层的缓存由内嵌在缓存中的硬件逻辑进行管理;内存条作为存储在磁盘上的数据块的缓存,则由操作系统软件与 CPU 上的地址翻译硬件共同管理。

原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34615.html

(0)
小道研究's avatar小道研究
上一篇 2024年4月20日 下午9:36
下一篇 2024年4月20日 下午9:38

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注