Art of Multiprocessor Programming 答案 ch3

来源:互联网 发布:高尔察克 知乎 编辑:程序博客网 时间:2024/04/30 15:19

大部分的答案:http://www.cs.nyu.edu/courses/spring09/G22.2631-001/sol2.pdf


21 A,B复合之后的任一静止状态必然同时是A和B的静止状态,则由这个静止状态分开的任何方法都满足 原理3.3.2 

22. 否。如图示: R1一个时间单位返回,但是效果需要3个时间单位才能被看到; R2需要3个时钟单位返回,并且立刻能被看到。对于组合,t3为静止态,读操作能得到合理的结果;但是对于R1,t1为静止态,不满足静态一致性。


23. 静态一致非顺序一致:



顺序一致非静态一致:



24.1 是静态一致:  r.write(2) --> r.read(2)。 是可线性化:r.w(1) --> r.r(1) --> r.w(2) --> r.r(2)。所以也是顺序一致的。

24.2 是静态一致:  r.write(1) --> r.read(1)。 是可线性化:r.w(2) --> r.w(1) --> r.r(1) --> r.r(1)。 所以也是顺序一致的。

25. 因为合法不代表遵循单线程中的代码顺序,所以去掉L2不能保证顺序一致。比如:


26. 假设有 H | x不可线性化, 必然违反定义3.6.1中的一条。因为S是响应紧邻调用的事件组合,对于H等价的S去掉所有其他H| y对应的S | y的事件后,剩下的事件必然构成一个H | x的顺序经历,所以不可能违反L1。如果违反L2,所有能找到的S(x)都至少有2个事件m2 --> m1但是在H | x中有m1 --> m2;对于满足L2的S,在m2与m1之间插入任意的事件都不能改变这个事实,即如果没有S | x满足L2,也不可能有S满足L2。

27. 见参考答案。

28. 根据我所知道的c的内存模型,如果代码进行了优化,可能会出现volatile的v比非volatile的x先在多核之间同步的情况,即y可能被0除;不清楚java的模型中happens before是不是消除了这种情况。

29. 假如完成了无限个方法调用执行了无限的平方个操作步,每个调用仍然执行了无限个操作步,不是无锁的。

30. 如果x中某一个方法调用不是无锁的,即进行了无限次(n, n趋近于无限)操作,则任意选取只包含了这个调用的H,例如, |H| = O(2n),n趋近无限大。则H是个无限经历,但只有2个操作完成。矛盾。所以是无锁的。

31. 如果i有限则2^i有限,所以无等待。但是2^i不收敛,不是有界无等待。

32. 见参考答案。

33.