高速缓存cache详解

1.(高速缓存)cache

cache存在的意义:为了弥补处理器与主内存处理能力的鸿沟。硬件设计者,在处理器和主内存中引入高速缓存(cache)。cache的读写速度远大于主内存。引入高速缓存后,处理器的读写操作不直接与主内存打交道,而是通过高速缓存进行的。

cache结构

高速缓存相当于由硬件实现的容量极小的hash表,其键(key)是一个内存地址,其值(Value)是内存数据的副本或准备写入内存的数据。从内部结构来看,高速缓存相当于一个拉来你散列表,它包含若干桶(硬件上称为Set),每个桶又可以包含若干缓存条目

高速缓存cache详解

缓存条目又可被进一步划分为Tag、Data Block、Flag这三部分

  • Tag包含与缓存行中数据相应的内存地址的部分信息。
  • Data Block 也被称为缓存行,它是高速缓存与主内存之间的数据交换的最小单元。
  • Flag表示相应缓存行的状态信息。缓存行的容量(也被称为缓存行高度)通常是2的倍数,其大小在16~256字节(Byte)之间不等。从代码的角度来看,一个缓存行可以存储若干个变量的值,而多个变量的值可能被存储在同一个缓存行之中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pSEQUmSd-1637763757187)(E:\笔记\java\imag\25.png)]

处理器在执行内存访问操作时会将相应的内存地址解码。内存地址的解码结果包括tag、index、offset这三部分数据。

  • index相当于桶编号,根据Index可以定位到对应的桶
  • tag相当于缓存条目编号,一个桶对应多个缓存条目,通过tag我们能定位到缓存条目
  • offset 一个缓存条目中的缓存行中有多个变量,offset为要寻找的变量的偏移量,通过offset我们可以找到对应的变量。

如果我们能在cache子系统中找到对应的缓存条目并且Flag表示该缓存条目是有效的。那么我们称对应的内存操作产生了缓存命中(cache hit),否则就称相应的内存操作产生了缓存未命中(cache miss)

缓存未命中包括:读未命中和写未命中,分别对应内存读和写操作。

  • 读未命中:当读未命中时,处理器所需读取的数据就会从主内存中加载并被存放到相应的缓存行之中。这个过程会导致处理器停顿(Stall)而不能执行其它指令,不利于发昏处理器的处理能力

因为cache容量远小于主内存的容量,所以同一个缓存行在不同时刻存储的可能时不同的数据,因此缓存未命中时不可避免的。

linux下查看缓存未命中:

perf stat -e cache-references,cache-misses java io.github.viscent.mtia.chl.WelcomeApp

现代处理器一般具有多个层次的高数缓存:一级缓存,二级缓存,三级缓存…

一级缓存可能直接被集成在处理器的内核中,因此访问效率非常高,典型的情况是以及缓存的访问操作可以在2~4个处理器时钟循环内完成。一级缓存通常包括两部分:一部分存储指令,一部分存储数据。

上一篇:yarn与npm常用命令对比


下一篇:Golang 内存对齐和伪共享False Sharing