CPU的缓存一直性MESI(Modified Exclusive Shared Or Invalid)

M: 被修改(Modified)

该缓存行只被缓存在该CPU的缓存中,并且是被修改过的(dirty),即与主存中的数据不一致,该缓存行中的内存需要在未来的某个时间点(允许其它CPU读取请主存中相应内存之前)写回(write back)主存。当被写回主存之后,该缓存行的状态会变成独享(exclusive)状态。

E: 独享的(Exclusive)

该缓存行只被缓存在该CPU的缓存中,它是未被修改过的(clean),与主存中数据一致。该状态可以在任何时刻当有其它CPU读取该内存时变成共享状态(shared)。同样地,当CPU修改该缓存行中内容时,该状态可以变成Modified状态。

S: 共享的(Shared)

该状态意味着该缓存行可能被多个CPU缓存,并且各个缓存中的数据与主存数据一致(clean),当有一个CPU修改该缓存行中,其它CPU中该缓存行可以被作废(变成无效状态(Invalid))。

I: 无效的(Invalid)

该缓存是无效的(可能有其它CPU修改了该缓存行)。

CPU的缓存一直性MESI(Modified Exclusive Shared Or Invalid)_第1张图片

 

在一般情况下CPU1在从内存中读取一个数据时假设读取一个变量i同时CPU2也读取计算机内存中的i,CPU1在做对i的操作i+1。然后CPU1对计算机内存进行写的请求,将i写入内存中。当CPU2也做了相同的操作时。那么内存中的i就仅仅加了1.其实按照正常逻辑是i+2的,这就产生数据的错误。

那么在多核计算机中就有了规范,就是MESI缓存一至性原则。其工作原理是当CPU1在获取计算机内存i时,这是CPU2也可以获取这个变量i。当CPU1对它取回的变量进行操作后。CPU1的i会被标记为被修改的(Modified),他需要将i写入主内存将i标记为独享状态(Exclusive),这时CPU1会立即将i这个变量写入计算机内存。这时计算机内存中的i会被标记为共享的(Shared)同时CPU2中的i会被标记为无效的(Invalid),然后CPU2就只能重新从计算机内存中获取新的i变量。然后在进行CPU2中i的操作。

2、jvm内存模型

 

CPU的缓存一直性MESI(Modified Exclusive Shared Or Invalid)_第2张图片

java的内存机制也存在缓存一致性的机制,在代码中变量添加volatile以保证变量的可见性、有序性。但在java代码编译成class文件是变量的赋值需要分三步才能完成,就不能能保证原子性和安全性,在线程之间的安全及原子性需要加入关键字synchronized来达到效果

你可能感兴趣的:(CPU的缓存一直性MESI(Modified Exclusive Shared Or Invalid))