分享

理解内存屏障(五)

 mzsm 2015-06-26
作者:新浪微博(@NP等不等于P

计算机学习微信公众号(jsj_xx)

2.8 cpu cache对屏障的影响

cpu跟自己的cache打交道,而各个cache之间是通过一种协议来保证一致性的。换句话理解:屏障是在cpu和自己的cache之间起作用,而之后(cache间)的传播就管不了了。这样,虽然一个cpu的操作最终会被其它cpu感知到,但可能是一种乱序的感知。如下图,内存屏障起作用的地方在cpu和cpu cache之间的红线:


上述乱序感知可以通过具体例子理解。比如alpha机器,假设有2个cpu,每个cpu有2个cache(cpu1有cache A和cache B,而cpu2有cache C和cache D),在cpu1上执行两个写操作:


cpu1的写屏障是为了保证系统其它组件感知正确的写顺序,但是对于cpu2的读操作:


假设cpu2感知到了“p = &v;”,那么对于cpu2的读x操作而言,正确的结果应该是2,但是可能会有其它结果。比如:p在cache B和D里,而v在cache A和C里,这样两个cache对的更新顺序可能不一致:(比如cache C比较忙,从而cache D里的p的更新先被cpu2感知,而cache C里面的v的更新被延后了):


这样就可能出现错误的结果:cpu2的读x操作的结果为1(v的旧值)。也就是说,最终cache之间的数据会同步更新,但是可能不是按照预期的顺序。解决方法就是在cpu2的两个读操作之间插入一个数据依赖屏障或读屏障,消除这种延迟导致的不一致性:


对于有的cpu类型而言,它们可能会自动处理好各个cpu cache(即使一个cpu的cache被切分)之间的同步,但是有的则不会,比如这里的DEC alpha cpu,此时就有必要使用内存屏障了。

再看看cache对DMA操作设备时的影响。

对于DMA读而言,由于dirty cache可能还在cpu的cache里,没有写到内存,所以直接DMA就可能使用了(旧的)错误数据。解决方法就是将cpu cache相关数据冲刷到内存里,从而保证cache和内存的一致性。同理,对于DMA写而言,设备将数据写入内存后可能被cpu cache的回写覆盖掉。解决方法是将cpu cache中相关数据invalid掉。

2.9 alpha cpu

DEC alpha cpu属于弱保证的cpu之一了,比如上面提到,它可能在一个cpu里采用切分cache,这样cache之间的同步就使得数据依赖屏障变得异常重要了。对于linux内核而言,自然要考虑最坏情况,所以可以说,其内存屏障模型是参照alpha cpu实现的。

(全文完)

关于我们

新浪微博(@NP等不等于P

计算机学习微信公众号(jsj_xx)

原创技术文章,感悟计算机,透彻理解计算机!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多