转载

CSAPP Cache 详细解析

前言

又要来推荐 CSAPP 这本书啦。很多同学可能写了这么久代码,计算机的基本工作方式都不太懂,看这本书会给你一种融会贯通的感觉,小到二进制位级操作,大到手撸web服务器。

今天主要整理下 Cache 的运行机制。

什么是 Cache

编程说到底其实就是对数据的操作。 CPU 通过各种总线从读取数据,放入 ALU(运算器) 进行运算,然后再把数据放回主存中。下面是一个简单的示意图。

CSAPP Cache 详细解析

很明显。数据运输过程的时间,就是性能的提现。没有数据 CPU 只能在那里等待.所以为了加快主存到 CPU 的速度,系统设计者采取了存储设备分层的结构.

Cache 又称为 高速缓存存储器 ,是一种非常小非常快的存储器,同时也非常贵,放在 CPU主存 之间,相当于中介的存在,每当 CPU 取数据的时候总是先从 Cache 中找,如果 Cache 没有,再到 主存 找。

CPU主存 直接会放置多个 Cache ,越靠近 CPU 则越小越快越贵。

CSAPP Cache 详细解析

局部性

程序一般使用数据,都倾向于使用地址靠近的数据,或者是最近刚刚使用过的数据。回想下你之前写的程序是不是这样。比如说数组,一整块连续的地址循环访问。不断访问同一个数据去做求和之类的操作。所以分为如下

  • 时间局部性
  • 空间局部性

Cache工作原理

查找 Cache 中数据时,找到了称为 Hit ,没找到则称为 Miss

Cache Miss Type

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

Cache Replacement Policies(Cache替换策略)

  • Random 随机替换
  • LRU Least Recently Used ,替换最近最少使用的数据
  • FIFO 这个应该很熟悉先进先出法。先保存的数据先出去

Cache 查找原理

了解查找之前先要知道 Cache 的组成结构,总共分为两块。

  • set
  • line

一块Cache,有多个 set ,一个 set 有多行 line .

set 个数取决于你是几位的机器,因为查找数据的时候是根据地址来区分是哪个 set 的。

line 中又分成三块。

  • valid bit 标志位,标志这块数据是否有效
  • tag 相当于身份证,只有部分地址和这个 tag 对上以后,才能继续访问 block
  • block 数据真正存放的地方

那么地址又是如何划分的呢?也是分成三块

  • tag 对应前面line的tag
  • set index 用来查找属于哪个set
  • block offset 块偏移量确定数据的位置

我这么讲可能比较抽象,直接看下图,再对照着看上面的文字,应该比较容易理解。

CSAPP Cache 详细解析

所以 Cache 的查找过程是怎么样的呢?

  1. 根据 set index 找到属于哪个 set
  2. 查找 set 中的每一行 line
  3. 先看 valid bit 是否有效
  4. 接着比对 tag
  5. 根据 block offset 获取数据

回写策略

回写指的是,保持数据一致性,需要写回到主存中,这也很好理解,不回写的话数据就不同步了。

  • Write-through 直接把数据写回到主存中
  • Write-back 等知道数据在 Cache 中要被覆盖了再写回到主存中

Reference

CSAPP

CMU 15213

维基百科

原文  http://threezj.com/2016/05/04/csapp cache 详细解析/
正文到此结束
Loading...