第6章波动算法和遍历算法在对各种应用程序或分布式系统设计分布式算法时,一些一般性的问题经常可以看成是该分布式算法的子任务。
这些子任务包括消息的广播(比如说启动和终止消息传递),在进程之间获取一个全局的同步,在每个进程中触发执行某个事件或计算一个每个进程拥有部分输入的函数等。
这些任务的执行都要通过在某些指定的、依赖于拓扑结构的模式上传递消息来保证所有进程参与这个活动。
这种消息传送的模式,我们今后叫做波动算法(wave algorithms),顾名思义,这一计算必须波及到所有结点或进程。
在这一章,我们将形式化地给出波动算法的定义,并证明一些在波动算法方面的一般性结论(6.1.2)。
从6.1.3到6.1.5将严格阐述一个相同的算法被用于上面列出的所有的基本的任务。
6.2节提出一些广泛使用的波动算法。
6.3节考虑遍历算法,它是在波动算法的基础上增加这样的属性: 算法对应的一个计算的所有事件都在因果序关系上是全序的。
6.4节给出了几个在分布式深度优先搜索上的算法。
波动算法的意义波动算法不仅是一类重要的分布式算法,而且也提供了分布式算法设计的一种途径和方式方法。
本章将表明,许多分布式算法实际上是一种波动算法,所有的波动算法都具有共同的特征,满足波动算法的属性条件。
一旦一个问题弄清楚了求解该问题的算法具有波动性的特点,就可以考虑用波动算法来求解这个问题。
此时,算法的设计不必另起炉灶,从头开始一步一步地分析、设计这个分布式算法,而是可以从一个已知的波动算法出发,通过改造这个算法来达到设计算法,求解波动问题的目标,而这样一个改造波动算法从而获得一个新的波动算法的过程,是相对简单和容易的。
换言之,波动算法的研究,不仅划分了一类具有共同特征属性的算法,而且提供了这类算法设计的一种新的途径或方式方法。
6.1 波动算法的定义和使用除非明确指出,否则我们在本章中都将假设网络拓扑是固定的(网络拓扑结构不发生改变)、无向的(每个通道可以在两个方向上携带消息),并且是连通的(每两个进程之间有一条路径)。