CPU实用缓存知识
了解一下CPU的缓存对性能的影响

了解一下CPU的缓存对性能的影响随着计算机技术的不断发展,处理器(CPU)作为计算机的核心组件,其性能在不断提升。
而在提升处理器性能的过程中,缓存技术起到了至关重要的作用。
本文将深入探讨CPU的缓存对性能的影响,并介绍缓存的工作原理以及常见的缓存优化方法。
一、缓存的工作原理CPU缓存是一种高速的存储介质,用于临时存储CPU经常访问的数据和指令。
它位于CPU内部,相比于主存储器(内存),缓存的访问速度更快,从而能够提高CPU的运行效率。
当CPU需要访问数据或指令时,它首先会检查缓存中是否存在所需内容。
如果存在,称之为命中(Cache Hit),CPU可以直接从缓存中读取数据或指令,节省了访问主存储器的时间。
反之,若缓存中不存在所需内容,称之为未命中(Cache Miss),CPU需要从主存储器中读取,并将数据或指令存入缓存,以供之后的访问使用。
二、缓存对性能的影响缓存的存在对于CPU性能有着显著的影响。
首先,缓存能够加快CPU的访问速度,提高了数据和指令的获取效率。
由于CPU的执行速度远快于内存的响应速度,当缓存命中率较高时,CPU能够更快地获取所需内容,从而提高了整体性能。
其次,缓存还能够减少CPU对内存的访问次数。
相比于内存访问,缓存访问的速度更快,这意味着CPU能够更快地获取到数据或指令,从而减少了等待时间。
当缓存命中率较高时,CPU可以多次使用缓存中的数据,而不需要频繁地从内存中读取,大幅提升了执行效率。
然而,缓存的存在也会带来一些问题。
首先,由于缓存容量的限制,无法将所有数据和指令都缓存起来。
因此,在缓存不命中时,CPU需要从主存储器中读取数据,增加了访问时间。
其次,缓存的更新机制可能会引发一致性问题。
当多个核心或处理器同时访问同一个内存地址时,可能会发生数据不一致的情况,需要通过一致性协议来解决。
三、缓存优化方法为了进一步提升CPU的性能,人们提出了一系列的缓存优化方法。
下面介绍几种常见的方法:1. 提高缓存命中率:通过合理的程序设计和数据结构选择,可以提高缓存命中率,减少缓存未命中的次数。
cpu缓存工作原理

cpu缓存工作原理CPU缓存工作原理引言:CPU缓存是计算机系统中的关键组件之一,它起到了提高数据访问速度和减少内存访问时间的重要作用。
本文将介绍CPU缓存的工作原理,包括缓存的层次结构、缓存命中和缓存未命中的处理方式,以及常见的缓存优化技术。
一、缓存层次结构CPU缓存通常分为多级缓存,包括一级缓存(L1 Cache)、二级缓存(L2 Cache)和三级缓存(L3 Cache)。
这些缓存层次结构的目的是根据访问频率和容量需求来优化数据的存储和访问。
1. 一级缓存(L1 Cache):一级缓存是与CPU核心紧密集成的缓存,容量较小但速度非常快,通常分为指令缓存(Instruction Cache)和数据缓存(Data Cache)两部分。
指令缓存用于存储CPU执行的指令,数据缓存用于存储CPU需要处理的数据。
2. 二级缓存(L2 Cache):二级缓存位于一级缓存和内存之间,容量较大但速度较慢。
它的作用是扩大缓存的容量,提高数据的访问速度。
二级缓存通常由多个缓存组成,每个缓存可以独立操作,提高了并发性能。
3. 三级缓存(L3 Cache):三级缓存位于二级缓存和内存之间,容量更大但速度更慢。
它的作用是进一步增加缓存的容量,减少对内存的访问次数,提高整体性能。
二、缓存命中和缓存未命中当CPU需要访问数据时,它首先会检查一级缓存。
如果所需数据在一级缓存中找到,称为缓存命中(Cache Hit),CPU可以立即访问数据,提高了访问速度。
如果所需数据不在一级缓存中,称为缓存未命中(Cache Miss),CPU需要继续检查更高级别的缓存或者内存。
缓存命中率是衡量缓存性能的重要指标,它表示在所有访问中有多少次是缓存命中的。
高缓存命中率意味着CPU能够更频繁地从缓存中获取数据,提高了整体性能。
三、缓存未命中的处理方式当发生缓存未命中时,CPU需要从更高级别的缓存或者内存中获取数据。
这个过程通常称为缓存填充(Cache Fill)。
cache相关知识点

缓存相关知识点缓存是一个常见的计算机概念,用于提高系统的性能和响应速度。
在计算机领域中,缓存是指存储数据的临时存储区域,用于加快数据的访问速度。
通过缓存,系统可以避免频繁地从较慢的存储区域(如硬盘)中读取数据,从而显著提高系统的性能。
在本文中,我们将深入探讨缓存的相关知识点。
1.什么是缓存?缓存是一种将数据存储在更快速、更容易访问的存储区域中的技术。
它可以是硬件缓存(如CPU缓存)或软件缓存(如Web浏览器缓存)。
缓存的目的是通过减少数据的访问时间来提高系统的性能。
2.缓存的工作原理当系统需要访问数据时,首先会检查缓存中是否已经存在该数据。
如果数据已经在缓存中,系统可以直接从缓存中获取数据,而不需要从较慢的存储区域中读取。
如果数据不在缓存中,系统将从存储区域中读取数据,并将其存储到缓存中以供以后使用。
3.缓存的类型根据存储介质的不同,缓存可以分为多种类型。
常见的缓存类型包括:•CPU缓存:CPU缓存是位于处理器芯片上的一块高速存储器,用于存储最常用的指令和数据。
它可以显著提高CPU的性能。
•硬盘缓存:硬盘缓存是位于硬盘驱动器内部的一块存储区域,用于存储最近访问的数据。
它可以加快读写硬盘的速度。
•Web浏览器缓存:Web浏览器缓存是位于Web浏览器中的一块存储区域,用于存储最近访问的网页和相关资源。
它可以减少网页加载的时间。
4.缓存的优势和劣势缓存的使用可以带来许多优势,包括:•提高系统的性能和响应速度。
•减少对较慢的存储区域(如硬盘)的访问次数,从而延长存储设备的寿命。
•减少网络带宽的使用,提高网络传输的效率。
然而,缓存也存在一些劣势,如:•缓存的数据可能会过时,导致访问到的数据不是最新的。
•缓存需要占用一定的存储空间,可能会导致浪费。
•缓存的管理和更新可能会增加系统的复杂性。
5.如何有效使用缓存为了有效使用缓存,我们可以采取以下措施:•设定合理的缓存策略,如缓存数据的过期时间和更新机制。
•使用合适的缓存算法,如LRU(最近最少使用)算法,以确保缓存中的数据是最常用的数据。
CPU缓存——精选推荐

CPU缓存在计算机系统中,CPU⾼速缓存(英语:CPU Cache,在本⽂中简称缓存)是⽤于减少处理器访问内存所需平均时间的部件。
在⾦字塔式存储体系中它位于⾃顶向下的第⼆层,仅次于CPU寄存器。
其容量远⼩于内存,但速度却可以接近处理器的频率。
当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。
如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载⼊缓存,再将其返回处理器。
缓存之所以有效,主要是因为程序运⾏时对内存的访问呈现局部性(Locality)特征。
这种局部性既包括空间局部性(Spatial Locality),也包括时间局部性(Temporal Locality)。
有效利⽤这种局部性,缓存可以达到极⾼的命中率。
在处理器看来,缓存是⼀个透明部件。
因此,程序员通常⽆法直接⼲预对缓存的操作。
但是,确实可以根据缓存的特点对程序代码实施特定优化,从⽽更好地利⽤缓存。
基本描述缓存的存储结构结构上,⼀个直接映射(Direct Mapped)缓存由若⼲缓存块(Cache Block,或Cache Line)构成。
每个缓存块存储具有连续内存地址的若⼲个存储单元。
在32位计算机上这通常是⼀个双字(dword),即四个字节。
因此,每个双字具有唯⼀的块内偏移量。
每个缓存块有⼀个索引(Index),它⼀般是内存地址的低端部分,但不含块内偏移和字节偏移所占的最低若⼲位。
⼀个数据总量为4KB、缓存块⼤⼩为16B的直接映射缓存⼀共有256个缓存块,其索引范围为0到255。
使⽤⼀个简单的移位函数,就可以求得任意内存地址对应的缓存块的索引。
由于这是⼀种多对⼀映射,必须在存储⼀段数据的同时标⽰出这些数据在内存中的确切位置。
所以每个缓存块都配有⼀个标签(Tag)。
拼接标签值和此缓存块的索引,即可求得缓存块的内存地址。
如果再加上块内偏移,就能得出任意⼀块数据的对应内存地址。
因此,在缓存⼤⼩不变的情况下,缓存块⼤⼩和缓存块总数成反⽐关系。
cpu缓存计算方法

CPU缓存的计算方法通常涉及多个步骤和参数。
首先,我们需要考虑缓存的层级结构,因为不同层级的缓存具有不同的速度和容量。
1. 缓存层级结构:CPU缓存通常分为L1、L2、L3等层级。
每一层级的缓存容量和访问速度都不同。
通常,L1缓存的访问速度最快,但容量最小,而L3缓存的容量最大,但访问速度较慢。
2. 容量:在确定了某个层级缓存的大小时,其容量可以直接计算。
例如,如果L2缓存的大小为2MB,那么其容量就是2MB。
3. 速度:CPU访问不同层级的缓存的速度各不相同。
这些速度通常用每纳秒能完成多少次数据读取或写入来衡量。
为了计算缓存的平均访问速度,我们需要考虑各个层级缓存的访问速度以及它们被访问的概率。
4. 命中率:CPU在访问数据时,如果数据已经在缓存中(即命中),则直接返回数据;如果数据不在缓存中(即未命中),则需要从更低层级的缓存或内存中获取数据。
命中率是衡量缓存效率的重要指标,它可以帮助我们了解CPU在访问数据时有多少次是直接从缓存中获取的。
5. 效率:效率是指CPU在访问数据时,有多少次是从缓存中获取的,而不是从更低层级的存储器中获取的。
效率可以用以下公式计算:效率= 缓存命中次数/ (缓存命中次数+ 缓存未命中次数)。
l3 缓存 作用 -回复

l3 缓存作用-回复标题:深入理解L3缓存的作用在计算机体系结构中,缓存是一个非常重要的部分,它对系统的性能有着决定性的影响。
L3缓存是现代多核处理器中的重要组成部分,对于提高系统性能和降低延迟起着关键作用。
本文将从L3缓存的定义、工作原理、作用等方面进行详细介绍。
一、什么是L3缓存?L3缓存,全称为Level 3 Cache,是CPU三级缓存的一种。
它是介于内存和CPU之间的一个临时数据存储区,主要用来存储那些CPU频繁访问的数据,以减少CPU直接读取内存的时间,提高CPU的运行效率。
二、L3缓存的工作原理当CPU需要读取数据时,首先会查询L1缓存,如果L1缓存中没有所需的数据,那么CPU会接着查询L2缓存,最后才是L3缓存。
这个过程被称为缓存层次结构。
L3缓存的主要特点是容量大、速度相对较慢,但是由于其容量大,可以存储更多的数据,因此可以有效减少CPU直接访问内存的次数,从而提高系统的整体性能。
三、L3缓存的作用1. 提高数据访问速度L3缓存的存在大大减少了CPU直接访问内存的次数,提高了数据的访问速度。
这是因为,相比于内存,L3缓存的速度要快得多。
当CPU需要访问数据时,优先在缓存中查找,如果在缓存中找到了所需的数据,就不需要再访问内存了,这样就大大提高了数据的访问速度。
2. 减少内存延迟内存延迟是指CPU发出请求到收到响应的时间间隔。
由于L3缓存的存在,大部分数据可以直接在缓存中获取,不需要等待内存的响应,这就大大减少了内存延迟,提高了系统的响应速度。
3. 平衡多核心之间的数据共享在多核处理器中,每个核心都有自己的L1和L2缓存,而L3缓存是所有核心共享的。
这意味着,当一个核心修改了某个数据后,其他核心可以通过L3缓存立即获取到这个更新后的数据,而不必通过内存,这大大提高了多核心之间的数据共享效率。
四、如何优化L3缓存使用虽然L3缓存有诸多优点,但是在实际应用中,如果不能合理地使用L3缓存,可能会导致其效果大打折扣。
CPU缓存用处意义解释

CPU缓存用处意义解释CPU缓存有什么用?Intel官方答案来了更详细来讲,在计算机系统中,CPU高速缓存在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。
其容量远小于内存,但速度却可以接近处理器的频率,比内存快得多。
缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。
按照数据读取顺序和与CPU结合的紧密程度,CPU缓存可以分为一级缓存,二级缓存,部分高端CPU还具有三级缓存。
今年下半年,Intel将推出10nm+ Tiger Lake,还是针对轻薄本,CPU架构升级为WillowCove,IPC相比于Skylake提升25%,换算一下对比Sunny Cove只提升大约6%。
下一代桌面级的Rocket Lake据说也会是同样的架构,只不过工艺延续14nm。
再往后的新架构是Golden Cove,将应用于10nm++ Alder Lake,IPC相比于Skylake提升50%,相比于WillowCove则提升大约20%。
传闻称,Alder Lake将会采用大小核配置,8+8的规格可媲美AMD 16核心32线程的锐龙9 3950__,不过到那个时候,Zen4都快出来了。
Intel官方公布的架构路线图到此为止,而根据传闻,Golden Cove的继任者代号为“OceanCove”,IPC性能相比于Skylake提升幅度达80%,不过对比它之前的Golden Cove提升幅度还是20%。
CPU 缓存是什么?不同存储技术的访问时间差异很大,从计算机层次结构可知,通常情况下,从高层往底层走,存储设备变得更慢、更便宜同时体积也会更大,CPU和内存之间的速度存在着巨大的差异,此时就会想到计算机科学界中一句著名的话:计算机科学的任何一个问题,都可以通过增加一个中间层来解决。
二.引入缓存层为了解决速度不匹配问题,可以通过引入一个缓存中间层来解决问题,但是也会引入一些新的问题。
CPU缓存冷门知识讲解

CPU缓存冷门知识讲解由于CPU是核心硬件,相信我们在选择CPU的时候都会去关心CPU参数方面,而在CPU核心参数中,我们经常会看到缓存(Cache)这个参数,那么CPU缓存有什么用?下面就让小编带你去看看CPU缓存冷门知识讲解,希望能帮助到大家!计算机组成原理 - CPU 高速缓存按道理来说,循环1 花费的时间应该是循环2 的 16 倍左右。
但实际上,循环1 在我的电脑上运行需要50 毫秒,循环2 只需要46 毫秒。
相差在 15% 之内,1 倍都没有。
这就是 CPU Cache (高速缓存)带来的效果。
程序执行时,CPU 将对应的数据从内存中读取出来,加载到 CPU Cache 里。
这里注意,CPU 是一小块一小块来读取数据的,而不是按照单个数组元素来读取数据的。
这一小块一小块的数据,在CPU Cache 里面,我们把它叫作Cache Line(缓存块)。
日常用的 Intel 服务器或者 PC 中,Cache Line 的大小通常是 64 字节。
上面的循环2 里面,每隔 16 个整型数计算一次,16 个整型数正好是 64 个字节。
所以,循环1 和循环2,都需要把同样数量的 Cache Line 数据从内存中读取到CPU Cache 中,导致两个程序花费的时间就差别不大了。
CPU Cache 一般有三层,L1/L2 单核私有,L3 多核共享缓存(这里的L1-L3 指特定的由SRAM 组成的物理芯片,不是概念上的缓存)。
有了 CPU Cache,内存中的指令、数据,会被加载到 L1-L3 Cache 中,95% 的情况下,CPU 都只需要访问 L1-L3 Cache,而无需访问内存。
Cpu Cache 读取数据现代 CPU 进行数据读取的时候,无论数据是否已经存储在 Cache 中,CPU 始终会首先访问 Cache。
只有当 CPU 在 Cache 中找不到数据的时候,才会去访问内存,并将读取到的数据写入 Cache 之中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CPU实用缓存知识CPU缓存是什么?CPU缓存是CPU和内存之间的临时存储器,虽然缓存的容量不能与内存和硬盘相比,但是交换速度却比它们快得多了,CPU缓存就是为了更快的连接CPU与内存而存储在中间媒介。
简单来说,因为CPU 的速度快,而内存的速度较慢,这时CPU缓存来解决这个问题,减少了CPU的等待时间,变相的提高了CPU的性能。
举个例子,比如CPU需要做一个加法运算,需要-2个时钟周期,如果从内存中读取数据需要100-300个周期,而CPU是不可能等待那么长的时间,即使是高端CPU也变成龟速,因此通过高速缓存来减少了CPU等待时间。
在主流的CPU中,一般缓存分为一级缓存、二级缓存、三级缓存,而它们之间的速度呈递减,容量呈递增,读取一级缓存中的信息需要3个周期,与CPU处理运算的速度无限接近了,读取二级缓存的周期大约10-15个周期,而三级缓存所需时间为50个周期左右。
之所以CPU需要采用这种层级结构,主要就是是从成本、性能、容量还有面积上来平衡的,对于CPU缓存来说,下面几点是它们提升的目前,也就所谓的CPU缓存的作用。
1、缩短延迟访问缓存的时间应该尽可能缩短,可以通过多种的方式缩短这个时间,比如能够通过减小缓存的大小或关联性来降低缓存的延迟,还有方式预测、增加带宽等方法。
2、提升命中率所谓的命中率是在高速缓存中找到内存引用的速率,我们希望能够首先通过缓存中获得信息,以得到速度优势,所以缓存需要最大限度地实现这一目标。
对于单个高速缓存,大小、关联性和块大小决定命中率。
3、降低更低级别内存下的开销高速缓存是内存层次结构的一部分,其性能会影响其它性能,处理其它内存花费的时间越长,意味着系统性能越低,也就是说尽可能让处理在缓存中完成。
4、减少错失惩罚缓存中不能命中是无法避免的事情,但是我们可以减少处理未命中所需的时间以获得更好的处理器性能,通过提升命中率并通过应用不同的优化,能够降低错失惩罚。
高速缓存是CPU中十分重要的部分,占据了大量的资源开销和成本,如果您看过CPU架构图的话,您就会发现缓存占据了至少50%的面积,绝对至关重要。
总结:CPU缓存的作用说白了就是提高命中率、降低延迟、降低内存开销、减少错失惩罚等,对于一般用户你只需了解CPU缓存能够提升CPU 的工作效率即可,缓存在cpu参数中的作用举足轻重。
CPU缓存一致性协议CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。
这就造成了高性能能的内存和硬盘价格及其昂贵。
然而CPU的高度运算需要高速的数据。
为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决IO 速度和CPU运算速度之间的不匹配问题。
在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。
比如循环、递归、方法的反复调用等。
比如顺序执行的代码、连续创建的两个对象、数组等。
带有高速缓存的CPU执行计算的流程程序以及数据被加载到主内存指令和数据被加载到CPU的高速缓存CPU执行指令,把结果写到高速缓存高速缓存中的数据写回主内存目前流行的多级缓存结构由于CPU的运算速度超越了1级缓存的数据IO能力,CPU厂商又引入了多级的缓存结构。
多级缓存结构多核CPU多级缓存一致性协议MESI多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。
这里就引出了一个一致性的协议MESI。
MESI(Modified E__clusive Shared OrInvalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。
MESI协议中的状态CPU中每个缓存行(caceh line)使用4种状态进行标记(使用额外的两位(bit)表示):M: 被修改(Modified)该缓存行只被缓存在该CPU的缓存中,并且是被修改过的(dirty),即与主存中的数据不一致,该缓存行中的内存需要在未来的某个时间点(允许其它CPU读取请主存中相应内存之前)写回(writeback)主存。
当被写回主存之后,该缓存行的状态会变成独享(e__clusive)状态。
E: 独享的(E__clusive)该缓存行只被缓存在该CPU的缓存中,它是未被修改过的(clean),与主存中数据一致。
该状态可以在任何时刻当有其它CPU读取该内存时变成共享状态(shared)。
同样地,当CPU修改该缓存行中内容时,该状态可以变成Modified 状态。
S: 共享的(Shared)该状态意味着该缓存行可能被多个CPU缓存,并且各个缓存中的数据与主存数据一致(clean),当有一个CPU修改该缓存行中,其它CPU 中该缓存行可以被作废(变成无效状态(Invalid))。
I: 无效的(Invalid)该缓存是无效的(可能有其它CPU修改了该缓存行)。
MESI状态转换图状态之间的相互转换关系也可以使用下表进行表示。
操作在一个典型系统中,可能会有几个缓存(在多核系统中,每个核心都会有自己的缓存)共享主存总线,每个相应的CPU会发出读写请求,而缓存的目的是为了减少CPU读写共享主存的次数。
一个缓存除在Invalid状态外都可以满足cpu的读请求,一个Invalid 的缓存行必须从主存中读取(变成S或者E状态)来满足该CPU的读请求。
一个写请求只有在该缓存行是M或者E状态时才能被执行,如果缓存行处于S状态,必须先将其它缓存中该缓存行变成Invalid状态(也既是不允许不同CPU同时修改同一缓存行,即使修改该缓存行中不同位置的数据也不允许)。
该操作经常作用广播的方式来完成,例如:RequestForOwnership (RFO)。
缓存可以随时将一个非M状态的缓存行作废,或者变成Invalid状态,而一个M状态的缓存行必须先被写回主存。
一个处于M状态的缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S状态之前被延迟执行。
一个处于S状态的缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。
一个处于E状态的缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S状态。
对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的。
而S状态可能是非一致的,如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。
从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy 变成Invalid状态,而修改E状态的缓存不需要使用总线事务。
从CPU 缓存看缓存的套路一、前言不同存储技术的访问时间差异很大,从计算机层次结构可知,通常情况下,从高层往底层走,存储设备变得更慢、更便宜同时体积也会更大,CPU和内存之间的速度存在着巨大的差异,此时就会想到计算机科学界中一句著名的话:计算机科学的任何一个问题,都可以通过增加一个中间层来解决。
二、引入中间层——缓存层为了解决速度不匹配问题,可以通过引入一个缓存中间层来解决问题,但是也会引入一些新的问题。
现代计算机系统中,从硬件到操作系统、再到一些应用程序,绝大部分的设计都用到了著名的局部性原理,局部性通常有如下两种不同的形式:时间局部性:在一个具有良好的时间局部性的程序当中,被引用过一次的内存位置,在将来一个不久的时间内很可能会被再次引用到。
空间局部性:在一个具有良好的空间局部性的程序当中,一个内存位置被引用了一次,那么在不久的时间内很可能会引用附近的位置。
有上面这个局部性原理为理论指导,为了解决二者速度不匹配问题就可以在CPU 和内存之间加一个缓存层,于是就有了如下的结构:三、缓存更新问题在CPU 中引入缓存中间层后,虽然可以解决和内存速度不一致的问题,但是同时也面临着一个问题:当CPU更新了其缓存中的数据之后,要什么时候去写入到内存中呢?,比较容易想到的一个解决方案就是,CPU 更新了缓存的数据之后就立即更新到内存中,也就是说当CPU更新了缓存的数据之后就会从上到下更新,直到内存为止,英文称之为writethrough,这种方式的优点是比较简单,但是缺点也很明显,由于每次都需要访问内存,所以速度会比较慢。
还有一种方法就是,当CPU更新了缓存之后并不马上更新到内存中去,在适当的时候再执行写入内存的操作,因为有很多的缓存只是存储一些中间结果,没必要每次都更新到内存中去,英文称之为writeback,这种方式的优点是CPU 执行更新的效率比较高,缺点就是实现起来会比较复杂。
上面说的在适当的时候写入内存,如果是单核CPU 的话,可以在缓存要被新进入的数据取代时,才更新内存,但是在多核CPU 的情况下就比较复杂了,由于CPU 的运算速度超越了1 级缓存的数据I\O 能力,CPU 厂商又引入了多级的缓存结构,比如常见的L1、L2、L3 三级缓存结构,L1 和L2 为CPU 核心独有,L3 为CPU 共享缓存。
如果现在分别有两个线程运行在两个不同的核Core 1 和Core 2 上,内存中i 的值为1,这两个分别运行在两个不同核上的线程要对i进行加1 操作,如果不加一些限制,两个核心同时从内存中读取i 的值,然后进行加1操作后再分别写入内存中,可能会出现相互覆盖的情况,解决的方法相信大家都能想得到,第一种是只要有一个核心修改了缓存的数据之后,就立即把内存和其它核心更新。
第二种是当一个核心修改了缓存的数据之后,就把其它同样复制了该数据的CPU 核心失效掉这些数据,等到合适的时机再更新,通常是下一次读取该缓存的时候发现已经无效,才从内存中加载最新的值。
四、缓存一致性协议不难看出第一种需要频繁访问内存更新数据,执行效率比较低,而第二种会把更新数据推迟到最后一刻才会更新,读取内存,效率高(类似于懒加载)。
缓存一致性协议(MESI) 就是使用第二种方案,该协议主要是保证缓存内部数据的一致,不让系统数据混乱。
MESI 是指4种状态的首字母。
每个缓存存储数据单元(Cache line)有4 种不同的状态,用2 个bit 表示,状态和对应的描述如下:单核读取步骤:Core 0 发出一条从内存中读取a 的指令,从内存通过BUS 读取a 到Core 0 的缓存中,因为此时数据只在Core 0的缓存中,所以将Cache line 修改为E 状态(独享),该过程用示意图表示如下:双核读取步骤:首先Core 0 发出一条从内存中读取a 的指令,从内存通过BUS 读取a 到Core 0 的缓存中,然后将Cacheline 置为E状态,此时Core 1 发出一条指令,也是要从内存中读取a,当Core 1 试图从内存读取a 的时候,Core 0检测到了发生地址冲突(其它缓存读主存中该缓存行的操作),然后Core 0 对相关数据做出响应,a 存储于这两个核心Core 0 和Core 1的缓存行中,然后设置其状态为S 状态(共享),该过程示意图如下:假设此时Core 0 核心需要对a 进行修改了,首先Core 0 会将其缓存的a 设置为M(修改)状态,然后通知其它缓存了a 的其它核CPU(比如这里的Core 1)将内部缓存的a 的状态置为I(无效)状态,最后才对a 进行赋值操作。