[theory] [转] T1 探讨并发·副作用的回帖
lichray
2008-02-19
...
为什么实体并发无法避免,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. 引用 好, 我们抛开并发不谈, 假设一个纯粹的函数式语言, 也没有 receive 单词, 到底能不能改动内存某处的数据? 如不能改动, 它和命令式语言怎么分庭抗礼? 举个简单的例子,2*2=4,sqrt(2)=1.414.....。这在数学上都是没有问题,但是我们要问这样一个问题,把2*2应用到人是什么?很简单2个人的2倍是4个人。那么2个人的平方根是什么?这就没有什么意义了。 同样的道理,命令式语言的基础图林机和函数式语言的lambda演算是完全等价的。但是这并不是说在物理实现上他们也是等价的。虽然图林机和 lambda演算都是一种理想模型,他们都需要无穷的计算资源。但是对于图林机来说,它需要的是一根无限长的可回写纸带,符号表的状态可以停留在纸带上。而lambda 演算则是没有状态停留,一旦对一个lambda演算进行求值,那么必须把它算完,这就相当于需要一根无限长但是单向的纸带。我们现在的物理资源都是可回写的,对图林机的实现不仅更简单而且更经济。 但是这种经济,仍然是不涉及时间前提条件下的。如果我们引入了时间这个维度,我们就会发现命令式语言就不那么经济。正如,我们物理实践中发现的规律那样,我们要在两个互相运动的参考系之间进行时间同步,那么首先要知道校准信号的传播速度,而要想测量校准信号的速度又必须首先校准不同参考系内的时钟。为了消除这种无穷倒退,那么我们就假设校准信号的速度在传播过程中是不变的。同样,在两个并发实体之间传递的信号必须保证是与两个并发实体的时钟流逝无关,是一个恒定的值。要保持这个恒定,命令式语言和函数式语言采用不同的办法,前者需要使用锁,后者本身天然就恒定不变。而两者相比较,显然后者更加合适,因为在并发环境下,锁的工作方式仍然是限制两个并发实体不可能再同一个时刻对函数t()进行求值。也就是当A向B传送一个信号,在B接收完之前,其他的并发实体都无法访问A。这种访问限制是通过其他并发实体不断发送探测信号给A询问是否可访问做到的。在单台计算机上,是依靠电信号的检测来实现的可以看作是瞬时的,但是在多台计算机上考虑到网络传输则无法近似瞬时的传递信号。在锁方式下,传递一个信号,计算机之间实际要发送接收许多无用的信号。这种消耗已经远远超过了无限长纸带模型所带来的存储消耗,同时并发实体运算速度带来的效率已经大大抵消了函数式语言模型的低效性。更为重要的是,函数式语言的恒定性使得,并发实体之间传递的信号种类大大增加了。最简单的就是,代码本身。在命令式语言之中,代码本身也是一个随着时间t而改变的relation.这就使得代码无法作为信号在并发实体之间传递。 函数式语言,在并发上优于命令式语言的关键,并不是它能否突破单CPU下的计算瓶颈问题,而是函数式语言可以把随着时间t进行状态迁移的对象的规模规约到最小。它只容许存在理论模型下与时间t流逝有关的无法规约为函数的relation,其他所有的对象都还原为时间t的流逝无关的 function。 |
|
xyun1226
2008-03-10
是的撒多说
|