Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188756
  • 博文数量: 40
  • 博客积分: 1768
  • 博客等级: 上尉
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-28 18:15
文章分类
文章存档

2012年(4)

2011年(11)

2010年(10)

2009年(6)

2008年(9)

分类:

2008-09-19 16:56:33

为什么实体并发无法避免,side-effect?原因也非常的简单,side-effect实则上是状态的变迁。而所谓的状态的变迁实则上是一个对时间 t的函数State(t).只要引入了时间,就会引入状态。在顺序式编程中,我们绝大部分忽略时间这个维度的.在单核CPU的顺序型编程中,只存在一个唯 一的均匀流逝的时钟,那就是CPU时钟.这个时候我们可以把CPU时钟发生器看作一个函数t(),此时从机器内部看t()是一个无状态的数列.因此每一个 并发实体的State(t),都可以看成一个无副作用的函数。这就好比初中物理中讲述的牛顿时空观的概念,如果两个参考AB系相对于C参考系运动,他们在 时刻t上观测C的某一点坐标是完全相同的。
但是一旦我们把程序,分布到多个CPU或者多台机器,那么那个唯一的均匀流逝的时钟就不存在了。各个CPU和各台机器之间的时间函数的流逝速度 都是不同的,于是就必然会导致时钟校准问题。要做时钟校准,那么需要信号的传递。但是物理法则告诉我们,信号的传递不可能是无损耗也不可能是瞬时的。于是 从A看B的时钟,与C看B的时钟是完全不同的.如果这时有三台机器,A,B,C,各自以自己CPU的时钟运行,同时以B的时钟进行校准。这时在B在t时 刻,向A,和C发送信号让他们停止,并且让A和C拍下t时刻下B的数据,此时A和C所得到的数据就会产生不同。这样就产生了状态。在同一个时刻t,函数 StateB(t)的取值完全不同。

lambda 演算和PI演算的不同之处也就在这里。在lambda演算中默认了一个唯一的均匀流逝的时间函数t(),并且每一个并发实体不可能同时对函数t()进行求 值,因此从两个不同的并发实体CB去看某一个并发实体A的状态,总是State函数在两个不同时刻的取值,因此在lambda演算下,在某一个时刻t整个 并发系统中每一个并发实体观测A状态的结果只有一个StateA(t)={StateA(TX(t))}.TX(t)=t.一个并发系统的中的某个并发实 体在时刻t上的取值,就等于该并发实体在t时刻的状态,State的取值和时间t一定是一一对应,也就是说可以构成一个函数。

而在PI演算内,则完全不同,首先它不存在唯一的时间函数t(),其次一个并发实体A的本身状态,实则上是整个并发系统中其他各个并发实体观测A 所得到值的集合,既StateA(t)={StateA(TB(t)),StateA(TC(t)),.......} t与状态变化不构成一一对应,只能是一个relation而不是function.

用更为数学化的语言来说就是,令时钟基准的机器的时间序列t={t1,t2,t3...},其他各机器的时钟校准函数集合T={TA,TB,TC,TD....}.那么基准机器相对于整个系统的的状态变迁态射就是S:Txt->s.
阅读(2112) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~