分佈式算法 2 領導者選擇算法

算法產生於局部令牌環網:
當令牌在環網中丟失,需要重新產生一個令牌,這就相當於產生一個領導者。這個領導者要求唯一。

定理:
如果每一個進程都相同,則無法選舉出唯一領導者。(如果每個進程都相同,則在同步系統運行中,每個進程發出的消息,接收的消息,狀態的變化都相同,會同時進入領導者狀態)

基本算法 LCR算法:
每個進程都沿環網發送自己的標示符uid(各不相同),並且接受發過來的標示符。
  •         接受的標示符 > 自己的標示符,繼續轉發
  •         接受的標示符 < 自己的標示符,丟棄
  •         接受的標示符 = 自己的標示符,宣佈自己是領導
      這也就使得只有uid最大的進程的標號可以圍繞環網轉一圈。
通信開銷:O(n*n)

通信複雜度爲O(n*logn)的HS算法:
每個進程傳輸分爲0,1,2...個階段,每個階段做以下操作:
  1.         在L階段,當前進程 i 向兩個方向發送自己進程的uid。每個方向都最多運動2^L跳就折返回原來的進程。(之所以可以降低通信複雜度的一個原因是同時向兩邊發uid,相對於LCR算法而言可以提前知道有比自己大的uid的進程
  2.         
  • 如果接收到的uid > 自己的uid,則繼續轉發
  •         如果接收到的uid < 自己的uid,則停止轉發
  •         如果接收到的uid = 自己的uid,則說明自己發送的uid生存到了最後(轉了一圈),所以進程宣佈自己是領導。
如果每個進程可以收到當前階段自己發出的兩個uid,進程就進入下一階段。否則不再向兩邊發出uid。
算法複雜度分析:
在L-1階段,如果有進程接收到了兩個自己之前發出的uid,則說明在2^(L-1)*2+1 = 2^L+1 的範圍內,自己是最大的。
        n個進程中有多少個可以進入L階段呢? 就有 n/( 2^L + 1 ) 個,那麼L階段的通信開銷爲  4*2^L*( n/( 2^L + 1 ) ) <= 4n
        一共有 1+logn 輪,所以總消息最多4n*(1+logn)

LCR 和 HS 是基於比較的算法,每個進程不需要知道一共有多少個進程。

一般網絡中的領導者選舉:
簡單洪泛法(每個進程知道網絡的直徑diam):
每個進程存儲自己的uid,作爲初始最大uid。
      每個進程每一輪向自己的鄰居發送目前最大的uid。
      接收鄰居傳過來的uid。
      進行diam輪發送,最後最大uid = 自己uid的進程宣稱自己是領導者。

優化洪泛算法:
      每個進程存儲自己的uid,作爲初始最大uid。用new-info標記當前收到的消息是之前沒收到過的
      每個進程每一輪{
         如果new-info == true{
                向鄰居發送最大uid。
        }
        接收鄰居傳過來的uid。
        if接受的uid > max-uid{ new-info = true }
        else{ new-info = false }
      }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章