CPU总体概述
CPU 缓存「Cache」指的访问速度比一般内存快得多的高速存储器,主要是为了解决 CPU 运算速率与内存读写速率不匹配的问题。因为 CPU 的运算速率比内存读写速率快得多,当 CPU 需要向内存请求数据或者写入数据时,就需要一直等待内存缓慢的读写。在这个过程中,CPU 的高速运算能力就无法得到充分发挥。
所以缓存的作用就像是 CPU 和内存之间进行数据缓冲的桥梁。
缓存中的数据是内存中的一部分,这一部分数据被认为是 CPU 在短时间内会即将访问到的数据。当 CPU 在调用数据时,会先从缓存中调用,而不直接通过内存。当在缓存中找到想要的数据时,就会立即读取并返回给 CPU 处理;如果没有找到,就以相对较慢的速度从内存中读取,同时将这个数据所在的数据块都调入缓存中,方便下次对该数据块的读取。主要原因是程序在运行时对内存的访问会出呈现局部性的特征,这种特征表现在使用了某一个数据时,该数据附近的数据会有更高的概率在下次访问时被使用到,这就是局部性原理。
计算机存储系统
一般而言,通用计算机的存储层级分为四层,分别为 CPU 内部寄存器、高速缓存、主存储器和辅存储器。主存可以看作是一般而言的内存,而辅存又可根据是否与计算机相连分为联机和脱机两种类型。
从层次结构上可以看出,高速缓存处于第二层次,起到承上启下的作用。而为了能够与 CPU 进行高速交互,同时与主存进行数据的交换,高速缓存的结构也十分具有个人特色。
高速缓存并不是一种概念上的缓存,而是由特定 SRAM 组成的物理芯片。在现代 CPU 中,大量的空间都已经被 SRAM 占据。下图是一张Intel CPU的放大图片,红色框标出的就是其中一部分高速缓存。
SRAM:SRAM是指静态随机存储器,它具有静止存取的功能,也就是可以不需要刷新电路就保存内部的数据。性能高,功耗小,速度快,价格高。
高速缓存一般由两部分组成,控制部分和存储器部分。控制部分是用来判断 CPU 所请求的数据是否保存在存储器中,如果在,则称为命中;若不在,则没有命中。
当 CPU 命中缓存时,即可直接对高速缓存的存储器进行寻址;未命中时,则需要根据缓存替换算法将主存中的数据块替换到高速缓存的存储器中。实际上地址映像方法就是为了将主存地址与高速缓存中存储器的地址对应起来,进行地址的映射,这样 CPU 在工作才能通过缓存正确地对主存数据进行快速读写。地址映像方法有三种,直接映像,全相联映像和组相联映像。
直接映像
直接映像的图示如下,主存单元中的区块与缓存中内存块的关系是固定的,主存中的内存块只会存放在高速缓存存储器中的相同块号。因此,只要主存地址中的主存区号与缓存中的主存区号相同,则表明访问缓存命中。
全相联映像
为了解决直接映射造成灵活性差,缓存空间无法充分利用的问题,全相联映像的方式被提出来。全相联与直接映像就是两个极端,一个只能访问主存单元中固定的主存区块进行对应,一个就允许任意主存的块调入高速缓存存储器中任意的块。
在进行地址变换时,当主存地址高位的主存块号与高速缓存中中主存块号相比时,有相同的块号即表示命中。一旦命中,CPU 即可通过缓存存储器中的块内地址访问到相应的数据。
全相联映像能够提供非常灵活的变换方式,不受主存所在块的限制。但是同样也是由于过于灵活,导致实际在变换的时候,无法从主存块号直接获得高速缓存存储器的块号,变换过程相对比较复杂,速度也比较慢。
组相连映像
既然两者方法各有利弊,不妨我们就折中一下。因而有了中庸的组相连映像方式。组相连方式就是将主存和高速缓存存储器中的块再分成组,组之间采用直接映像方式,而组内的块则采用全相联映像方式。具体的实现可以参考以下图示。
举例来说,主存任何区的0组只能存到高速缓存中的0组中,1组只能存到1组。这就是所谓组间的直接映像。而主存相同一组的任意一块可以存入高速缓存相同组中的任意一块。这就是所谓组内的全相联方式。
在进行地址变换时,可通过直接映像方式来决定组号,在一组内再用全相联映像方式决定高速缓存中的块号。通过比较主存地址高位决定的主存区号与缓存中的区号,即可决定是否命中。
缓存替换算法的目的很明显,就是为了使得高速缓存获得尽可能高的命中率,当缓存的存储器满了的时候,将不用的数据块进行删除,替换新的数据。常用的替换算法有以下几种:
- 随机替换算法:顾名思义,就是通过随机获得一个需要被替换的块号,并用新的数据替换该块。
- 先进先出算法:即FIFO,通过缓存中的块进入队列的先后顺序进行淘汰和替换,先进入缓存的数据块最先被替换。
- 最近最少使用算法:即LRU,将近期最少使用的缓存块替换出去。这种算法在实现的时候将最近使用的的数据块放置到靠近缓存顶部的位置。每一次替换都从缓存尾部开始进行。
- 最不经常使用算法:即LFU,这个算法需要记录每一个缓存块被访问的频率,每一次替换都从最低访问频率的数据块开始。
- 最近最常使用算法,即MRU,这个算法会最先移除最近最常使用的数据块。
替换算法说白了,就是看采用怎么样的策略将缓存中的数据块替换出去。在实际的应用中,还会根据程序具体的情况对不同的算法进行优化选择。
本文转自:一则故事带你了解CPU缓存原理!