当前位置: 首页 > 工具软件 > xxl-cache > 使用案例 >

Cache简介(一)

红智鑫
2023-12-01

cache是干啥的?
在以前,CPU的主频比较慢,CPU和内存DRAM之间速度差别不是很大,存储数据或者指令还OK。但是CPU的飞速发展,CPU大哥速度已经飞快,而内存速度却跟不上大哥的步伐,所以大哥每次要读取或者写入内存的时候都要等一等小弟,这个时候怎么办。cache就出来了,它类似与一个第三方。位于内存和CPU之间,速度非常快,所以CPU就把数据直接写入cache,然后CPU就可以干其他的了,剩下的事情就交给cache这个跑腿的,cache在合适的时机可以慢慢的把数据写入内存,也就是相当于解了CPU的燃眉之急。

说白了,CPU要读数据首先是在cache中读,如果cache命中,也叫cache hit,CPU就可以极快的得到该地址处的值。如果cache miss 也就是没有命中,它就会通过总线在内存中去读,并把连续的一块单元加载到cache中,下次好使用。

cache大多是SRAM(静态RAM),而内存大多是DRAM(动态随即存储)或者DDR(双倍动态随机存储)。
cache容量一般非常小,因为价格贵,所以cache小是有道理的。一级cache一般就几KB,cache 的单位又分成cache line ,它是从内存单元加载到cache中的最小单元,一般为几个字大小,32字节或者64字节偏多。(因为时间局部性和空间局部性所以加载一次是以一个cache单元为最小单位)

cache有两种模式(写回模式) 和 (写通模式)
写回?写通? 回哪儿?通哪儿?
当然是内存啊!!!

简单介绍,写通也就是当CPU写入cache的时候,将数据再从cache 中写到内存中,这两个过程要都结束后,CPU的写入操作才算完成,也就是时刻保持内存和缓存的同步,这显然是很耗时的。

什么是多级cache?
一级cache 有指令cache和数据cache之分,这使整个系统更加高效,因为1Lcache 容量小,所以有了多级cache ,比如二级cache ,他容量大,但是速度就要比1Lcache 慢些,但比内存快多了。三级cache就更一些了。

写回也就是当CPU写入cache中的时候,数据不会马上从cache中写到内存里面,而是等待时机成熟后写入(比如 发生cache miss,其他内存要占用该cache line的时候将该单元写回到内存中,或者一定周期后写入到内存中 ,或者其它地核需要读取该内存的时候)。

内存写入cache的时候,如果cache 满了,则用一定的算法淘汰,比如随机淘汰还有或者LRU淘汰(用的少的被淘汰 常用)来替换掉原来的cache line 单元。

下面说CPU如何高效查询cache,介绍三种模式

1、全相连模式。
也就是一定大小的内存块,可以映射到cache的任何一个cache line当中。
很好理解,CPU查询cache line 却要花很多时间。不可取不可取。

2、直接映射
也就是内存按照cache line 的大小按照顺序映射到cache中,比如cache大小为1kb,每个cache line 为32字节。则共有32个cache line。CPU的内存空间为4G,
内存 cache
0x0~0x19 ————–> cache line 0
0x20~0x39 ————–> cache line 1
0x40~0x59 ————–> cache line 2
………..
0x400~0x419 —————> cache line 0
0x420~0x439 —————-> cache line 1

也就是一个内存的地址有确定的cache line 号,所以查询速度很快,但是问题又来了,多个地址竞争同一个cache line ,而且程序具有空间局部性,可能或造成很多的cache没被使用,而有几个cache line却被频繁的换入换出。也不行。

3、N WAY cache。(N路cache)

这个方法综合了前面两种方法,也就是cache被分为N份,如4路cache ,cache总容量被四等分,比如1kb的cache,cache line大小为32字节,每一路cache有256字节容量,也就是8个单元的cache line。
这怎么映射的呢?

内存也是被分为cache line 的大小为一个映射单位。但是内存0x0~0x19就存在cache line 0,(四路简单粗暴的理解为有四个cache line 0、cache line 1…cache line 7 而这四个cache line 0又被合称为一个集合也就是cache set),0x0~0x19就可以随机选择存储在四路当中的某一路,这样就不用被频繁的换入换出,又索引的很快。
实际上可以这样理解当N等于1的时候也就是直接映射,当N恰好等于 (内存大小/缓存大小) 时就相当于全相连模式。

 类似资料: