管道-過濾器模式的體系結構是面向數據流的軟體體系結構。它最典型的套用是在編譯系統。一個普通的編譯系統包括詞法分析器,語法分析器,語義分析與中間代碼生成器,最佳化器,目標代碼生成器等一系列對源程式進行處理的過程。人們可以將編譯系統看作一系列過濾器的連線體,按照管道-過濾器的體系結構進行設計。此外,這種體系結構在其它一些領域也有廣泛的套用。因此它成為軟體工程和軟體開發中的一個突出的研究領域。
基本介紹
- 中文名:管道-過濾器模式
起源與發展,各種定義,管道-過濾器的組成,優點,與面向對象的體系結構的比較,研究現狀,管道-過濾器在WSE中的套用,
起源與發展
20世紀07年代初,UNIX第1版的設計者DougMcIlory等首次提出了管道-過濾器的概念並將其套用於UNIX最初版本當中。在UNIX中,管道是將一個命令的標準輸出連線到後一個命令標準輸入的命令字元,過濾器則是管道字元所連線的命令。
20世紀70年代中後期到90年代初,管道一過濾器有了一定的發展:在UNIX系統中採用管道一過濾器的情況比較多,UNxI這樣支持這種方式的編程:它既提供一種符號,以連線各組成部分(UNIX進程)又提供某種進程運行式機制以實現管道;Brina W.Kernighan和P.JPluager曾探討管道-過濾器在程式設計中的套用;J.C.Browne,M.Azam,S.Sobek和G.Kahn在並行程式中引入了管道-過濾器;M.R.Barbacci等在分散式系統套用了管道-過濾器。
90年代以後,軟體體系結構成為軟體工程領域的研究熱點,軟體體系結構風格逐漸成為人們專注的研究領域。1996年,Frank Buschmann等提出了管道-過濾器體系結構風格的概念。同年,Mary Shwa和David Garlany也提到了相同的概念。至此,管道一過濾器結構風格作為一個明確的概念出現在軟體系統的開發中。
縱觀管道-過濾器發展過程,從最初的面向數據流的結構化程式設計方法到現行的軟體體系結構風格,可以認為經歷了3個階段:(1)萌芽階段:出現了管道-過濾器的概念,並首次套用於UNIX當中;(2)初級階段:在不同領域對管道-過濾器的探討,嘗試和運用;(3)高級階段:管道-過濾器上升為描述軟體系統高層抽象結構的體系風格。
各種定義
許多學者提出了自己的概念與定義,以下將介紹3個具有代表性的定義:
定義1.Bucshmann & Meunier 定義:過濾器和管道體系結構風格為處理數據流的系統提供了一種結構。每個處理步驟封裝在一個過濾器組件中。數據通過相鄰過濾器之間的管道傳輸。重組過濾器可以建立相關係統族。
定義2.Shaw & Garlan定義: 管道和過濾器體系結構風格中的每個過濾器有一組輸入端和輸出端。一個過濾器從輸入端讀取數據流,通過本地轉換和漸增計算,向輸出端輸出數據流。管道充當數據流的通道,將一個過濾器的輸出端連線到另一個過濾器的輸入端。
定義3. 信息管理系列委員會定義:在管道和過濾器軟體體系結構中,每個模組都有一組輸入和一組輸出。每個模組從它的輸入端接收輸入數據流,在其內部經過處理後,按照標準的順序,將結果數據流送到輸出端,以達到傳遞一組完整的計算結果實例的目的。通常情況下,可以通過對輸入數據流進行局部變換,並採用漸增式計算方法,在未處理完所有輸入數據以前,就可以產生部分計算結果,並將其送到輸出連線埠(類似於流水線結構)。因此,稱這種模組為“過濾器“。在這種結構中,各模組之間的連線器充當了數據流的導管,將一個過濾器的輸出傳到下一個過濾器的輸入端。所以,這種連線器稱為“管道”。
比較上述各種管道和過濾器體系結構風格的定義可以發現:定義1和定義3都強調了管道和過濾器體系結構風格是由管道和過濾器構成,即從構造的角度來審視該模式。而定義3側重於從管道和過濾器的功能角度來考慮管道和過濾器體系結構風格。儘管各種定義都從不同的角度關注管道和過濾器體系結構風格,但都涵蓋了如下一些實體:管道,過濾器,管道和過濾器的功能以及管道和過濾器構成的拓撲結構。這些形式各異的定義給管道一過濾器的設計者造成了極大的混亂,給理解和使用管道一過濾器帶來了很大的困難。
管道-過濾器的組成
1 過濾器
過濾器按照對流經它的數據操作的不同,可分為3類過濾器:輸入過濾器,處理過濾器和輸出過濾器。下面將對這三類過濾器進行介紹。
(1)輸入過濾器
輸入過濾器處在問題所在的外部世界與軟體系統的邊界處,是系統數據流的源點。它負責接收外界信息並轉化為系統所需的數據流。
(2)處理過濾器
處理過濾器是系統內變換數據流的部件,它有一個入口和一個出口,數據經入口流入,經過處理過濾器內部處理之後從出口流出。
(3)輸出過濾器
從建立完備的,首尾一致的可重用的軟體部件組的角度出發,正如輸入過濾器是系統數據流的起點,那么輸出過濾器是數據流的終點。
過濾器的實現還須滿足以下三條基本原理:
隨後的處理單元從過濾器中拉出輸出數據;
前面的處理單元把新的輸入數據壓入過濾器;
過濾器以循環工作的方式,從流水線中拉出其輸入數據並且將其輸出數據壓入流水線。過濾器按照以上三種情況可分為兩類:主動過濾器和被動過濾器。滿足前兩種情況的過濾器稱為被動過濾器,滿足最後一種情況的過濾器稱為主動過濾器。
2 管道
管道作為過濾器之間數據流動的通道的軟體部件,它的主要功能是連線各個過濾器,充當過濾器之間數據流的通道。管道具有數據緩衝以及提高過濾器之間的並行性操作的作用。管道由數據緩衝區,向數據緩衝區讀和寫數據,判斷管道為空或已滿等操作定義組成.
優點
(1)管道-過濾器模型有如下的優點: 設計人員將整個系統的輸入輸出行為理解為單個過濾器行為的疊加與組合。這樣可以將問題分解,化繁為簡。
(2)任何兩個過濾器,只要它們之間傳送的數據遵守共同的規約就可以相連線。每個過濾器都有自己獨立的輸入輸出接口,如果過濾器間傳輸的數據遵守其規約,只要用管道將它們連線就可以正常工作。
(3)整個系統易於維護和升級:舊的過濾器可以被替代,新的過濾器可以添加到已有的系統上。軟體的易於維護和升級是衡量軟體系統質量的重要指標之一,在管道-過濾器模型中,只 要遵守輸入輸出數據規約,任何一個過濾器都可以被另一個新的過濾器代替,同時為增強程式功能,可以添加新的過濾器。這樣,系統的可維護性和可升級性得到了保證。
(4)支持並發執行:每個過濾器作為一個單獨的執行任務, 可以與其它過濾器並發執行。過濾器的執行是獨立的,不依賴於其它過濾器的。
與面向對象的體系結構的比較
面向對象的體系結構就是套用面向對象的方法建立系統的體系結構。其主要思想是:對問題域中客觀存在的各項事物 建立相應的對象,對象的屬性與方法分別描述事物的靜態特徵與動態行為,對象間的互動通過對其方法的調用進行。面向對象方法的優點是它封裝了對象的屬性和行為,實現了“信息隱蔽”。同時,對象內部行為的修改不影響外部對它的調用。
面向對象的體系結構的一個明顯的缺點是:當一個對象通過過程調用與其它對象互動時,它必須知道其它對象的標識。而當一個對象的標識改變時,需要對所有調用這一方法的對象進行修改。而在管道(過濾器這種體系結構中,過濾器與其它過濾器相連線時不必知道系統中的其它過濾器。而且當某個過濾器發生改變時,不需要對其他過濾器進行改動。
在實際套用中,可以將這兩種體系結構結合起來。例如,先按照管道(過濾器的思想建立系統的體系結構,然後套用面向對象的方法設計和實現過濾器及管道。
研究現狀
在管道和過濾器軟體體系結構中,每個模組都有一組輸入和一組輸出。每個模組從它的輸入端接收輸入數據流,在其內部經過處理後,按照標準的順序,將結果數據流送到輸出端,以達到傳遞一組完整的計算結果實例的目的。通常情況下,可以通過對輸入數據流進行局部變換,並採用漸進式計算方法,在未處理完所有輸入數據以前,就可以產生部分計算結果,並將其送到輸出連線埠(類似於流水線結構)。因此,稱這種模組為“過濾器”。在這種結構中,各模組之間的連線器充當了數據流的導管,將一個過濾器的輸出傳到下一個過濾器的輸入端。所以,這種連線器稱為“管道”。
一個典型的管道/過濾器體系結構的例子是以Unix shell編寫的程式。Unix既提供一種符號,以連線各組成部分(Unix的進程),又提供某種進程運行時機制以實現管道。另一個著名的例子是傳統的編譯器。傳統的編譯器一直被認為是一種管道系統,在該系統中,一個階段(包括詞法分析、語法分析、語義分析和代碼生成)的輸出是另一個階段的輸入。
管道/過濾器體系結構具有許多很好的特點:
(1)使得軟構件具有良好的隱蔽性和高內聚、低禍合的特點;
(2)允許設計者將整個系統的輸入/輸出行為看成是多個過濾器的行為的簡單合成;
(3)支持軟體重用。重要提供適合在兩個過濾器之間傳送的數據,任何兩個過濾器都可被連線起來;
(4)系統維護和增強系統性能簡單。新的過濾器可以添加到現有系統中來;舊的可以被改進的過濾器替換掉;
(5)允許對一些如吞吐量、死鎖等屬性的分析;
(6)支持並行執行。每個過濾器是作為一個單獨的任務完成,因此可與其它任務並行執行;
但是,這樣的系統也存在著若干不利因素:
(1)通常導致進程成為批處理的結構。這是因為雖然過濾器可增量式地處理數據,但它們是獨立的,所以設計者必須將每個過濾器看成一個完整的從輸入到輸出的轉換。
(2)不適合處理互動的套用。當需要增量地顯示改變時,這個問題尤為嚴重。
(3)因為在數據傳輸上沒有通用的標準,每個過濾器都增加了解析和合成數據的工作,這樣就導致了系統性能下降,並增加了編寫過濾器的複雜性。綜合分析現有管道一過濾器體系結構的研究成果,可以發現管道一過濾器體系結構沒有給出管道和過濾器如何組裝以實現系統的方法,也沒有給出過濾器通過管道進行數據傳輸的方式,而且對過濾器和管道各自內部結構沒有清晰的描述,因此可以認為管道一過濾器體系結構沒有深入對管道一過濾器本質進行揭示。
管道-過濾器在WSE中的套用
Web Service Enhancements 1.0 for Microsoft.NET(WSE)是一個類庫,用於實現高級Web服務協定。WSE的體系結構模型基於處理入站和出站SOAP訊息的過濾器。過濾器可以與ASP.NET Web服務基礎結構集成在一起,也可以單獨使用。
WSE的功能包括向出站SOAI,訊息寫入標頭,從入站SOAP訊息讀取標頭;轉換SOAP訊息正文。例如,按照WS-Security規範中定義的那樣加密出站訊息正文和解密入站訊息正文。在WSE中,這種功能通過過濾器來實現。輸出過濾器向訊息寫入標頭,輸入過濾器從訊息讀取標頭並檢查標頭的有效性。此外輸出和輸入過濾器都可以轉換訊息的內容。
Web Service Enhancements (WSE)功能(主要)是通過使用處理入站和出站訊息的過濾器來實現的。您可以單獨使用過濾器或者在管道中使用過濾器,也可以控制進程中管道的默認配置。還可以創建自定義過濾器,添加您需要的功能。