又要来推荐 CSAPP
这本书啦。很多同学可能写了这么久代码,计算机的基本工作方式都不太懂,看这本书会给你一种融会贯通的感觉,小到二进制位级操作,大到手撸web服务器。
今天主要整理下 Cache
的运行机制。
Cache
编程说到底其实就是对数据的操作。 CPU
通过各种总线从读取数据,放入 ALU(运算器)
进行运算,然后再把数据放回主存中。下面是一个简单的示意图。
很明显。数据运输过程的时间,就是性能的提现。没有数据 CPU
只能在那里等待.所以为了加快主存到 CPU
的速度,系统设计者采取了存储设备分层的结构.
Cache
又称为 高速缓存存储器
,是一种非常小非常快的存储器,同时也非常贵,放在 CPU
和 主存
之间,相当于中介的存在,每当 CPU
取数据的时候总是先从 Cache
中找,如果 Cache
没有,再到 主存
找。
CPU
和 主存
直接会放置多个 Cache
,越靠近 CPU
则越小越快越贵。
程序一般使用数据,都倾向于使用地址靠近的数据,或者是最近刚刚使用过的数据。回想下你之前写的程序是不是这样。比如说数组,一整块连续的地址循环访问。不断访问同一个数据去做求和之类的操作。所以分为如下
查找 Cache
中数据时,找到了称为 Hit
,没找到则称为 Miss
Miss
的情况分为三种
Cold Miss
.也就是第一次找的时候, Cache
不含数据,当然是 Miss
Conflict Miss
.比较有意思的一种的情况。比如说第一次查找数据 0
,第一次时不含数据属于 Cold Miss
,然后就去主存中找,放到 Cache
中,第二次查找需要数据 8
,又没有,继续去主存那里找,注意!, 8
把放到 Cache
中时覆盖了 0
,第三次你又需要 0
了,然后就悲剧了,不断 0,8,0,8,0,8,0,8 Miss
,当然这里涉及到一个写策略。 Capacity Miss
.这种也比较容易理解,就是你需要的数据超过 Cache
的大小了,当然 Miss
了 Random
随机替换 LRU
Least Recently Used
,替换最近最少使用的数据 FIFO
这个应该很熟悉先进先出法。先保存的数据先出去 了解查找之前先要知道 Cache
的组成结构,总共分为两块。
set
line
一块Cache,有多个 set
,一个 set
有多行 line
.
set
个数取决于你是几位的机器,因为查找数据的时候是根据地址来区分是哪个 set
的。
line
中又分成三块。
valid bit
标志位,标志这块数据是否有效 tag
相当于身份证,只有部分地址和这个 tag
对上以后,才能继续访问 block
block
数据真正存放的地方 那么地址又是如何划分的呢?也是分成三块
tag
对应前面line的tag set index
用来查找属于哪个set block offset
块偏移量确定数据的位置 我这么讲可能比较抽象,直接看下图,再对照着看上面的文字,应该比较容易理解。
所以 Cache
的查找过程是怎么样的呢?
set index
找到属于哪个 set
set
中的每一行 line
valid bit
是否有效 tag
block offset
获取数据 回写指的是,保持数据一致性,需要写回到主存中,这也很好理解,不回写的话数据就不同步了。
Write-through
直接把数据写回到主存中 Write-back
等知道数据在 Cache
中要被覆盖了再写回到主存中 CSAPP
CMU 15213
维基百科