这里就可以看出再加入了store buffer之后 , 内存一致性模型就发生了改变 。
如果我们定义store buffer必须严格按照FIFO的次序将数据发送到主存(所谓的FIFO表示先进入store buffer的指令数据必须先于后面的指令数据写到存储器中) , 这样S3必须要在S1之后执行 , CPU能够保证store指令的存储顺序 , 这种内存模型就叫做完全存储定序(TSO) 。
我们继续看下面的一段代码

文章插图
在SC模型里 , C1与C2是严格按照顺序执行的
代码可能的执行顺序如下:
S1 S2 L1 L2 S1 L1 S2 L2 S1 L1 L2 S2 L1 L2 S1 S2 L1 S1 S2 L2 L1 S1 L2 S2由于SC会严格按照顺序进行 , 最终我们看到的结果是至少有一个CORE的r1值为NEW , 或者都为NEW 。
在TSO模型里 , 由于store buffer的存在 , L1和S1的store指令会被先放到store buffer里面 , 然后CPU会继续执行后面的load指令 。Store buffer中的数据可能还没有来得及往存储器中写 , 这个时候我们可能看到C1和C2的r1都为0的情况 。
所以 , 我们可以看到 , 在store buffer被引入之后 , 内存一致性模型已经发生了变化(从SC模型变为了TSO模型) , 会出现store-load乱序的情况 , 这就造成了代码执行逻辑与我们预先设想不相同的情况 。而且随着内存一致性模型越宽松(通过允许更多形式的乱序读写访问) , 这种情况会越剧烈 , 会给多线程编程带来很大的挑战 。
部分存储定序芯片设计人员并不满足TSO带来的性能提升 , 于是他们在TSO模型的基础上继续放宽内存访问限制 , 允许CPU以非FIFO来处理store buffer缓冲区中的指令 。CPU只保证地址相关指令在store buffer中才会以FIFO的形式进行处理 , 而其他的则可以乱序处理 , 所以这被称为部分存储定序(PSO) 。
那我们继续分析下面的代码

文章插图
S1与S2是地址无关的store指令 , cpu执行的时候都会将其推到store buffer中 。如果这个时候flag在C1的cahe中存在 , 那么CPU会优先将S2的store执行完 , 然后等data缓存到C1的cache之后 , 再执行store data=https://www.isolves.com/it/cxkf/bk/2019-10-16/NEW指令 。
这个时候可能的执行顺序:
S2 L1 L2 S1这样在C1将data设置为NEW之前 , C2已经执行完 , r2最终的结果会为0 , 而不是我们期望的NEW , 这样PSO带来的store-store乱序将会对我们的代码逻辑造成致命影响 。
从这里可以看到 , store-store乱序的时候就会将我们的多线程代码完全击溃 。所以在PSO内存模型的架构上编程的时候 , 要特别注意这些问题 。
宽松内存模型丧心病狂的芯片研发人员为了榨取更多的性能 , 在PSO的模型的基础上 , 更进一步的放宽了内存一致性模型 , 不仅允许store-load , store-store乱序 。还进一步允许load-load , load-store乱序 , 只要是地址无关的指令 , 在读写访问的时候都可以打乱所有load/store的顺序 , 这就是宽松内存模型(RMO) 。
我们再看看上面分析过的代码

文章插图
在PSO模型里 , 由于S2可能会比S1先执行 , 从而会导致C2的r2寄存器获取到的data值为0 。在RMO模型里 , 不仅会出现PSO的store-store乱序 , C2本身执行指令的时候 , 由于L1与L2是地址无关的 , 所以L2可能先比L1执行 , 这样即使C1没有出现store-store乱序 , C2本身的load-load乱序也会导致我们看到的r2为0 。从上面的分析可以看出 , RMO内存模型里乱序出现的可能性会非常大 , 这是一种乱序随可见的内存一致性模型 。
内存屏障芯片设计人员为了尽可能的榨取CPU的性能 , 引入了乱序的内存一致性模型 , 这些内存模型在多线程的情况下很可能引起软件逻辑问题 。为了解决在有些一致性模型上可能出现的内存访问乱序问题 , 芯片设计人员提供给了内存屏障指令 , 用来解决这些问题 。
内存屏障的最根本的作用就是提供一个机制 , 要求CPU在这个时候必须以顺序存储一致性模型的方式来处理load与store指令 , 这样才不会出现内存访问不一致的情况 。
推荐阅读
- 卫生棉条太干拉不出来怎么办 棉条太干拉不出来怎么办
- 淘宝店铺退保证金在哪里 淘宝网店的保证金怎么退
- 扛住阿里双十一高并发流量,Sentinel是怎么做到的?
- 淘宝商家在哪里设置优惠券 淘宝设置优惠券怎么设置
- 2022清明节天津会下雨吗,2022清明期间天津天气怎么样
- 水培郁金香发霉了怎么办,水培郁金香发霉了还能活吗
- 淘宝开店不用交保证金 淘宝店铺可以不交保证金吗
- 指甲上有白斑
- 老式转盘微波炉怎么烤蛋挞 转盘微波炉可以烤蛋挞吗
- 木头水杯盖有味怎么办 木头杯盖有味怎么去掉
