1.(高速缓存) cache cache存在的意义)为了弥补处理器和主内存处理能力之间的差距。 硬件设计师在处理器和主存储器中引入缓存。 cache的读写速度远远快于主存储器。 部署高速缓存后,处理器的读写操作通过高速缓存进行,而不是直接与主存进行交互。

cache结构

高速缓存相当于由硬件实现的非常小的hash表,其中密钥(key )是内存地址,值(Value )是准备复制内存数据或写入内存的数据。 从内部结构上看,高速缓存相当于一个引出列表,其中包含几个桶(硬件上称为Set ),每个桶可以包含几个高速缓存条目

缓存入口可以进一步分为Tag、数据块、Flag个部分

Tag包含与高速缓存行中的数据相对应的内存地址的部分信息。 数据块也称为高速缓存行,是高速缓存和主存储器之间数据交换的最小单位。 标志表示相应高速缓存行的状态信息。 缓存线容量(也称为缓存线高度)通常为2的倍数,大小为16到256字节(字节)。 从代码的角度看,多个变量的值可以存储在一条缓存线上,而多个变量的值可以存储在同一条缓存线上。 [导出外链图像失败。 源站可能有防盗链机制。 我们建议您保存并直接上传图片。 (img-pSEQUmSd-1637763757187 ) ) E:\(备注(Java(imag ) 25.png ) )

处理器在执行内存访问操作时解码对应的存储器地址。 存储器地址的解码结果包含tag、index、offset三个数据。

索引相当于存储区编号,通过索引对应的存储区tag相当于缓存条目编号,1个存储区相当于多个缓存条目,通过tag将缓存条目offset的1个缓存条目中的缓存行变更为多个如果在cache子系统中找到相应的缓存条目,则Flag指示缓存条目有效。 那么,将对应的存储器操作称为发生了高速缓存命中(cache hit ),否则,将对应的存储器操作称为发生了高速缓存未中)

缓存错误包括:读取错误和写入错误,它们分别支持内存读取和写入操作。

读取错误:如果发生读取错误,需要处理器读取的数据将从主存储器加载并存储在相应的高速缓存行中。这个过程会导致处理器停顿(Stall)而不能执行其它指令,不利于发昏处理器的处理能力高速缓存的容量远远小于主内存的容量,因此在同一高速缓存线上可能在不同时间存储的数据不同,如果高速缓存未命中,则不可避免。

在linux上查看缓存未命中:

perf stat -e cache-references,cache-missesjavaio.github.VI scent.mtia.CHL.welcome app现代处理器一般具有多个级别的高频率高速缓存包括一级高速缓存、二级高速缓存和三级高速缓存

由于l1高速缓存直接嵌入处理器核心,访问效率非常高,典型的情况是,访问高速缓存的操作需要2-4个处理器的时钟周期。一级缓存通常包括两部分:一部分存储指令,一部分存储数据。