下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

学习cache系统的简单知识

作者:课课家教育     来源: http://www.kokojia.com点击数:1868发布时间: 2019-01-23 20:38:42

标签: cacheCPU数据系统

  在计算机体系结构当中有这么一个名词——cache,那么这个cache究竟是什么呢?接下来我们就来学习学习吧。

  概念

  缓存(cache)大小是CPU的重要指标之一,其结构与大小对CPU速度的影响非常大。简单地讲,缓存就是用来存储一些常用或即将用到的数据或指令,当需要这些数据或指令的时候直接从缓存中读取,这样比到内存甚至硬盘中读取要快得多,能够大幅度提升cpu的处理速度。Cache的出现是为了解决CPU日益增长的核心时钟频率以及系统主内存日益落后的素质之间的矛盾。

  CPU与cache之间的数据交换是以"字"为单位,而cache与主存之间的数据交换是以"块"为单位,一个块由若干字组成,是定长的,以体现"保存下级存储器刚才被存取过的数据及其邻近小范围的数据"这一概念。

  CPU进行存储器读操作时,根据主存地址可分成命中和未命中两种情况。对于前者,从Cache中可直接读到所需的数据;对于后者,需访问主存,并将访问单元所在的整个块从内存中全部调入Cache,接着要修改Cache标记。若Cache已满,需按一定的替换算法,替换掉一个旧块。

  一级缓存中还分数据缓存(data cache,d-cache)和指令缓存(instruction cache,i-cache)。二者分别用来存放数据和执行这些数据的指令,而且两者可以同时被cpu访问,减少了争用cache所造成的冲突,提高了处理器效能。

  采用分立Cache技术,也就是将指令和数据分开,分别存放在指令Cache 和数据Cache中。这种分立Cache技术有利于CPU采用流水线方式执行指令。在流水线中,往往会发生在同一个操作周期同时需要预取一条指令和执行另一条指令的取数据操作的情况。若采用指令和数据统一的Cache,则这种情况会造成取指令和取数据的访存冲突,冲突的结果就是使得流水线产生断流的情况发生,从而严重影响流水线的效率。采用分立Cache技术,因为取指令和取数据分别在不同的Cache中同时进行,因而不会产生冲突,有利于流水线的实现

  二级缓存(L2 CACHE)出现是为了协调一级缓存与内存之间的速度。最初缓存只有一级,后来处理器速度又提升了,一级缓存不够用了,于是就添加了二级缓存。二级缓存是比一级缓存速度更慢,容量更大的内存,主要就是做一级缓存和内存之间数据临时交换的地方用。“L1级Cache-L2级Cache-主存”这种层次从工作原理上讲与前述的Cache工作原理是完全相同的,即CPU首先访L1级Cache,若不命中,再访问L2级Cache和主存。

  Cache的分类

  Cache按写操作模式来分又分为写穿(write through)和写回(write back)两种,由于写穿模式的效率要比写回模式低很多,所以目前绝大多数应用中都是采用的写回模式。

  按用途来说,cache分为ICache和DCache,分别作为指令和数据缓存,在某些老的架构中,指令和数据混用一个cache。

  Cache的最小操作单位是行(line),也就是说每次cache的操作必须是以32个字节为单位,不能只选择其中某个字节。而且这32个字节数据的首地址必须是32字节对齐的。每一行的大小并不是一定的,在其发展历史中曾经有过很多种选择,目前比较通用的一个选择是每行32个字节,对于32位risc来说就是4个word

  按寻址方式分,cache可以分为全相联映射,直接映射和多路组相联映射cache

  全相联映射

  所谓的全相联映射指的是任意一行地址中的数据可以放到任意一个cache line中,cpu都可以根据tag和index准确地寻址到。

  举个例子来说明这种方式,比如说从地址0x3100 0000到地址0x3100 001F的这32个字节的数据,如果想做到它可以放到任一行中,那么我们就必须得保证针对于任一行数据,都要提供给它唯一的一个标识符,也就是说在32位系统中,由于地址是32位的,行本身是32个字节,表示行内偏移占用了5位,那么必须得提供27位的标识符(针对本例,这个标识符就得是0x188000),才能保证任一行数据可以放置到任一cache行中,并能够被正确寻址。

  而全相联cache的问题不仅仅是需要硬件连线比较多,而且它的效率比较低,在极端情况下可能找一个数据需要寻址整个cache。

学习cache系统的简单知识_cache_CPU_数据系统_课课家 

1 全相联Cache的结构示意图

  直接映射Cache

  为了简化cache的设计并提高效率,提出了直接映射的概念,直接映射cache中,对于任一地址,它在cache中有且只有一个line会与之匹配,并且这个line的index是固定的,大大简化了cpu对cache的操作和寻址流程。

  还是拿上面那个地址为例,假设cache是4k bytes大小的,每一行还是32 bytes,那么0x3100 0000这个地址就肯定出现在cache的第一行(或者说index为0),0x XXXX X020这个地址出现在cache的第二行(index为1), 0x XXXX Xfff这个地址就一定出现在cache的第128行(index为127),这样的话对于任一地址,cpu只需到相应的行上去坚持tag是否符合来决定是hit还是miss。

 直接映射Cache的结构示意图 

2 直接映射Cache的结构示意图

  多路组相联映射

  多路组相联的概念就是将多个并行的直接映射cache集成到一起,这样对于一个index就会有多个行与之相对应,比较每行的tag是否与想要的地址相符合,这样就会大大增加命中的几率,避免了一小段程序中频繁cache失效的问题。

组相联直接映射Cache的结构示意图 

3 组相联直接映射Cache的结构示意图

  即使是多路组相联的cache也面临着替换的问题,随着系统运行时间的增加,所有的cache行都会被占满,这时再有新地址的数据请求进来,就要将已有的数据替换出去,而将哪一组的相应行替换出去又成为了一个问题,过去采用的方式有轮转替换,随机替换等,目前较多采用的方式被称为LRU(least recently used),也就是将最近最少使用的行替换掉,这也是对局部性原理的一种应用。

  现有 Cache系统的特点

  目前业界使用得最多的Cache系统主要是memcached和Redis。这两个Cache系统都有都有很大的用户群,可以说是比较成熟的解决方案,也是很多系统当然的选择。不过,在使用memcached和redis过程中,还是碰到了不少的问题和局限:

  Cluster支持不够。在扩容、负载均衡、高可用等方面存在明显不足。

  持久化支持不好,出现问题后恢复的代价大。memcached完全不支持持久化,redis的持久化会造成系统间歇性的负载很高。

  Cache/主存系统的读操作原理

CPU试图读取主存一个字时,发出此字内存地址同时到达cache和主存,此时cache控制逻辑依据地址的标记部分进行判断此字当前是否在cache中。若是(命中),此字立即递交给CPU,若否(未命中),则要用主存读取周期把这个字从主存读出送到CPU,与此同时把含有这个字的整个数据块从主存读出送到cache中。由于程序的存储器访问具有局部性,当为满足一次访问需求而取来一个数据块时,下面的多次访问很可能是读取此块中的其它字。

Cache/主存系统的读操作原理 

4 Cache/主存系统的读操作原理

cache的读操作流程示意 

5 cache的读操作流程示意

  有关Cache的内容还是挺多的,小编在这里就讲到上面的那些了,如果大家看完以上的内容还想了解其他的,可自行去深入地学习。课课家教育有海量的各类学习网络视频等着您的到来哦。

赞(21)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程