阅读 118

cache在cpu里面吗,cache中存储的数据在断电后

本文将介绍有关存储的知识。 存储器在计算机中处于非常重要的位置,其中内存是最重要的,其内容主要包括缓存缓存和虚拟内存两大块。 在本文中,我们首先来看一下缓存的基本原理。

存储器分层结构

存储器有很多种,常见的有内存、磁盘,还有平时看不到的集成在CPU内部的寄存器、缓存等。

通常,随着CPU速度和性能的提高,存储容量和性能应该会随着CPU数据处理而提高。 但是随着时间的推移,CPU和存储器的性能差异越来越大,存储器性能的增长已经不能满足CPU性能发展的需要。

我该怎么办?

为了减小内存和CPU之间的性能差异,计算机内部通常采用分层的内存体系结构来实现内存的综合性能。

存储分层结构如下:

最上层是寄存器,存取时间非常快,但容量很小。 其次是高速缓存,访问时间其次,容量比寄存器稍大。 再下面,是一般的内存、硬盘。 访问速度减少,但容量越来越大。

当CPU访问数据时,数据通常在两个相邻层之间复制和传输,并且总是从低速存储器复制到高速存储器。 这将确保处理器速度和内存速度一致。

程序访问的局部性

最早的计算机在运行程序时,将硬盘数据加载到内存中,CPU从内存中检索代码和数据并执行,将计算结果写入内存,最终输出结果。

实际上,这本身没有问题,但后来发现,随着程序运行的增加,内存中的某个地址被访问后,有可能在短时间内继续访问该地址。 存储器内的某个地址被访问时,其相邻的存储单元也被访问的概率也很高。

人们发现的这个规律被称为程序访问的局部性。

程序访问的局部性有以下两种。

时间局部性:很可能在短时间内重新访问某个存储器单元

区域的局部性:某个存储器单元被访问后,很有可能在短时间内访问相邻的存储器单元

这是个简单的理由。 这是因为程序由指令和数据构成,指令按顺序存储在存储器内,地址是连续的。 运行循环程序、调用方法或在程序中遍历数组可能遵循上述局部原理。

那么,运行程序时,内存的某些单元很可能会频繁地访问和写入,可以在CPU和内存之间添加缓存吗? CPU在访问数据时,首先要看缓存中是否存在,如果有直接读取缓存中的数据即可。 如果缓存中不存在,则从内存读取数据。

实践证明,利用这种方式,程序的执行效率可以提高90%以上,该缓存也称为缓存缓存。

高速缓存高速缓存原理

高速缓存高速缓存是一种非常小的存储器,内置在CPU芯片中。 为了便于CPU、高速缓存高速缓存和内存之间的信息交换,内存按块划分,高速缓存高速缓存按行或槽划分。

CPU对内存、高速缓存和高速缓存的数据访问过程如图所示。

CPU首先调查Cache中是否有数据,如果有,直接读取即可。

如果不在Cache中,则在从内存读取数据的同时将数据放入Cache,并将数据返回给CPU。

虽然整个过程很简单,但是关于缓存和内存信息的交换,需要考虑一些问题。

CPU读取数据时,如果Cache中没有数据,从内存中读取数据后如何分配给Cache?

Cache填满后,用什么策略替换?

对于CPU写入数据,如何保证缓存数据和内存数据的一致性?

针对这三个问题,依次分析是如何解决的。

Cache和内存的映射方法

第一个问题是,如果数据未命中Cache,内存数据如何分配给Cache?

由于内存容量比Cache大,两者的容量不一致,为了将内存数据填充到Cache中,需要设计使Cache的利用率最大,使CPU访问Cache的命中率最大的规则。

到Cache的内存映射规则有三种。

直接映射:每个内存块数据仅映射到固定的缓存行

全相相关映射:每个内存块数据可以映射到任何缓存行

组联接映射:每个内存块数据可以映射到固定组的任何高速缓存行

让我们分别看看这三种映射方式。

直接映射

访问存储器数据时,会给出存储器地址。 首先,按位将该存储器地址分为三个字段。 标志、Cache行号、块内地址。 图:

然后根据第二个字段的二进制比特进行调制运算,得到对应的Cache行号。

如果找到对应的Cache编号,则检查Cache有效位,如果有效,则比较存储器第1字段的标志和Cache的标志是否一致,如果一致则直接获取Cache数据即可。

如果有效位无效,或者有效位有效但存储器第一字段中的标志与Cache标志不匹配,则根据存储器地址向存储器获取数据,将对应的Cache行的有效位设置为有效,并将标志设置为存储器标志

具体的映射关系如下。

enter">


可见Cache与内存的映射可能是一对多的,即不同内存块可能映射到同一Cache行。

这种映射方式比较简单粗暴,如果缓存不命中或内存和Cache标识不一致,就会替换Cache行中的数据。这就可能导致同一Cache行在短时间内被频繁替换,命中率不高。

全相联映射

全相联映射与直接映射方式不同的是,它把内存分成2个字段:标记、块内地址,没有了Cache行号这个字段。


在访问数据时,直接根据内存地址中的标记,去直接遍历对比每一个Cache行,直到找到一致的标记的Cache行,然后访问Cache中的数据即可。

如果遍历完Cache行后,没有找到一致的标记,那么会从内存中获取数据,然后找到空闲的Cache行,直接写入标记和数据即可。

也就是说,这种映射方式,就是哪里有空闲的Cache行,我就把内存块映射到这个Cache行中。在访问时,依次遍历Cache行,直到找到标记一直的Cache行,然后读取数据。

这种方式虽然在空间利用率上保证最大化,但其缺点在于要在Cache中寻找符合标识一致的行的时间要比直接映射的时间久,效率较低。

那有什么方式能集合上面2种方式,发挥各自的优势呢?这就是下面要说的组相联映射方式。

组相联映射

组相联映射方式把内存也分为3个字段:标记、Cache组号、块内地址


注意,与直接映射不同的是,第2个字段是组号而不是行号。这种方式把Cache行先进行分组,然后每个分组中包含多个Cache行,如图:


在访问数据时,先根据内存地址中的Cache组号,定位到Cache的分组,然后在这个组内,依次遍历每个行,寻找标记一致的Cache行,如果标记一致则获取数据,不一致则从内存中获取数据后写入当前组内空闲的任意一个Cache行中。

这种方式兼顾了访问速度和空间利用率,使用前2种方式结合的方案,保证缓存命中率最大化。在现实中实际上采用的这种映射方式。

Cache的替换算法

对于上面提的第2个问题,如果Cache满了,如何进行替换?

Cache容量比内存小,所以内存数据映射到Cache时,必然会导致Cache满的情况,那之后的内存映射要替Cache中的哪些行呢?这就需要制定一种策略。

常见的替换算法有如下几种:

先进先出算法(FIFO):总是把最早装入Cache的行替换掉,这种算法实现简单,但不能正确反映程序的访问局部性,命中率不高

最近最少使用算法(LRU):总是选择最近最少使用的Cache行替换,这种这种算法稍微复杂一些,但可以正确反映程序访问的局部性,命中率最高

最不经常使用算法(LFU):总是替换掉Cache中引用次数最少的行,与LRU类似,但没有LRU替换方式更精准

随机替换算法(Random):随机替换掉Cache中的行,与使用情况无关,命中率不高

现实使用最多的是最近最少使用算法(LRU)进行Cache行的替换方案,这种方案使得缓存的命中率最高。

Cache的一致性问题

上面提的第3个问题,对于写入的数据,如何保证Cache和内存数据的一致性?

试想,如果CPU想要修改某个内存的数据,这块内存的数据刚好在Cache中存在,那么是不是要同时更新Cache中的数据?

这个写入数据的过程,通常采用2种方式:

全写法(通写法/直写法/写直达法)

回写法(写回法)

全写法

在写操作时,如果Cache命中,则同时写Cache和内存。

如果Cache中不命中,则分为以下2种情况:

写分配法:先更新内存数据,然后再写入空闲的Cache行中,保证Cache有数据,提高了缓存命中率,但增加了写入Cache的开销

非写分配法:只更新内存数据,不写入Cache,只有等访问不命中时,再进行缓存写入

另外,这种方式为了减少内存的写入开销,一般会在Cache和内存之间加一个写缓冲队列,在CPU写入Cache的同时,也会写入缓冲队列,然后由存储控制器将缓冲队列写入内存。

如果在写操作不频繁的情况下,效果很好。但如果写操作频繁,则会导致写缓冲队列饱和而发生阻塞。

回写法

这种方式在写操作时,如果Cache命中,则只更新Cache而不更新内存。

如果Cache不命中,则从内存中读取内容,写入Cache并更新为最新内容。

这种方式不会主动更新内存,只有在Cache被再次修改时,才将内容一次性写入内存。这样做的好处是减少了写内存的次数,大大降低内存带宽需求。但有可能在某个时间点,Cache和内存中的数据会出现不一致的情况。

影响Cache的性能因素

既然Cache在CPU访问数据时提升的效率这么高,那决定Cache性能的因素有哪些?

决定访问性能的重要因素之一就是Cache的命中率,它与许多因素有关,具体涉及如下:

Cache容量:容量越大,缓存数据越多,命中率越高

内存块大小:大的内存交换单位能更好地利用空间局部性,但过大也会导致命中率降低,必须适中

除此之外,如何设计Cache也会影响到它的性能:

多级Cache:现在的CPU会采用3级Cache,最大程度的提升命中率

内存、总线、Cache连接结构:设计一个效率高的传输通道,能够提升Cache的访问速度

内存结构与Cache配合:在访问不命中时,会去访问内存,设计效率高的传输通道与Cache配合也可以提升Cache的性能

总结

本篇文章主要介绍了高速缓存Cache的重点知识,总结如下:

程序运行有访问局部性的规律:时间局部性、空间局部性

内存与Cache的映射方式有3种:直接映射、全相联映射、组相联映射,其中组相联映射方式命中率最高

Cache的替换算法有4种:先进先出(FIFO)、最近最少使用(LRU)、最不经常使用(LFU)、随机(Random),其中最近最少使用算法的命中率最高

保证内存与Cache的一致性方案有2种:全写法、回写法

影响Cache的性能因素有:容量、内存块大小、Cache组合、内存结构与传输通道设计等


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐