管道與過濾器風格

     在管道/過濾器風格的軟件體系結構中,每一個構件都有一組輸入和輸出,構件讀輸入的數據流,通過內部處理,而後產生輸出數據流。這個過程一般經過對輸入流的變換及增量計算來完成,因此在輸入被徹底消費以前,輸出便產生了。所以,這裏的構件被稱爲過濾器,這種風格的鏈接件就象是數據流傳輸的管道,將一個過濾器的輸出傳到另外一過濾器的輸入。此風格特別重要的過濾器必須是獨立的實體,它不能與其它的過濾器共享數據,並且一個過濾器不知道它上游和下游的標識。一個管道/過濾器網絡輸出的正確性並不依賴於過濾器進行增量計算過程的順序。shell


  如圖是管道/過濾器風格的示意圖。一個典型的管道/過濾器體系結構的例子是以Unix shell編寫的程序。Unix既提供一種符號,以鏈接各組成部分(Unix的進程),又提供某種進程運行時機制以實現管道。另外一個著名的例子是傳統的編譯器。傳統的編譯器一直被認爲是一種管道系統,在該系統中,一個階段(包括詞法分析、語法分析、語義分析和代碼生成)的輸出是另外一個階段的輸入。
網絡

  管道/過濾器風格的軟件體系結構具備許多很好的特色:
  (1)使得軟構件具備良好的隱蔽性和高內聚、低耦合的特色;
  (2)容許設計者將整個系統的輸入/輸出行爲當作是多個過濾器的行爲的簡單合成;
  (3)支持軟件重用。重要提供適合在兩個過濾器之間傳送的數據,任何兩個過濾器均可被鏈接起來;
  (4)系統維護和加強系統性能簡單。新的過濾器能夠添加到現有系統中來;舊的能夠被改進的過濾器替換掉;
  (5)容許對一些如吞吐量、死鎖等屬性的分析;
  (6)支持並行執行。每一個過濾器是做爲一個單獨的任務完成,所以可與其它任務並行執行。 
  可是,這樣的系統也存在着若干不利因素。
  (1)一般致使進程成爲批處理的結構。這是由於雖然過濾器可增量式地處理數據,但它們是獨立的,因此設計者必須將每一個過濾器當作一個完整的從輸入到輸出的轉換。
  (2)不適合處理交互的應用。當須要增量地顯示改變時,這個問題尤其嚴重。
  (3)由於在數據傳輸上沒有通用的標準,每一個過濾器都增長了解析和合成數據的工做,這樣就致使了系統性能降低,並增長了編寫過濾器的複雜性。
性能

相關文章
相關標籤/搜索