cpu,高速缓冲区,主内存之间的关系

cpu,高速缓冲区,主内存之间的关系

我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。CPU要与内存进行交互,如读取运算数据、存储运算结果等。由于内存和CPU的计算速度有几个数量级的差距,为了提高CPU的利用率,现代处理器结构都加入了一层读写速度尽可能接近CPU运算速度的高速缓存来作为内存与CPU之间的缓冲:将运算需要使用的数据复制到缓存中,让CPU运算可以快速进行,计算结束后再将计算结果从缓存同步到主内存中,这样处理器就无须等待缓慢的内存读写了。就像下面这样

cpu,高速缓冲区,主内存这种处理提高效率导致出现的问题
高速缓存的引入解决了CPU和内存之间速度的矛盾,但是在多CPU系统中也带来了新的问题:可见性问题和重排序问题。

首先是可见性问题:假设有两个线程A、B分别在两个不同的CPU上运行,它们共享同一个变量X。如果线程A对X进行修改后,并没有将X更新后的结果同步到主内存,则变量X的修改对B线程是不可见的。这样就会造成可见性问题

然后是重排序问题:假设A、B两个线程共享两个变量X、Y,A和B分别在不同的CPU上运行。在A中先更改变量X的值放到高速缓存区,然后再更改变量Y的值放到高速缓存区。这时有可能发生Y的值被同步回主内存,而X的值没有同步回主内存的情况,此时对于B线程来说是无法感知到X变量被修改的,或者可以认为对于B线程来说,Y变量的修改被重排序到了X变量修改的前面。

CPU层面通过MESI协议来保证重排序问题和数据可见性。

MESI协议是CPU中提供的数据一致性保证,解决了CPU的可见性问题,MESI协议中定义了缓存的四种状态:
M(修改, Modified): 本地处理器已经修改缓存行, 即是脏行, 它的内容与内存中的内容不一样. 并且此cache只有本地一个拷贝(专有)。
E(专有, Exclusive): 缓存行内容和内存中的一样, 而且其它处理器都没有这行数据。
S(共享, Shared): 缓存行内容和内存中的一样, 有可能其它处理器也存在此缓存行的拷贝。
I(无效, Invalid): 缓存行失效, 不能使用。

MESI协议示例
在C1修改了V之后,发送一个信号,标记旧值已经失效,并且将新值会写到内存。
C1可能会多次进行修改,每次丢改都发送一个信号,C2中的V一直保持着失效的状态。
C2在使用V的时候,发现自己的V已经失效了,就重新从内存中加载V获取最新的值。

信息来源:https://blog.csdn.net/weixin_43842698/article/details/89314526

posted @ 2022-02-12 18:17  分布式大臭屁  阅读(895)  评论(0)    收藏  举报