領導者/追隨者(leader/follower)
1.問題
多執行緒是實現併發處理多事件的應用程式的一種常用技術。然而,很難實
現高效能的多執行緒伺服器應用程式。這些應用程式通常處理大量同時到達
的多型別事件。為了有效地處理這種問題,有三個強制條件必須解決:
1)服務請求可以來自為每個已連線的客戶機分配的多事件源(如多
確定有效的多路分解關聯。
2)為了將效能最大化,必須儘量減少引起與併發有關的開銷。(如語境切
換,同步化和快取一致性管理)。特別地,為在多個執行緒間傳遞的請求動
態分配記憶體的同步模型會在傳統的多處理器作業系統中產生巨大的開銷。
3)多路分解共享的事件源集合上事件的多個執行緒必須相互協作,以防止競
爭條件。競爭條件可能出現在多個執行緒試圖同時訪問或修改某些型別的事
件源的時刻。
2.解決方案
構造乙個執行緒池,通過對到達事件源的事件多路分解,並向處理事件的應
用服務同步地分配事件,依此輪流進行來共享事件源集合。
詳細細節:設計乙個執行緒池機制,允許其中的多個執行緒相互協作並在檢
測、多路分解、分配和處理事件時保護臨界區。在這種機制中,每次允許
(追隨者)排隊等待它們成為領導者的機會。當前的領導者執行緒從事件源
集合檢測到乙個事件後,它首先將乙個追隨者執行緒提公升為新的領導者,然
後扮演處理執行緒的角色,對事件多路分解並分配給指定的事件處理程式,
在處理執行緒中實現與應用有關的事件處理。在當前領導者執行緒在由所有線
程共享的事件源集合上等待新的事件時,多個處理執行緒可以併發地處理事
件。在處理完事件後,處理執行緒恢復到追隨者角色,並等待再次成為領導
者執行緒。
3.結構
由作業系統提供控制代碼,用來區分可以生成事件並將之排隊的事件源(如網
絡連線或開啟檔案)。事件可以由外部事件源(如從客戶機傳送乙個服務
的connect事件或read事件),或者內部事件源(如超時)引發。控制代碼
集是控制代碼的集合,可以用來等待乙個或多個事件在該控制代碼集中的控制代碼上發
表。當可以啟用控制代碼集中控制代碼上的乙個操作而不發生操作阻塞時,控制代碼集
返回到它的呼叫者。
事件處理程式明確了由乙個或多個鉤子方法組成的介面。這些方法表示可
以對發生在控制代碼上的與應用有關的事件進行處理的操作集。
具體事件處理程式是事件處理程式的特化,並實現應用程式提供的特定服
務。特別地,具體事件處理程式實現負責處理從控制代碼接收的事件的鉤子方
法。
領導者/追隨者模式的核心是執行緒池。乙個或多個執行緒扮演追隨者角色並在
執行緒池同步器上排隊等待扮演領導者角色。其中乙個執行緒被選擇成為領導
者,等待事件在控制代碼集中的控制代碼上發生。當有乙個事件發生時,當前領導
者執行緒將乙個追隨者執行緒提公升為新的領導者。原來的領導者接著扮演處理
執行緒的角色,對從控制代碼集到相應事件處理程式的事件進行多路分解,並分
配處理程式的鉤子方法進行事件處理。在處理執行緒完成了事件的處理後,
4.實現
1)選擇控制代碼和控制代碼集機制。控制代碼集是控制代碼的集合,領導者執行緒可以用它
來等待在事件源集上發生事件。開發者通常選擇底層作業系統提供的控制代碼
和控制代碼集機制,而不是隨便地實現它們。
1.1)確定控制代碼型別。
·併發控制代碼。這種型別的控制代碼允許多個執行緒併發訪問事件源的控制代碼而不會引發
可能破壞,丟失或擾亂資料的競爭條件。
·迭代控制代碼。這種型別的控制代碼需要多執行緒迭代訪問事件源上的控制代碼,因為併發
訪問將導致競爭條件。
1.2)確定控制代碼集的型別。
·併發控制代碼集。這種型別的控制代碼集上可以有併發的動作,例如,執行緒池對它的
併發訪問。
·迭代控制代碼集。這種型別的控制代碼集在它可以啟動控制代碼集中乙個或多個控制代碼上的
乙個操作而不阻塞操作時返回到它的呼叫者。雖然迭代控制代碼集可以在單個呼叫
中返回多個控制代碼,但是它一次只能由乙個執行緒呼叫。
1.3)確定選擇某個控制代碼和控制代碼集機制的效果。
1.4)實現事件處理程式的多路分解機制。
·對低層作業系統事件多路分解機制程式設計。在這種策略中,直接使用作業系統
提供的控制代碼集多路分解機制。
·對高層事件多路分解模式程式設計。在這種策略中,開發者使用諸如反應器、主
動器和包裝器材外觀等高層模式。
2)在控制代碼集中實現臨時啟用(停用)控制代碼的協議。當事件到達時,領導者執行緒執行以下三步:
·在控制代碼集中暫時停用該控制代碼。
·將乙個追隨者執行緒提公升為新的領導者。
·繼續處理事件。
在控制代碼集中將該控制代碼停用避免了從選擇新領導者到處理事件的時間內出現競爭
條件。如果新的領導者在這一段時間內等待控制代碼集中的同一控制代碼,那麼它可能
再次將該事件多路分解,這樣做是錯誤的,因為這時已經在進行分配了。在事
件被處理後,控制代碼在控制代碼集中被再次啟用,這樣領導者執行緒等待事件在該控制代碼
或控制代碼集中其他啟用的控制代碼上出現。
3)實現執行緒池。為了將乙個追隨者執行緒提公升為領導者角色,以及確定哪
個執行緒是當前的領導者,領導者/追隨者模式的工具必須管理乙個執行緒池。一種直接的實現方法是簡單地將所有追隨者執行緒放入集合,等待單獨的同步器,如訊號燈和條件變數。在這種設計中,不管是哪個執行緒來處理事件,只要共享控制代碼集的池中的所有執行緒都是序列化的。
4)實現允許執行緒初次加入(以及以後再次加入)執行緒池的協議。該協議用於以下兩種情況:
·在首創了能獲得和處理事件的執行緒池後。
·以及在處理執行緒已完成並且可以處理另乙個事件時。
如果沒有領導者執行緒可用,則處理執行緒可以立即變為領導者。如果領導者執行緒
5)實現追隨者提公升協議。
5.1)實現控制代碼集同步協議。如果控制代碼集是迭代的,並且我們盲目地提公升了乙個新的領導者執行緒,那麼可能新的領導者執行緒會試圖處理與前乙個領導者執行緒檢測到的並正在進行處理的同一事件。為了避免這種競爭條件,必須在將乙個追隨者控制代碼提公升為領導者控制代碼並將事件分配給具體事件處理程式之前,將該控制代碼從控制代碼集的候選控制代碼中刪除。分配並處理事件後,必須從控制代碼集中再次啟用該控制代碼。
5.2)確定提公升協議排序。
·lifo順序。在許多應用程式中,下一次提公升哪個追隨者執行緒不重要,因為
所有執行緒都是對等的。在這種情況下,領導者執行緒可以按照後進先出
(lifo)的順序提公升追隨者執行緒。lifo協議通過確保等待時間最短的執行緒首
先被提公升將cpu快取記憶體的相似性最大化。
·優先順序順序。在某些應用程式中,特別是實時應用程式中,執行緒可能執行在
不同的優先順序上。在這種情況下,需要根據追隨者執行緒的優先順序對它們進行提
公升。這種協議可以使用某些型別的優先順序佇列實現,如堆。雖然該協議比
lifo協議更複雜,但是為了使優先順序反序的情況最少,就需要按照追隨者線
程的優先順序對它們進行提公升。
·由實現定義的順序。在使用作業系統同步器(如訊號燈或條件變數)來實現
控制代碼集時常用這種順序,通常按照由實現定義的順序分配等待執行緒。這種協議
的優點是它能高效地對映到本地作業系統同步器上。
6)實現事件處理程式。
5.結論
優點:1)效能增加。
·增強了cpu快取記憶體相似性並消除了動態記憶體分配和執行緒間共享的資料
緩衝區要求。
·可能將優先順序逆序的數量減少到最小,因為伺服器中沒有進行其他排
隊。·不需要語境切換以處理每個事件,減少了事件分配延時。
2)程式設計簡單性。領導者/追隨者模式簡化了併發模型的程式設計,其中多執行緒
可以使用共享控制代碼集接收請求,處理響應並多路分解連線。
不足:1)實現複雜性。
2)缺乏靈活性。
3)網路i/o瓶頸。
領導者 追隨者模型介紹
領導者 追隨者模型介紹 這幾天翻了些文章,發現對領導者 追隨者模型說的比較少,下面就這個模型打個比方 話說乙個地方有一群有組織無紀律的人從事山賊這個很有前途的職業。一般就是有乙個山賊在山路口察看,其他人在林子裡面睡覺。假如發現有落單的過往客商,望風的山賊就會弄醒乙個睡覺的山賊,然後自己去打劫。醒來的...
高效併發模式,半同步半非同步和領導者追隨者
首先來看同步與非同步到底是什麼呢?在計算機領域,同步就是指乙個程序在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程序將會一直等待下去,直到收到返回資訊才繼續執行下去 非同步是指程序不需要一直等下去,而是繼續執行下面的操作,不管其他程序的狀態。當有訊息返回時系統會通知程序進行處理,這...
02 卓越領導者創造非凡 卓越領導者
00.人類天生喜歡將各種問題歸咎於那些表現不佳的人,我們喜歡找乙個替罪羊作為任何問題產生的根源。這對那些績效不良的領導者可是莫須有的罪名。01.我們確信不管在人的哪乙個階段,其他領導者也可以通過練習來提高領導有效性,真正的關鍵在於他們需要密集聯絡。差勁的領導者會認為可以的練習是不會有任何作用的,所以...