内存栅栏:软件高手的硬件观(四)

因翻译水平有限,如有不妥,敬请指正和谅解!
原文下载地址:
http://download.csdn.net/download/programresearch/9829674

6. 样例 内存栅栏序列

此段介绍一些巧妙,但隐约有问题的内存栅栏的使用.尽管它们中很多在大多数时候可以工作,并且一些在某些特定的CPU上可以一直工作,这种用法必须避免,如果目的是为了产生在所有CPU上工作可靠的代码.为了辅助我们更好的查看微妙的问题,首先需要聚焦在一个hostile排序架构.

6.1 hostile排序架构

Paul遇到了一些hostile排序计算机系统,但错误实际是极其微妙的,并且理解它要求指定硬件的详细知识.不是选择特定硬件
供应商,并拖着读者进入详细的技术规范,让我们替代设计一个足以来吸引读者的虚构的,但最大限度的内存—排序—
hostile计算架构.

 此硬件必须遵循如下排序约束[16,17]:

1.各CPU将总能觉察它自己的内存访问,按在程序中发生的顺序.
2.CPU将重排序一个给定存储操作,仅当两个操作引用不同的位置
3.给定CPU的所有在读内存栅栏(smp_rmb())前的装载,将被所有CPU在此读内存栅栏之后的任何装载前发觉.
4.给定CPU的所有先于写内存栅栏(smp_wmb())的存储,将被所有CPU在此写内存栅栏之后的任何存储前发觉.
5.给定CPU的所有先于一个全内存栅栏(smp_mb())的访问(装载和存储),将被所有CPU在此内存栅栏后的任何访问前发觉.

快速测验6: 是否保证每个CPU有序见到它自己的内存访问,也可保证各用户级线程将有序看到它自己的内存访问?为什么或为什么不?

想象一下,一个大的非均匀缓存结构(NUCA)系统,为了在一个节点去提供公平分配互连带宽到CPU,提供给每个CPU队列在各节点的内部连接接口,如在图8所示.尽管一个给定的CPU的访问顺序由CPU执行的内存栅栏指定,然而,给定CPU对的相关顺序访问能被严格地重排,如所见.
Hostile排序架构例子

6.2 例1

表2显示了3个代码片段,由CUP1,2和3并发的执行.”a”,”b”和”c”每个都被初始化为0.
内存栅栏例1

假设CPU0最近经历了很多缓存未命中,因此它的消息队列满,但CPU1已经独占地运行在缓存中,因此它的消息队列是空的.接着CPU0分配到的”a”和”b”将立即地出现在节点0的缓存中(并且因此对CPU1是可见的),但将被阻塞在CPU0的优先通信后.相反,CPU1分配的”c”将通过CPU1先前的空队列.因此,CPU2可能见到CPU1的分配到”c”,在它见到CUP0分配”a”之前,导致断言失败,尽管有内存栅栏.

在理论上,可移植代码不能按此示例编码.然而,它实际上是可工作在所有主流计算机系统.

快速测验7: 此代码可通过在CPU1的”while”和分配到”c”之间插入一个内存栅栏来修正吗?为什么可以或不可以?

6.3 例2

表3显示三个代码片段,由CPU1,2和3并发执行,”a”和”b”都是初始化为0
内存栅栏例2

再一次,假设CPU0最近经历了许多缓存未命中,因此它的消息队列是满的,但CPU1已经独占地运行在缓存中,因此它的消息队列是空,则CPU0的分配到”a”和”b”将立即地显示在节点0的缓存中(并且因此对CPU1可见),但将被阻塞在CPU0的优先通信后.相反,CPU1的分配到”b”将通过CPU1先前的空队列.因此,CPU2可能将看到CPU1的分配到”b”在它见到CPU0分配到”a”之前,导致断言失败,尽管有内存栅栏.

理论上,可移植代码不能按此示例编码.然而,它实际上是可工作在所有主流计算机系统.

6.4 例3

表4显示三个代码片段,由CPU1,2和3并发执行,所有变量初始化为0.
内存栅栏例3

注意CPU1和CPU2都不能继续处理到行4,直到它们见到CPU0在行3分配”b”,一旦CPU1和2执行它们在行3(译者注:4)的内存栅栏,它们都保证见到所有在行2的内存栅栏前由CPU0分配的.类似的,CPU0在行8的内存栅栏匹配CPU1和2在行4的,因此CPU0将不执行在行9的分配到”e”,直到它分配的”a”在其他的CPU可见之后.因此,CPU2的断言在行9被保证不失败.

快速测验8: 假设行3-5对于CPU1和2,是在一个中断处理器中,并且CPU2的行9运行在处理器级别.有什么改变,如果存在被要求去使代码正确工作,也就是说,阻止断言失败?

Linux内核的synchronize_rcu()原语使用一个算法类似于此例中显示的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值