读书笔记系列深入理解计算机系统之高速缓存

前言

CPU性能和内存访问速度差距不断拉大,CPU cache被加入到CPU中,指令,数据会被加入到L1~L3中。大多数情况,CPU只需要访问Cache就能拿到数据,无需访问内存。

高速缓存存储器

早期计算机,存储结构就三层,cpu寄存器,DRAM主存储器和磁盘存储。为了缓和cpu和主存之间的读写时间差距,在他们之间出现了SRAM高速缓存称为L1,之后又出现了L2,L3。

高速缓存的结构和存取机制

每个存储器地址有m位,形成2的m次方个地址;分为S个高速缓存组的数组;每个组有E个高速缓存行;每行由B字节数据块组成,一个有效位标识这个行是否有意义的信息,t个标记位标识存储在这个高速缓存行中的块。

高速缓存结构可以用元组(S,E,B,M)描述,高速缓存大小C指所有块大小的和,不包括标记位和有效位

直接映射高速缓存

直接映射的策略,确保每一个内存块地址,始终映射到CPU Cache地址,地址通常用mod运算实现。2的m次方在取模的时候,可直接取地址低N位,得到cache line地址。

缓存块

此处输入图片的描述

CPU获取数据流程

每个组的高速缓存行只有一行。当cpu执行读内存字w指令,首先向L1请求这个字,如果L1中有w的副本,直接返回给cpu,否则缓存不命中,L1向内存请求包含w的块的副本,请求块获取达到,存储在一个高速缓存行中,并返回给cpu字w,整个过程分为三步1组选择2行匹配3字抽取

如果缓存不命中,那么需要从下一级存储中获取被请求的块,然后将新块存储在组索引位指示组的一个高速缓存行中,如果组中已有行都是有效高速缓存行,就会进行替代。

组相连高速缓存

每个组有多于一个的高速缓存行,在进行行匹配时检查多个行标记位和有效位

全相连高速缓存

只包含一个组,但每个组有多个高速缓存行

编写高速缓存友好代码

写入方式

写直达

写回

缓存一致性问题

多核模式下,每个核的L1,L2的数据由于没有写回L3或主内存造成的数据不一致问题,叫做缓存一致性问题

解决方法

解决cpu cache之间的一致性,基于MESI协议,通过总线广播信号的方式。

总线嗅探 把所有读写请求通过BUS广播给所有CPU核心,让各个核心去嗅探这些请求,再根据本地情况进行响应

写失效,写失效协议里,只有一个CPU核心负责写入数据,其他核心,只是同步读取这个写入。写入后,广播一个失效请求告诉其他CPU核心。其他CPU核心,只判断自己是否也有失效版本的cache block,也标记失效。

写广播,一个写入请求广播到所有CPU核心,同时更新各个核心里cache。(传送数据需占用更多总线带宽)

MESI协议,是一种写失效协议。