cache存在的意义:为了弥补处理器与主内存处理能力的鸿沟。硬件设计者,在处理器和主内存中引入高速缓存(cache)。cache的读写速度远大于主内存。引入高速缓存后,处理器的读写操作不直接与主内存打交道,而是通过高速缓存进行的。
cache结构:
高速缓存相当于由硬件实现的容量极小的hash表,其键(key)是一个内存地址,其值(Value)是内存数据的副本或准备写入内存的数据。从内部结构来看,高速缓存相当于一个拉来你散列表,它包含若干桶(硬件上称为Set),每个桶又可以包含若干缓存条目
缓存条目又可被进一步划分为Tag、Data Block、Flag这三部分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSEQUmSd-1637763757187)(E:\笔记\java\imag\25.png)]
处理器在执行内存访问操作时会将相应的内存地址解码。内存地址的解码结果包括tag、index、offset这三部分数据。
如果我们能在cache子系统中找到对应的缓存条目并且Flag表示该缓存条目是有效的。那么我们称对应的内存操作产生了缓存命中(cache hit),否则就称相应的内存操作产生了缓存未命中(cache miss)
缓存未命中包括:读未命中和写未命中,分别对应内存读和写操作。
因为cache容量远小于主内存的容量,所以同一个缓存行在不同时刻存储的可能时不同的数据,因此缓存未命中时不可避免的。
linux下查看缓存未命中:
perf stat -e cache-references,cache-misses java io.github.viscent.mtia.chl.WelcomeApp
现代处理器一般具有多个层次的高数缓存:一级缓存,二级缓存,三级缓存…
一级缓存可能直接被集成在处理器的内核中,因此访问效率非常高,典型的情况是以及缓存的访问操作可以在2~4个处理器时钟循环内完成。一级缓存通常包括两部分:一部分存储指令,一部分存储数据。