Java面试之处理器如何实现原子操作(你的女朋友都可以听懂的文章)

清晨,逆旅突然被一个女生的尖叫惊醒

女生:“亲爱的,我好烦啊,啊啊啊啊啊”

逆旅一把将女生拉过来搂在怀里,轻声说道:”怎么了,宝贝“

Java面试之处理器如何实现原子操作(你的女朋友都可以听懂的文章)

女生:“我刚看懂了java中的原子操作,现在看处理器的原子操作我又一知半解了”

逆旅指尖穿过她的发梢,耳边低沉到:“别急,宝贝,我来给你梳理一下”

处理器如何实现原子操作

首先得记住总线锁和缓存锁,因为处理器使用了缓存锁定总线锁定两个机制来实现多处理器之前的原子操作。

使用总线加锁

在多处理器同时对共享变量进行读改写操作时,i=1,对i进行两次自增操作。我们期望的值是3,但是结果可能是2,因为i++不是原子性的,可能两个处理器同时从各自的缓存中读取变量i,分别进行+1操作,然后分别写入系统内存中。宝贝,我来给你画张图:

Java面试之处理器如何实现原子操作(你的女朋友都可以听懂的文章)

女生:“所以如果用总线锁就可以解决这个问题吗?”

逆旅:“当然啦,亲爱的”

总线锁其实就是使用处理器提供的一个Lock#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,这个处理器可以独占共享内存。此时i的值等于3。

女生:“Soga”

使用缓存锁定

逆旅:“宝贝,我们再想下,总线锁定它把CPU和内存之间的通信全锁住了,这样在锁定期间,其他处理器也不能操作其他内存地址的数据,开销岂不是非常大,还有其他方法没有?”

女生:“虽然我不知道原因,但你刚刚就让我记住这两个,所以我无脑猜都知道是缓存锁定,你把我当什么?”

逆旅:“当我的**”

频繁使用的内存会缓存在处理器的L1,L2,L3高速缓存里,那么原子操作就可以直接内部缓存中进行,并不要使用到总线锁

Java面试之处理器如何实现原子操作(你的女朋友都可以听懂的文章)

缓存锁定是指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不在总线上声言Lock#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作原子性,因为缓存一致性会阻止同时修改两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使缓存行无效。

逆旅:“说到这里,你是不是又不懂缓存一致性机制了”

女生:“嗯嗯”

逆旅:“那我用Intel系列中广泛使用的MESI协议来讲下它的原理”

MESI协议是以缓存行(缓存的基本数据单位,在Intel的CPU上一般是64字节)的几个状态来命名的(全名是Modified、Exclusive、Share or Invalid)。该协议要求在每个缓存行上维护两个状态位,使得每个数据单位可能处于M、E、S和I这四种状态之一,各种状态含义如下:

Java面试之处理器如何实现原子操作(你的女朋友都可以听懂的文章)

这里首先介绍该协议约定的缓存上对应的监听:

  • 一个处于M状态的缓存行,必须时刻监听所有试图读取该缓存行对应的主存地址的操作,如果监听到,则必须在此操作执行前把其缓存行中的数据写回CPU。
  • 一个处于S状态的缓存行,必须时刻监听使该缓存行无效或者独享该缓存行的请求,如果监听到,则必须把其缓存行状态设置为I。
  • 一个处于E状态的缓存行,必须时刻监听其他试图读取该缓存行对应的主存地址的操作,如果监听到,则必须把其缓存行状态设置为S。

当CPU需要读取数据时,如果其缓存行的状态是I的,则需要从内存中读取,并把自己状态变成S,如果不是I,则可以直接读取缓存中的值,但在此之前,必须要等待其他CPU的监听结果,如其他CPU也有该数据的缓存且状态是M,则需要等待其把缓存更新到内存之后,再读取。(先得理解上表四种状态,才好看懂这里)

当CPU需要写数据时,只有在其缓存行是M或者E的时候才能执行,否则需要发出特殊的RFO指令(Read Or Ownership,这是一种总线事务),通知其他CPU置缓存无效(I),这种情况下会性能开销是相对较大的。在写入完成后,修改其缓存状态为M。

逆旅:“但是并非所有情况处理器都会使用缓存锁定哦”

女生:“嗯哼?”

有两种情况处理器不会使用缓存锁定:

  • 当操作的数据不能被缓存在处理器内部,或操作的数据跨多个缓存行时,处理器会使用总线锁定
  • 有些处理器不支持缓存锁定时,自然也只能用总线锁定了,比如说奔腾486以及更老的CPU。

女生:“哇,亲爱的,你好棒啊”

女生:“让我亲你一下,mu—————”

aaaaaaa,pia

130kg的身体突然从床上落到地板,逆旅梦醒

逆旅:”嗯?原来只是个梦啊,完了,这个点了,跟女朋友约会要迟到了“

逆旅:“等一下,我好像还没有女朋友,那也是个梦?”

“我不是母胎solo吗!!!”

Java面试之处理器如何实现原子操作(你的女朋友都可以听懂的文章)

相关文章:

  • 2021-04-07
  • 2021-05-22
  • 2021-09-05
  • 2021-05-24
  • 2022-01-13
  • 2022-12-23
  • 2021-11-25
  • 2021-10-26
猜你喜欢
  • 2021-12-22
  • 2021-08-19
  • 2021-12-30
  • 2022-12-23
  • 2022-03-07
  • 2021-09-05
相关资源
相似解决方案