高速缓存

  • 上次主要讲了磁盘如何访问,访问时间分为哪三部分,逻辑磁区号以及固态硬盘SSD。并引入了程序局部性原理、存储器层次结构和缓存思想。
  • 因为存储器相对CPU发展慢的多,所以计算机系统主要瓶颈是存储器性能瓶颈。咱们经过创建存储器层次结构的解决方法,运用缓存思想、程序局部性原理(包括时间局部性和空间局部性)解决了这一问题
  • 下边咱们讨论缓存的工做机制和高速缓存案例

缓存中读取数据的状况

  • 缓存工做机制:用小存储区域作高速缓存,CPU请求数据时先通过第k层,看第k层有没有这个数据,这层没有,再到下层查询。而后将数据块从下层加载到上一层,此时若此层已满,要牺牲此层的区域
命中(hit)
  • 命中即在第k层里有这个数据。值得一提的是,因为空间局部性的存在(访问此字节数据,其附近数据在未来可能被访问),咱们在缓存数据时不是只缓存如今须要的这部分,而是将这部分附近的都要缓存进来。所以咱们将存储的数据分红块,每次缓存时将一整块都缓存进来。
未命中(miss)
  • 未命中即请求数据在缓存块中没有,这时咱们要一直往下层找,直到找到,而后把这一块数据放到缓存里,同时把请求的数据放处处理器中。这时就要考虑两个问题了,一个是映射,即咱们把这块数据放到上层存储设备的哪一区域内;另外一个是替换,即若上层已经满了,咱们要牺牲那块原来的数据块来替换他。
  • 咱们先来看替换,替换的基本原则是将将来一段时间内那块最不可能使用的换出去,咱们设计了两种推理猜想算法
  1. LRU(rencently):将最后一次使用时间离如今最远的丢掉。
  2. LFU(fluently):在缓存块中放计数器,把使用次数最少的换出去。
  3. 瞎蒙:随机丢出去一个

值得注意的是,咱们不推荐用人工智能、机器学习预测,这样可能准确性会更高,可是因为缓存须要短期完成,而机器算法一算就是半天,不符合实际。由此看出替换算法不能太过复杂算法

缓存未命中分为三种状况
冷未命中 第一次尝试访问时,必定没有加载到缓存中,因此必定不会命中
冲突不命中 与替换策略有关,若有一种替换策略是第i列数据只能进入缓存的第i块。先让0进去,再让8进去时就要把0换出来,0再进去时又得把8换出来。因为缓存的储存结构致使频繁的换入换出
容量不命中 若是当前须要使用的热区很是大或者程序空间局部性特征很是差,会使频繁访问的块超过缓存的存储空间(缓存太小或者工做集过大)
  • 缓存不光存在于硬件中,软件如浏览器一样有缓存机制。第一次加载网页图片可能较慢,但不远后的将来再次加载就会很快,由于浏览器已经将这些图片存储到磁盘上。

设计缓存中须要考虑的问题

  • 缓存的数据其实是内存中的哪个位置的数据。cpu发的地址是内存地址,若要判断是否在缓存中存在,须要有东西在缓存块中记录这一缓存块的原始地址。
  • 数据块被缓存时,要缓存到缓存的哪一个缓存块里
  • 写入缓存时的数据同步问题。写操做会改变数据,而在存储体系中,一个数据可能有多个副本存在,咱们改数据时改动的是哪一个数据;若没有全改,而致使产生数据不一致时,如何数据同步。对于数据同步策略,咱们一般加一个标志位来表示数据是否被改动,若标志位被置位,要考虑数据同步。脏数据标志位,描述数据有没有被改动。

高速缓存算法

  • CPU芯片不仅包含处理器,处理器只是一部分,负责作最终指令运算。高速缓存也在CPU芯片中,处理器中出来的数据,首先通过高速缓存,请求现有缓存解决,若能解决就先在CPU芯片内部解决,不发送到CPU外。未命中的再发到CPU芯片外
  • 值得注意的是,高速缓存的算法策略都是由硬件即电路来作,不是由软件完成,所以很是快。
  • QQ图片20200424151047.png

高速缓存的组织是一个二维结构,每一个块是一个缓存的基本单位,假设有E个列,S个行,B是每一个块能储存多少字节,都是2的整数次幂。缓存容量=E * S*B浏览器

  • QQ图片20200424150421.png每一个块除了存储数据以外,还须要至少两个字节表示一些信息。valid bit表示缓存块是否缓存了数据;tag描述缓存块与内存哪个区域创建了映射关系。
  • 而CPU在请求数据发来地址时,会把这个地址拆为组索引、块内偏移量、tag三个部分。收到地址后,先根据组索引,肯定到缓存中哪一个组查找;而后把这一组中全部块的tag与地址tag匹配,只有当valid bit为1且tag能匹配上时,才表示这个块命中;因为请求的数据每每只是块的一部分,还须要块内偏移量决定从块首偏移几个字节;最后由地址指向的的数据类型决定读取几个字节,完成最终读取。
  • 值得注意的是,组索引s和块内偏移量b位长都是S和B的二的整数幂的那个指数的位,这样刚好能够表示S和B中的每一个数
直接映射高速缓存
  • 当E等于1,有S组,可是每组只有一个快,称为直接映射高速缓存。这样由组索引能直接肯定块,再比对此块的tag和validbit 便可
  • QQ图片20200424151558.png

直接映射高速缓存的替换策略比较简单,这个进来那个出去;缺点是灵活性差,容易致使冲突未命中,致使性能降低缓存

组相连高速缓存

QQ图片20200424152422.png

  • 每组中有多个块,冲突未命中获得缓解,称为组相连高速缓存
  • 在相同缓存大小的状况下,增大E的值,每组中的块多了,冲突未命中获得缓解,提升性能;可是因为总容量不变,B也不便,E越高,势必致使分的组越少(S变少),甚至到到s=1,只有一组。
  • S=1的高速缓存称为全相连高速缓存,灵活度最高,只有一组,全部内存地址映射都到这组,每一个块能够存储内存中的任意块。是最灵活的高速缓存,可是实现困难,须要全部块的tag同时作匹配,并行度很是高,会带来很是大的性能开销,减慢速度。全相连高速缓存空间上利用最好,可是时间上利用更多。这里又用到了trade-off来看待时间和空间,能够说计算机作任何设计时采用的思想都是中庸之道,不须要性能或者利用率有一个作到最高,而是找一个平衡点
  • 全相连高速缓存对于内存地址作解析时只须要分为两段,不须要组索引,由于只有一组
相关文章
相关标签/搜索