叫水协议

May 19th, 2010 | Categories: Computer, ZZ | Tags:

原文:http://www.newsmth.net/bbscon.php?bid=63&id=2359932

那天看老公邮箱里有一封信,标题是叫水协议,好奇,遂点进进入,然后HLL的被雷到了。。。
信是他们实验室一个人给大家的群发,信内容如下:

组里面已经有饮水机了,有两个水桶,希望大家看见一个桶喝完就叫水,这样可以保证水不断。叫水电话@@@@,水卡卡号AAAA,每次让他送一桶”矿泉水“就可以了,水票在饮水机下面的隔间里。为了保证大家不重复叫水,HW和我拍定了一个协议,就是水喝完了之后如果空桶是放在饮水机上的,就表示还没叫水,空桶是放在饮水机旁边的地上的,就表示已经叫水还没有送到。希望大家可以看到一个桶空了之后可以举手之劳,去叫个水,争取不要出现桶放在饮水机上面的情况,:)

以下是实验室中的众人回复信,看完了,真的要Orz一下了
————————————
这个协议有bug呀。如果实验室里非贵组的人发现水没了,没叫水就把空桶拿下来直接换了有水的桶,咱就都不知道了。。。
所以我觉得最自然的情况(饮水机上的桶是空的,或者空桶放在旁边的地上)都应该表示没叫过水,而用一种特殊的标记表示叫过水了。比如我们宿舍的方法是,拿一张水票放在空桶上表示叫过水(这样送水的来了也省的人给他找水票了)。
————————————-
协议1.0还有一个问题是,如果叫水的时候不把另一桶水换上,会导致不断换同一桶水,而另一桶水百年不用。
————————————-
这个问题我解释一下,我怀疑你可能不完全了解这个场景。我们现在有一个饮水机,两个水桶。初始时一个水桶在饮水机上,里面有水,另外一个在地上,是满的,这个状态记为状态*。目前的策略是当一桶喝完时换另一桶,同时叫一桶水。这样可以保证实验室始终有水可喝(这里假设送水延迟远远小于喝一桶水的时间)。当下一桶水到达时,送水的师傅会把原来换下的那个空桶带走,回到状态*。如此反复。
—————————————-
关键是把叫水和换筒做成原子操作。
——————————————
万一有大队人马同时干光了两桶水,组里有大号水箱没?……
——————————————
所以我觉得最自然的情况(饮水机上的桶是空的,或者空桶放在旁边的地上)都应该表示没叫过水,而用一种特殊的标记表示叫过水了。比如我们宿舍的方法是,拿一张水票放在空桶上表示叫过水(这样送水的来了也省的人给他找水票了)。
———————————————
的确如此,上面建议的这个patch抗干扰性要比v1.0好,建议打上这个patch。不过也有问题:如果水票被风吹掉了……
———————————————-
如果这样的话,协议1.0的bug很容易修啊。把叫水和没叫水的两个状态换一下就可以了(假设空桶放在饮水机上比较不自然,叫过水的就把空桶放在饮水机上,没叫过就放在地上)。这样不明就里的人换水会选择自然把桶放在地上,就表示水没叫过。
———————————————–
                叫水成功
有空桶 —————> 把水票放空桶之上          
              |
              | 未叫水
              | 或叫水失败
              |
           空桶,无水票
这样的协议才是fail-safe的,即不懂协议的人也能按协议正常执行。。。
————————————————-
赞fail-safe的协议!话说咱们有过v2.0吗?
以上看完了,我崩溃了,不能写个牌子放在那里,正面已叫水,反面未叫水,挂在饮水机上,谁打过电话,翻动一下不就完了。。。
娃们,你们花点时间干别的吧。。。

  1. July 27th, 2010 at 02:14
    Reply | Quote | #1

    典型的程序员思维