- 在知乎发现一份不错得学习资料 请教CPU的cache中关于line,block,index等的理解?
PPT 地址 https%3A//cs.slu.edu/%7Efritts/CSCI224_S15/schedule/chap6-cache-memory.pptx
课程主页 https://cs.slu.edu/~fritts/CSCI224_S15/schedule/
文章目录
- 1. cache概念
- 2. cache hit
- 3. cache miss
- 4. 基本cache配置
- 5. cache read
1. cache概念
-
主存与缓存的关系:
- 图中展示了主存和缓存的结构关系,主存(Memory)分成了若干数据块(blocks),每个数据块用一个数字编号,例如从0到15。
- 缓存(Cache)则是一个容量较小的存储区域,它只保存了一部分主存中的数据块,用于加速数据的访问。
-
数据块示例:
- 在这个例子中,缓存中保存了主存中的几个数据块,包括编号为4、9、14和3的数据块。
- 这些数据块对应的内容从主存复制到缓存中,以便在访问这些块时不需要直接从主存读取,而是可以从较快的缓存中读取。
-
颜色表示的含义:
- 图中用颜色(如红色和绿色)标注了一些特定的数据块。
- 例如,红色的数据块4表示这个数据块在主存和缓存中都存在。
- 绿色的数据块14也是如此,表示它在缓存和主存中都有一份拷贝。
-
数据传输过程:
- 图中箭头指示了数据传输的方向,表明数据是以“块”为单位在主存和缓存之间进行传输。
- 比如,如果处理器需要访问数据块14的数据,而该数据块已经在缓存中,处理器可以直接从缓存读取数据块14,而无需访问较慢的主存。
- 如果缓存中没有所需的数据块,则需要从主存中将该数据块加载到缓存,以便之后的快速访问。
-
缓存的优点:
- 缓存是一种较小但速度更快的存储器,可以显著减少处理器访问主存的时间。
- 在这个例子中,缓存中保存了主存中频繁访问的数据块,从而减少了对较慢主存的访问频率,提高了整体系统的性能。
总结:这个例子展示了缓存如何通过存储主存中部分频繁访问的数据块,减少对主存的直接访问,进而提升系统访问速度。
2. cache hit
这个图展示了**缓存命中(Cache Hit)**的概念,具体描述如下:
-
缓存命中的定义:
- 缓存命中指的是,当处理器请求访问某个数据块时,该数据块已经在缓存中存在。因此,处理器可以直接从缓存中读取数据,而不需要访问较慢的主存(Memory)。
-
例子中的情况:
- 在图中,处理器请求访问数据块“14”(图中标注为“Request: 14”)。
- 此时,数据块14已经存在于缓存中(用红色高亮显示)。
- 因为数据块14在缓存中已经存在,这次访问被称为**“命中”(Hit)**。
-
缓存命中的效果:
- 当发生缓存命中时,数据可以直接从缓存中读取,省去了从主存中加载数据的时间。这种机制显著提高了数据访问的速度,因为缓存的访问速度比主存更快。
- 在图的右侧,以红字注明了“Hit!”,表示这次访问成功命中缓存。
-
缓存与主存的关系:
- 缓存存储了主存中某些经常访问的数据块(例如图中显示的8、9、14和3),以便处理器能够更快地获取数据。
- 当请求的数据块在缓存中时,处理器无需从主存获取该数据块,从而加快了数据读取速度。
总结:在这个例子中,处理器需要的数据块“14”已经在缓存中,因此发生了缓存命中(Cache Hit),处理器可以直接从缓存读取数据块14,无需访问主存,从而提高了效率。
3. cache miss
-
缓存未命中的定义:
- 当处理器请求某个数据块(例如数据块12)时,如果该数据块不在缓存中,这种情况称为缓存未命中(Cache Miss)。
- 缓存未命中时,系统需要从较慢的主存(Memory)中读取数据块,将其加载到缓存中,以便后续更快的访问。
-
例子中的情况:
- 在图中,处理器请求访问数据块“12”(图中标注为“Request: 12”)。
- 当前缓存中并没有数据块12,因此发生了未命中(Miss),这一情况在右侧以红字注明。
-
数据加载过程:
- 由于缓存中没有数据块12,系统会从主存中读取数据块12,并将其加载到缓存中。
- 图中箭头指示了数据块12从主存移动到缓存的过程。
- 加载到缓存后,数据块12可以被缓存保存,以便未来快速访问。
-
缓存策略:
- 放置策略(Placement Policy):确定新加载的数据块在缓存中的存放位置。这里,数据块12被放置在缓存中的一个空位置。
- 替换策略(Replacement Policy):如果缓存已满,系统需要决定哪个数据块需要被替换(移出缓存)以腾出空间。此例中未展示替换过程,但在缓存满的情况下,这一策略会非常重要。
-
未命中的效果:
- 缓存未命中会导致数据访问速度减慢,因为系统需要从主存中加载数据,这比直接从缓存读取数据要慢。
- 但加载完成后,如果该数据块之后再次被请求,可以直接从缓存读取,提升后续的访问速度。
总结:在这个例子中,处理器请求的数据块12不在缓存中,因此发生了缓存未命中(Cache Miss)。系统从主存中加载数据块12到缓存,为后续的快速访问做好准备。
4. 基本cache配置
这张图展示了缓存的通用组织结构,通过参数 ( S )、( E )、和 ( B ) 来定义缓存的配置。具体解释如下:
-
缓存的组成部分:
- Set(组):缓存被分为多个组,图中每一行表示一个组。
- Line(行):每个组包含若干行。行代表缓存中存储数据块的单元。
- Block(块):每行包含一个数据块,数据块由多个字节组成。
-
参数解释:
- ( S = 2^s )(组的数量):缓存中一共有 ( S ) 个组。
- ( E = 2^e )(每组的行数):每个组包含 ( E ) 行,也可以称为组相联度。例如,( E = 1 ) 表示直接映射缓存,( E > 1 ) 表示组相联缓存。
- ( B = 2^b )(每块的字节数):每个缓存块的数据量是 ( B ) 个字节。
-
缓存大小计算:
- 缓存的总大小 ( C ) 计算公式为:
C = S × E × B C = S \times E \times B C=S×E×B - 这个公式表示缓存的容量等于组数乘以每组的行数再乘以每块的字节数。
- 缓存的总大小 ( C ) 计算公式为:
-
每行的结构:
- 有效位(Valid Bit):用于指示这一行是否包含有效的数据。
- 标记(Tag):标识主存中数据块的标记,用于在缓存中定位具体的地址。
- 数据(Data):实际存储的数据块,每块包含 ( B ) 个字节。
-
工作机制:
- 当访问一个地址时,首先根据地址中的组编号定位到特定的组。
- 然后根据标记位判断所需的数据块是否在该组中(即是否命中)。
- 如果命中,则读取数据块中的内容;如果未命中,则需要将数据从主存加载到缓存中。
总结:图中的结构展示了缓存的典型组织方式,包括组、行和块。通过参数 ( S )、( E )、和 ( B ) 定义了缓存的结构和大小,具体到每行的结构,包括有效位、标记位和数据块。
5. cache read
这张图展示了**缓存读取(Cache Read)**的过程,具体解释如下:
-
地址分解:
- 内存地址被分成三个部分:标记位(Tag)、组索引(Set Index)和块偏移量(Block Offset)。
- 标记位(Tag):用于标识缓存行的唯一性,确定该地址属于哪个数据块。
- 组索引(Set Index):用于定位缓存中的特定组(Set),可以选择性地缩小搜索范围。
- 块偏移量(Block Offset):用于从缓存行中找到数据块的具体字节偏移。
- 内存地址被分成三个部分:标记位(Tag)、组索引(Set Index)和块偏移量(Block Offset)。
-
缓存组织结构:
- 缓存被分成了多个组(( S = 2^s )),每个组包含 ( E = 2^e ) 行(Line)。
- 每一行代表一个缓存块,包含有效位(Valid Bit)、标记(Tag)和数据块(Data Block),数据块的大小为 ( B = 2^b ) 字节。
-
读取流程:
- 步骤1:定位组:根据地址中的组索引(Set Index)选择特定的组。例如,如果组索引表示第3组,则缓存系统会直接定位到第3组进行下一步操作。
- 步骤2:检查标记位:在选定的组中,缓存系统检查每一行的标记(Tag)是否与地址中的标记位匹配。
- 如果有匹配的标记,并且有效位(Valid Bit)为1,表示命中缓存,可以直接读取数据。
- 如果没有匹配的标记,或者有效位为0,则发生缓存未命中。
- 步骤3:数据偏移定位:在缓存命中的情况下,使用块偏移量(Block Offset)定位到缓存行中的具体字节位置,从该位置开始读取数据。
-
图中右上角的总结:
- 定位到组(Locate Set)。
- 检查组中的每一行,判断是否有行的标记与地址的标记位匹配(Check if any line in set has matching tag)。
- 如果标记匹配且有效位为1,则表示命中(Yes + line valid: hit)。
- 命中后,根据偏移量读取数据(Locate data starting at offset)。
-
缓存行结构:
- 每个缓存行包含一个有效位、标记和数据块。
- 有效位用于指示该缓存行是否包含有效数据;标记用于区分内存中的具体地址;数据块则保存从内存中加载的数据。
总结:这个例子展示了在缓存中读取数据的完整流程,包括地址分解、定位组、检查标记、判断是否命中,以及根据偏移量读取数据的步骤。这个过程旨在通过缓存实现更快速的数据访问。