并发--高速缓存和MESI

2019-03-28  本文已影响0人  简书徐小耳

参考资料

https://time.geekbang.org/column/article/13484?code=XamkmJYooKBPKe8hT7otClsFDeVHb6rptMYHTdgiRPU%3D

https://www.jianshu.com/p/43af2cc32f90

https://www.jianshu.com/p/7d3150fc0277

https://juejin.im/post/5bf2977751882505d840321d

https://www.jianshu.com/p/506c1e38a922

https://blog.csdn.net/hemmingway/article/details/38750913

高速缓存的结构

高速缓存有哪些

L1i Cache

L1d Cache

L2 Cache

L3 Cache

三级缓存的意义:虽然容量比主内存小,但是交互速度快进而提高cpu的效率。对于大的数据会直接从主内存获取,绕过cache。

每个cpu有自己的上述三级缓存,如果一个cpu有多核,则每个核心有自己的L1(有可能还有L2),共享L3(有可能有L2)

三级缓存的内部结构

无论是L1,L2,L3他们的内部结构都相似(相同)

cpu访问内存时候的步骤如下

缓存一致性协议(MESI)

因为每个cpu core都有自己的高速缓存,为了避免出现其中的core对缓存进行更新后其他的core可以感知,所以设置了MESI协议。

M:被修改modified

E:独享exclusive

S:共享的(shared)

I:无效的(Invalid)

总结:首先各个core中初始的缓存行都是Invalid,当其中一个A core去主内存中获取数据时候,其缓存行的状态变为Exclusive
,当B core也去获取同样的数据的到高速缓存时候A和B的缓存行状态都变为shared。当B修改自己缓存行的数据时候,B的缓存行状态变为Modified,A的缓存行状态变为Invalid.
只要有其他的CpuCore(如果是B core自己可以直接从自己高速缓存获取数据)去获取该缓存行中具体的数据,B core就会把修改的数据刷入到主内存。进而B core的缓存行状态变为Exclusive.

为了缓存之间的通讯,协调各个处理器的读、写内存操作,MESI协议还定义了下面的一组消息:

Read

Invalidate

Read Invalidate

WriteBack

当cpu在执行内存读写的时候,会在一定情况下往总线发送特定的请求消息(即上述4个消息),同时每个处理器还会嗅探(拦截)总线中由其他处理器发出的请求消息,并在一定条件下往总线回复相应的响应消息。

MESI协议对内存数据访问的控制类似读写锁,它使得针对同一地址的读内存操作是并发的,而针对同一地址的写内存操作是独占的。从而保障了缓存间数据的一致。

举例说明

并发读

互斥写

MESI协议的缺陷:

依照上述的MESI协议虽然可以解决数据一致性的问题,但是存在性能缺陷:即处理器每次写数据都得等其他处理器将各自的高速缓存中的对应数据删除,并且接收到返回的Read Response与Invalidate Acknowledge消息后才执行写操作。

写缓冲器和无效化队列

为了解决上述的性能缺陷进而引入了写缓冲器和无效化队列

写缓冲器

写操作过程

总结:写缓冲器让处理器在执行写操作时不需要再额外的等待,减少了写操作的延时,提高了处理器的指令执行效率。

读操作过程

无效化队列

写缓冲器和无效化队列带来的新问题

重排序

可见性

内存屏障

上一篇 下一篇

猜你喜欢

热点阅读