1.2.1 互斥特性
为了证明旗子协议能够正确地解决Alice-Bob问题,首先必须理解正确的解决方案应该满足什么样的特性,然后再证明旗子协议能保证这些特性成立。
前面已证明两个宠物不会同时待在院子里,这种特性称为互斥。
然而,互斥只是所需的特性之一。如前面所提到的,Alice和Bob都不允许自己的宠物进入院子这样的协议也满足互斥特性,但对于他们的宠物来说这种协议却是不可接受的。下面分析另外一种重要特性。如果一个宠物想进入院子,则最终必会成功;如果两个宠物同时都想进入院子,则至少有一个能够成功。这种特性称为无死锁,它是解决Alice-Bob问题的基本特性。
可以断定上述Alice-Bob协议是无死锁的。假设两个宠物都想进入院子,于是Alice和Bob各自升起自己的旗子,Bob最终总会发现Alice的旗子是升起的,则会降下旗子暂缓自己的请求,从而让Alice的猫进入院子。
无饥饿(或无封锁)特性是一种必须关注的特性:如果一个宠物想进入院子,它最终能够成功吗?对此,Alice-Bob协议并不能完全保证。每当Alice和Bob发生冲突时,Bob都必须屈从Alice而暂缓自己的请求,因此,有可能出现这样的情形:Alice的猫一次又一次地进入院子,而Bob的小狗则一直窝在屋子里变得越来越焦躁。稍后,我们将会看到如何通过协议防止出现这种饥饿现象。
最后一种需要关注的特性就是等待。假设Alice升起自己的旗子,随后突发阑尾炎,于是她(带着她的猫)去了医院。手术成功之后,留院观察一周。虽然Bob为Alice的病情得以好转而松了一口气,但在Alice离开家里的这段日子里,Bob的小狗无法进入院子。问题的根源就在于协议中规定Bob必须等待Alice把旗子降下后才能把自己的小狗放出去。如果Alice被耽误了(即便理由是好的),Bob也会被延迟(没有什么理由)。
等待问题在容错中是非常重要的。通常情况下,希望在一段合理的时间内,Alice和Bob都能够及时地响应对方,但如果没有及时响应该怎么办?互斥的本质就是等待:无论一个互斥协议设计得多么巧妙,都无法避免等待。然而,大多数其他的协作问题无需等待就可以解决,有时甚至采用一些出乎预料的方法。