天天看點

并發模式&& 主動對象 讀書筆記轉

并發模式

為在多線程或程序間共享資源而設計的2種模式:

      ·主動對象設計模式将方法執行和方法調用分離開來。目的是加強并發和簡化對駐留在自身控制線程中的對象的同步通路。

      ·螢幕對象設計模式同步化并發方法的執行,以確定同一時刻在對象内部隻有一個方法運作。它也允許對象的方法協作排程方法的執行順序。

下面2種模式定義了高層并發體系結構:

      ·半同步/半異步體系結構模式将并發系統中的同步和異步程序分離,簡化了程式設計而又不影響性能。該模式引入兩個通信層,一個處理同步服務,另一個處理異步服務。還有一個排隊層協調異步層和同步層服務之間的通信。

      ·上司者/追随者體系結構模式提供了一種高效的并發模型,多個線程依次共享一組事件源,進而對事件源中産生的服務請求進行檢測、多路分解、配置設定和處理。對由緩沖池的線程進行處理的請求沒有同步化或沒有排序的限制時,上司者/追随者模式可以代替半同步/半異步和主動對象模式,以改進性能。

為解決某些并發的内在複雜性提供另一種政策: 

      ·線程特定的存儲器設計模式允許多個線程使用一個“邏輯上全局的”通路點檢索某一本地對象,而不會導緻通路對象時發生加鎖開鎖。在某種程度上,這種模式可以看做其他模式的“對立面”,因為它通過防止程序間的資源共享來實作複雜的内部并發機制。

5.1主動對象(Active Object)

1.問題

      許多應用程式受益于使用并發對象而改進了服務品質,然而,對象并發運作時,如果這些對象被多個客戶機線程共享和修改,則必須同步化對它們的方法和資料的通路,這時産生三個強制條件:

      1)并發地調用對象的處理密集的方法不應無限期地阻塞整個程序,并因些降低其他并發對象的服務品質。

      2)應該很容易程式設計實作對共享對象的同步化通路。特别地,對共享對象的客戶機方法調用的串行化和排程都應是透明的,該共享對象具有同步限制。

      3)應用程式的設計應透明地使用在硬體/軟體平台提供的并行機制。

2.解決方案

      對受以上強制條件限制的對象而言,将其方法調用與執行分離。方法調用應該發生在客戶機的控制線程中,而方法執行應發生在另一個線程中。此外,要将這種分離設計成使客戶機線程看上去像調用普通的方法一樣。

      細節:代理(Proxy)代表主動對象的接口。服務者(Servant)提供了主動對象的實作。代理和服務者在不同的線程中運作,是以方法調用和方法執行可以并發執行。代理在客戶機線程中運作,而服務者在另一個線程中運作。

      在運作時代理将客戶機的方法調用轉換為方法請求,排程程式将方法請求存儲在一個激活表(Activation List)中。排程程式的事件循環和服務者在同一線程中連續運作,将方法請求從激活表隊列中取出并将它們配置設定給服務者。客戶機可以通過代理傳回的前景得到方法執行的結果。

3.結構

      代理提供一個接口允許客戶機調用主動對象的公共可通路的方法。代理的使用允許應該程式使用标準的強類型語言特性程式設計,而不是線上程間傳遞弱類型的消息。代理駐留在客戶機線程中。

      客戶機調用一個由代理定義的方法時,它觸發方法請求(Method Request)對象的構造函數方法請求包括語境資訊(如方法的參數),執行指定方法調用和向客戶機傳回結果時需要這些資訊。方法請求類定義了一個執行主動對象方法的接口。接口也包括可以用來确定某一方法請求是否可執行的哨兵方法。對由主動對象中需要同步化通路的代理所提供的每個公共方法,從方法請求類中派生出具體方法請求類(Concrete MethodRequest)。

并發模式&& 主動對象 讀書筆記轉
并發模式&& 主動對象 讀書筆記轉

      代理将它建立的具體方法請求插入一個激活表(Activation List)。該表包含一個待處理的由代理建立的方法請求組成的有限緩沖區,并跟蹤哪些方法請求可執行。激活表将駐留代理的客戶機線程和執行服務的線程分開,這樣兩個線程可以同時運作。是以,激活表的内部狀态必須串行化,以防對它同時通路。

      排程程式(Scheduler)在其客戶機代理之外的線程中運作,也就是主動對象的線程。它決定下一次對主動對象将執行哪一個方法請求。這一排程決策基于不同的準則(如排序一對主動對象調用方法的順序),或者基于主動對象的某些屬性(如它的狀态)。排程程式可以使用方法請求哨兵評估這些屬性,方法請求哨兵确定何時可以執行這些方法請求。排程程式用激活表管理待處理的方法請求。當客戶機調用其方法時,代理将方法請求插入激活表中。

      服務者被模組化為主動對象,其中定義了其行為和狀态。服務者實作的方法對應于代理接口和由代理建立的方法請求。服務者可能還包含其他謂詞方法,方法請求能夠用這些謂詞方法類實作哨兵。在排程程式執行與之關聯的方法請求時調用服務者方法。因而,它在排程程式的線程中執行。

      當客戶機調用代理上的方法時,會接收到一個前景(future)。該前景允許客戶機在服務者完成方法的執行後獲得方法調用的結果。每個前景都為被調用的方法保留一定的空間,存放方法調用的結果。當客戶機想得到該結果時,它可以與前景彙合(rendezvous),阻塞或輪詢直到結果被計算出來并存入前景。 

并發模式&& 主動對象 讀書筆記轉
并發模式&& 主動對象 讀書筆記轉

4.實作

1)實作服務者。服務者被模組化為主動對象,其中定義了其行為和狀态。另外,服務者還可能包含用來确定何時執行方法請求的謂詞方法。

2)實作調用的基礎設施。在這一活動中,描述了客戶機調用主動對象的方法所必需的基礎設施。這種基礎設施由建立方法請求的代理構成。

  2.1)實作代理。代理為客戶機提供了通路服務者方法的接口。對于客戶機的每次方法調用,代理都建立一個具體的方法請求。每一方法請求是方法語境的抽象,也稱為方法閉包(closure)。一般情況下該語境包括方法參數,到被方法應用的服務者的綁定,結果的前景以及執行方法請求的代碼。

  2.2)實作方法請求。方法請求可以看做一個指令對象,方法請求類聲明了一個被所有具體方法請求使用的接口,它為排程程式提供了一個統一的接口,而不用了解如何評估同步限制或者如何觸發具體方法請求的執行。

3)實作激活表。每個方法請求都插入到一個激活表中。該表可以實作為同步限界緩沖區,該緩沖區由客戶機線程和運作主動對象排程程式及服務者的線程共享。激活表也可以提供一個健壯的疊代器,排程程式可以周遊和删除它的元素。

4)實作主動對象的排程程式。排程程式是一個指令處理程式。用于管理激活表和執行滿足同步限制的未處理的方法請求。排程程式的公共接口通常提供兩個方法,一個被代理用于将方法請求插入到激活表中。另一個用于将方法請求配置設定給服務者。

5)确定彙合和傳回值政策。彙合政策确定客戶機如何從對主動對象調用的方法中得到傳回值。在一個線程中執行的主動對象服務者向另一個線程中運作的調用該方法的客戶程式傳遞傳回值時,彙合發生。實作主動對象模式通常選擇如下彙合和傳回值政策:

  ·同步等待。在代理中同步阻塞客戶機線程,直到排程程式配置設定方法請求并且得到結果并存儲到前景中。

  ·同步定時等待。阻塞有限的時間,并且如果主動對象的排程程式在規定時間内未能配置設定方法請求則失敗。如果逾時為零,客戶機線程就“輪詢”,也就是在排程程式不能将它立即配置設定時可傳回到調用者而不需将方法請求放入隊列。

  ·異步。将方法調用放入隊列并且立即将控制傳回給客戶機。如果方法是一個産生結果的雙向調用,則必須使用某些形式的前景以提供對值的同步化通路,或者在調用失敗時對錯誤狀态的同步化通路。

5.結論

優點:

1)增強了應用程式的并發性,簡化了同步的複雜性。通過允許客戶機線程和異步方法同時執行而增加了應用程式的并發性。通過使用排程程式而簡化了同步的複雜性,排程程式計算同步限制,以保證根據其狀态對服務者進行串行通路。

2)透明地應用可用的并行性。如果硬體和軟體平台能有效地支援多CPU,那麼該模式可以允許多個主動對象并行地執行,是否并行執行僅僅取決于它們的同步限制。

3)方法的執行順序可以和方法的調用順序不同。異步調用的方法是根據由方法的哨兵和排程政策定義的同步機制而執行的。是以,方法執行的順序可以與方法調用的順序不同。這種分離有助于提高應用程式的性能和靈活性。

不足:

1)性能開銷。根據主動對象的排程程式的實作方式不同,當排程和執行主動對象方法調用時可能引起語境切換,同步化和資料移動開銷。一般來說,主動對象模式最适用于相對粗粒度的對象。

2)複雜的調試。因為各種主動對象的排程程式和底層的作業系統線程排程程式的并發性和不确定性。是以很難調試使用主動對象模式的程式。 

 例子就是:

  主動對象模式用于降低方法執行和方法調用之間的耦合。該模式描述了另外一種更為透明的任務間通信方法-------> cas  無鎖隊列。

  傳統上,所有的對象都是被動的代碼段,對象中的代碼是在對它發出方法調用的線程中執行的,當方法被調用時,調用線程将阻塞,直至調用結束。而主動對象卻不一樣。這些對象具有自己的指令執行線程,主動對象的方法将在自己的執行線程中執行,不會阻塞調用方法。

  例如,設想對象"A"已在你的程式的main()函數中被執行個體化。當你的程式啟動時,OS建立一個線程,以從main()函數開始執行。如果你調用對象A的任何方法,該線程将"流過"那個方法,并執行其中的代碼。一旦執行完成,該線程傳回調用該方法的點并繼續它的執行。但是,如果"A"是主動對象,事情就不是這樣了。在這種情況下,主線程不會被主動對象借用。相反,當"A"的方法被調用時,方法的執行發生在主動對象持有的線程中。另一種思考方法:如果調用的是被動對象的方法(正常對象),調用會阻塞(同步的);而另一方面,如果調用的是主動對象的方法,調用不會阻塞(異步的)。

  由于主動對象的方法調用不會阻塞,這樣就提高了系統響應速度,在網絡程式設計中是大有用武之地的。

最直接的例子是:"Logger"(日志記錄器)對象對象為例來介紹如何将一個傳統對象改造為主動對象,進而提高系統響應速度。

http代理伺服器(3-4-7層代理)-網絡事件庫公共元件、核心kernel驅動 攝像頭驅動 tcpip網絡協定棧、netfilter、bridge 好像看過!!!!

但行好事 莫問前程

--身高體重180的胖子