5.3半同步/半異步
1.問題
并發系統通常既包含異步處理服務,又包含同步處理服務。系統程式員有充分的理由使用異步特性改善性能。異步程式一般更高效,因為可以直接将服務映射為異步機制,如硬體中斷處理程式或者軟體信号處理程式。
相反,應用程式員也有充分的理由使用同步處理簡化他們的程式設計強度。通常同步程式更簡單。因為可以限制某些服務在處理序列中的良好定義的點上運作。
是以,在定義一個既有同步又有異步執行服務的軟體體系結構時,必須解決兩個強制條件:
1)該體系結構應該這樣設計:需要同步處理的簡易性的應用程式開發者無需考慮異步的複雜性。同時,必須将性能最大化的系統開發者不需要考慮同步處理的低效性。
2)該體系結構應該讓同步和異步處理服務能夠互相通信,而不會使它們的程式設計模型複雜化或者過度地降低它們的性能。
雖然對程式設計的簡易性和高性能二者的需求可能看起來互相沖突,但是在一些具體并發系統中需要解決這兩個強制條件。
2.解決方案
将系統中的服務分解成兩層,同步和異步,并且在它們之間增加一個排隊層協調異步和同步層中服務之間的通信。
細節:在獨立線程或程序中同步地處理高層服務(如耗時長的資料庫查詢或檔案傳輸),進而簡化并發程式設計。相反,異步地處理底層服務(如由網絡接口硬體發出的中斷所驅動的短期協定處理程式),以增強性能。如果駐留在互相獨立的同步和異步層中的服務必須互相通信或同步它們的處理,則應允許它們通過一個排隊層向對方傳遞消息。
3.結構
同步服務層(Synchronous service layer)完成高層處理服務。同步層中的服務在獨立的操作時可以阻塞的線程或程序中運作。
異步服務層(Asynchronous service layer)進行低層處理服務,這些低層處理服務通常由一個或多個外部事件源發出。異步層中的服務在進行操作時不能阻塞,而不會過度不為降低其他服務的性能。

排隊層(queueing layer)為同步和異步層服務之間提供通信機制。 例如,異步服務産生包含資料和控制資訊的消息,然後将這些消息緩沖儲存在排隊層中,以後同步服務可以擷取它們,反之亦然。當消息從另外的層傳遞給某一層時,排隊層負責通知這一層中的服務。是以排隊層使異步和同步層可以以“生産者/消費者”方式互動,類似于管道和過濾器模式中定義的結構。
外部事件源(external event source)産生被異步服務層接收和處理的事件。
4.實作
1)将整體系統分解為三層:同步層、異步層和排隊層。
1.1)辨別高層和/或耗時長的服務并将它們裝配到同步層中。并發系統中的許多服務在使用同步處理程式設計的時候更容易實作。這些服務通常進行相對高層或耗時長的應用處理,如傳輸Web伺服器中的大容量資料流或者進行資料庫的複雜查詢。是以同步層的服務應該運作在獨立的程序或線程中。如果沒有可用的資料,那麼服務可以在端到端應用程式通信協定的控制下在排隊層中阻塞,等待響應。
1.2)辨別低層和/或耗時短的服務并将它們配置到異步層中。系統中的某些服務由于延時不能阻塞。這種服務一般實作與外部事件源互動的低層或耗時短的系統處理,如使用者終端或由中斷驅動的硬體網絡接口。為了将反應能力和效率最大化,這些事件源必須盡快得到處理并且不能阻塞為它們服務的線程。它們的服務應該被從外部事件源發出的異步通知或中斷觸發并一直執行到結束,這時它們可以将包含結果的消息插入排隊層。
1.3)辨別層間通信政策并将它們裝配到排隊層中。排隊層是一個中介者,将異步層和同步層服務之間的通信分離開。這些服務就不會彼此進行直接通路,反通過排隊層互相通路。排隊層實作的與通信相關的政策包括多路複用(分解)、緩沖、通知和流控制。異步層和同步層中的服務使用這些排隊政策實作在同步層和異步層之間傳遞消息的協定。
2)實作同步層中的服務。同步層中的高層和/或耗時長的服務通常使用多線程和多程序技術實作。與線程相比,程序包含更多的狀态資訊并需要更多的開銷來生成、同步化、排程和互相通信。是以,在獨立的線程中比在獨立的程序中實作同步服務可以使應用程式更簡單和更高效。
然而,多線程會降低應用程式的健壯性,因為程序中獨立的線程會互相幹擾。例如,一個錯誤線程可能破壞由程序中的其他線程共享的資料,并是以産生不正确的結果,使程序崩潰,或導緻程序永久性挂起。是以,為了增加健壯性,可以在獨立的程序中實作應用程式服務。
3)實作異步層中的服務。異步層中的低層和/或耗時短的服務通常沒有它們自己專有的控制線程。它們必須從其他地方借用一個線程,如作業系統核心的“空閑線程”或一個獨立的中斷堆棧。為了確定對其他系統服務(如高優先級硬體中斷)有足夠的反應時間,這些服務必須異步地運作并且不能被長時間阻塞。
下面是兩個可以用來觸發異步服務執行的政策:
·異步中斷。該政策通常在開發被外部事件源(如網絡接口或磁盤控制器)發出的硬體中斷觸發的異步服務時使用。在這種政策中,當事件在一個外部事件源上發生時,中斷通知與事件關聯的處理程式,然後該處理程式處理事件直到結束。
在複雜的并發系統中,可能有必要定義中斷層次(hierarchy)來允許不太關鍵的處理程式被擁有更高優先級的處理程式占先。為了防止中斷處理程式在被通路時破壞共享狀态,必須保護被異步層使用的資料結構,例如可以采用提高中斷優先級的方式。
·主動I/O。這種政策常用于開發基于高層作業系統API。如Windows NT重疊I/O和I/O完成端口或者異步I/O系統調用的POSIX aio_*系列的異步服務。在這種政策中,I/O操作由異步操作處理器執行。一個異步操作完成後,異步操作處理器産生一個完成事件。然後該事件被配置設定給與事件關聯的處理程式,該處理程式處理事件直到完成。
這兩種異步處理政策有個相同的限制:處理程式不可能長時間阻塞而不破壞對來自其他外部事件源的事件的處理。
4)實作排除層。異步層中的服務完成了對來自于外部事件源的輸入的處理後,它們一般将結果消息插入排隊層。同步層中相應的服務會接着将從排隊層中删除這些資訊,并對它們進行處理。輸出處理時這些角色正好倒過來。在實作排隊層時必須定義兩個與通信有關的政策。
4.1)實作緩沖政策。異步層和同步層中的服務不能直接通路對方的記憶體,而是通過一個排隊層交換消息。排隊層對消息進行緩沖,這樣同步和異步服務可以并發運作,而不是死闆地采用“停止并等待”的流控制協定運作。是以緩沖政策必須實作一個排序、串行化、通知和流控制政策。注意,政策模式可以用來簡化選擇的政策的配置。
·實作排序政策。簡單的排隊層按到達的順序存儲消息,也就是“先進先出”(FIFO)。被某個層的服務放入隊列的第一個消息就是第一個被另一個層中的服務移出的消息。FIFO排序易于實作,但是如果高優先級的消息在低優先級消息之後入隊列,可能會導緻優先級倒置。是以,可以使用更複雜的隊列政策,按“優先級”順序存儲和獲得消息。
·實作串行化政策。異步層和同步層中的服務可以并發地執行。是以隊列必須被串行化以避免消息被并發插入和删除時出現的競争條件。這種串行化通常使用簡單同步機制(如互斥機制)實作。這種機制確定消息可以被插入到排隊層的消息緩沖區和從中删除,而不會破壞它的内部資料結構。
·實作通知政策。在從一層向另一層發送的消息到達時,有必要通知該層的服務。通常使用更進階和更複雜的同步機制(如信号燈或條件變量)實作由排隊層提供的通知政策。這些同步機制可以在發給同步層或異步層的資料到達排隊層時通知同步層或異步層中的相應服務。
·實作流控制政策。系統不可能提供無限制的資源量對排隊層中的消息進行緩沖。是以,需要控制在同步層和異步層之間傳遞的資料量。流控制是一種技術,能防止同步服務向異步層發出消息的速度高于消息能在網絡接口傳輸和排隊的速度而“淹沒”異步層。
同步層中的服務可以阻塞。普通的流控制政策在一個同步服務産生和排隊超過某一數量的消息時,簡單地将它置于睡眠。在異步服務層将隊列置空到低于某個水準時,排隊層可以喚醒處于睡眠的同步服務,繼續它的處理。
相反,異步層中的服務不能阻塞。如果它們産生過多的消息,那麼普通的流控制政策允許排隊層取消消息,直到同步服務層完成了對隊列中消息的處理。如果消息與一個可靠的面向連接配接的傳輸協定(如TCP)關聯,發送者将最終逾時并重新發送被取消的消息。
4.2)實作多路複用(分用)機制。在半同步/半異步模式的簡單實作中,排隊層裡隻有一個隊列。該隊列被所有異步層和同步層中的服務共享,任何服務可以處理任何請求。這種配置減輕了對複雜多路複用(分用)機制的需要。在這種情況下,一般的實作是定義一個單件隊列,所有服務使用它插入和删除消息。
在更複雜的半同步/半異步模式的實作中,某個層中的服務可能需要對另一個層中的一些服務發送和接收特定的消息。是以一個排隊層可能需要多個隊列(如每個服務一個隊列)。對于多個隊列,需要更複雜的多路分解機制,以確定在不同層的服務間交換的消息放置在相應的隊列中,一般的實作是使用某些類型的多路複用(分用)機制(如哈希表)将消息放進相應的隊列。
5.結論
優點:
1)簡化和性能。簡化高層同步處理服務的程式設計,又沒有降低低層系統服務的性能。
2)事務分離。分離每一層的同步政策,是以各層不需要使用相同的并發控制政策。
3)集中的層間通信。層間通信集中在一個通路點進行,因為所有互動都由排隊層協調。排隊層對另外兩層間傳遞的消息進行緩沖。這消除了加鎖和串行化的複雜性,否則,如果同步和異步服務層直接通路對方記憶體中的對象,這就是必要的。
不足:
1)當資料在同步和異步服務層之間通過排隊層傳輸時,語境切換,同步化和資料拷貝開銷可能會引起越界帶來的開銷。
2)高層應用程式服務可能不會從異步I/O的效率中獲益。
3)調試和測試的複雜性。
http代理伺服器(3-4-7層代理)-網絡事件庫公共元件、核心kernel驅動 攝像頭驅動 tcpip網絡協定棧、netfilter、bridge 好像看過!!!!
但行好事 莫問前程
--身高體重180的胖子