正文
P2_write(u);
P2_read(v);
从理论上来讲,2 个程序运行在 2 个独立的处理器的核上,有多少种执行的可能那?我列举其中几种来举例说明。
第 1 种:
P1---write(x)--------read(y)--------
P2-----------write(u)-------read(v)-
第 2 种:
P1----------write(x)-read(y)--------
P2--write(u)----------------read(v)-
第 3 种:
P1---read(y)----------write(x)------
P2-----------write(u)---------read(v)-
我们有 24 中可能的执行顺序,也就是这 4 个操作任意的排列组合,也就是 4!=24。类似第一种和第二种这样的可能性很好理解。为什么会出现像第 3 种这样的可能的执行那?那是因为就算是在同一个程序中,由于处理会有多级的缓存,以及处理器中 coherence 的存在,虽然你的程序中是先 write 后 read,在内存中真正生效的顺序,也有可能是先 read 后 write。
其实还会出现类似下面这样的执行,2 个操作在 2 个处理器上同时执行。
P1--write(x)-read(y)--------
P2--write(u)--------read(v)-
如果加上同时运行的这种情况,那就有更多种可能性。我的算数不好,这里我就不再继续算了,因为到底有多少个不重要,重要的是你知道有很多种可能性就可以了。那么定义中的"any execution",就是指任意一种可能的执行,在定义中也可以理解为所有的这些可能的执行。
接下来还是不翻译定义,我们再来解释一个词 --
sequential order
。什么叫 sequential order?我们来翻一下英语词典(感觉更像是在做阅读理解了)。
sequential: 连续的;相继的;有顺序的
order: 命令;顺序;规则;[贸易] 定单
sequential order-- 有顺序的顺序,这个是什么鬼?
其实
sequential
是有一个接一个的意思,在处理器的这种上下文中,sequential 就是指
操作
(operartion)一个接一个的执行,也就是顺序执行,并且没有重叠。
Order
是指经过一定的调整,让某样东西按照一定的规则变得有序。比如,在算法中的排序算法就是 ordering,就是让数组这个东西按照从大到小的规则或则从小到大的规则变得有序。那么 sequential order 就是指让操作(operation)
按照一个接一个这样的规则排列,并且没有重叠
。
仍然说上面的例子,如果把 4 个操作,按一个接一个的规则排列,我们这时就可以得到 4!的排列组合个可能的排列(order),仍然,到底有多少个不重要。
比如:
P1_write(x);P1_read(y);P2_write(u);P2_read(v);
P1_read(y);P1_write(x);P2_write(u);P2:read(v);
P2_write(u);P2_read(v);P1_read(y);P1:write(x);
我这里只列举其中 3 个,其他的大家可以自己排一下。
重点来了,其实 sequential order 就是让这 4 个操作一个接一个的顺序执行,并且没有重叠。注意这个排列不是真实的执行,真实的执行是 any execution,这里说的是逻辑上的假设,这也就是为什么定义有一个 as if。
做了这么多的铺垫,下面我们开始翻译定义中的第一句话:
任意一种可能的执行的效果和某一种所有的处理器上的操作按照顺序排列执行的效果是一样的。