管道過濾器

管道-過濾器體系結構模式爲處理數據流的系統提供了一種結構

工業中的流處理系統-水處理系統

 

整個系統分爲多個處理單元,由管道將多個處理單元連接起來;管道用來輸送流,處理單元用於流的加工和處理;流從一個處理單元出口輸出,
經過管道輸送到下一個處理單元的入口,經過每個處理單元的加工處理,最後由輸出管道輸出到使用地。
 
軟件系統中管道-過濾器結構的應用操作系統
UNIX系統中,可以將某個命令的標準輸出與另一命令的標準輸入相連。
語法:命令1 | 命令2 | 命令3 | … | 命令N
例如:ls –l | more
Windows
Dir  *.exe | sort > exe.txt
 
軟件系統中管道-過濾器結構的應用傳統的語言編譯器
 
 
結構描述
數據流的處理過程分成幾個順序執行的處理步驟,每個處理步驟由一個過濾器組件實現。每個過濾器組件有一組輸入和一組輸出。
每個過濾器組件都會對輸入的數據採用漸進方式進行局部處理,一個過濾器組件的輸出是下一個過濾器的輸入。
系統的初始數據流由數據源(DataSource)輸入,系統的處理結果數據流輸出到數據池(Data Sink)。
數據源、過濾器和數據池由管道pipe順序連接起來,每個管道承擔相鄰過濾器之間的數據傳輸。
 
 
主要組成:
過濾器Filter
數據源Source
數據池Sink
管道Pipe
 
過濾器Filter
封裝數據處理功能的功能單元,是管道-過濾器結構中的主要處理單元。
每個過濾器組件有一組輸入和一組輸出,從連接它的輸入管道中讀取數據,數據經過加工處理,輸出到連接它的輸出管道
 
過濾器Filter
3種激活方式
pull拉出式
後續組件從當前過濾器中拉出數據。
push推入式
前鄰組件向當前過濾器推入數據。
主動過濾器ActiveFilter
激活狀態下,以循環方式不斷從前鄰組件中拉出數據,並向後續組件推入數據。
 
管道Pipe
管道是相鄰過濾器之間的連接。
連接兩個主動過濾器的管道是一個先進先出的緩衝器,用以完成同步。
連接被動過濾器的管道可以通過對被動過濾器的調用來實現。
 
數據源DataSource
數據源是系統的輸入。向系統提供相同結構或類型的數據序列。如標準輸入流、文本文件或傳感器採集的數據等。
數據源可以主動把數據推入過濾器,也可以在過濾器需要數據時被動地提供數據。
 
數據池DataSink
彙集系統處理的結果數據。如文本文件、數據庫、標準輸出等。
主動數據池把過濾器的結果拉出來,而被動數據池等待過濾器把結果推入進來。
 
 
實現的主要步驟
1.把系統任務分成幾個獨立的處理階段。
2.定義沿着每個管道傳輸的數據格式。
3.決定管道的連接。
4.設計和實現過濾器。
5.設計出錯處理。
6.建立、處理流水線。
 
 
步驟1:把系統任務分成幾個獨立的處理階段。
每個處理階段完成一個獨立的處理功能。
每個處理階段必須只依賴其前一階段的輸出。
 
步驟2:定義沿着每個管道傳輸的數據格式。
如果整個系統定義統一的數據格式,則使得過濾器組件的重組變得容易,系統可以獲取極大的靈活性。但是,單一的數據格式在某些情況下,在不同的過濾器組件擇偶觀需要頻繁進行格式轉換,大大降低了系統的數據處理效率。
如果需要選擇不同的數據格式,又需要一定的靈活性,則需要在系統中建立專門的格式轉換過濾器組件。
步驟3:決定管道的連接。
首先,需要確定把過濾器作爲被動過濾器還是主動過濾器來實現。
被動過濾器的連接簡單,一般直接使用調用來拉出或推入數據即可。需要注意的是,重組和替換過濾器組件時必須設計代碼修改,另外這種過濾器難以獨立開發和測試。
使用主動過濾器,可以藉助管道的同步化分離機制提高系統的靈活性。如果所有的管道都使用這種方式,系統的過濾器可以做到隨意重組。
 
步驟4:設計和實現過濾器。
過濾器的設計必須同時考慮需要完成的任務,和與它相鄰的管道
如果是被動過濾器,拉入數據可以通過函數(function)實現,推出數據可以通過過程(process)實現。如果是主動過濾器,可以實現爲線程(Thread)。
過程1之間和在地址空間之間的數據複製的需要,會影響到系統的性能;因此,管道緩衝區的大小是一個值得考慮的附加參數。在多個關聯轉換和數據複製總開銷一定情況下,使用小的主動過濾器組件,可以獲得較高的靈活性。
爲了方便重用過濾器組件,需要控制過濾器組件行爲時,可以通過下列常用方式將參數傳遞給相應的過濾器組件:
在命令行傳遞參數。
在啓動過濾器組件時,讓過濾器使用可以訪問得到的全局環境或者倉庫2,這些可以通過操作系統、配置文件或者shell程序來支持實現。
設計和實現過濾器時,要注意靈活性和易用性的均衡,一般一個過濾器只需做好一件事即可。
 
步驟5:設計出錯處理。
管線(pipeline)上的組件不能共享全局狀態,但錯誤可以探測到。
例如,在unix系統中,爲錯誤消息定義了一個特殊的輸出通道stderr1;但是,當多個過濾器組件並行運行時,stderr會以不可預測的方式混合來自不同過濾器組件的錯誤信息。
錯誤處理實現比較困難。
如果一個過濾器組件在輸入數據中探測到錯誤,它可以忽略後面輸入的數據,直到明確的分隔符出現爲止。因此,當可能會有不可預料的輸入數據時,如果允許容忍不精確的結果,這種錯誤處理的方法還是很有效的。
重啓系統,希望繼續運行 à再同步問題 à 添加固定標識。
步驟6:建立處理流水線
如果系統只需處理單一任務,可以用一個主程序來創建管道流水線,由主程序調用主動過濾器啓動處理過程。
增加靈活性:
通過提供shell程序或用戶終端工具,使用它們從你的過濾器組件集中裝配出不同的流水線。
如果允許中間處理結果存放到文件中,並支持把文件作爲後續組件的輸入,這樣可以支持流水線的增量式開發。
 
如果系統中的過濾器嚴格限制爲單輸入、單輸出,則這種結構的系統被稱爲管線或流水線(pipeline
如果允許過濾器的輸入或輸出多於一個,這種系統的結構可以用一個有向圖表示。這種系統的結構需要經過嚴格的理論分析,以保證系統可以終止和輸出正確結果。
在過濾器之間使用命名的管道(如文件)傳送數據,這種系統稱爲有名管道。有名管道限制過濾器之間數據傳送只能在命名的管道中,給系統的維護和重組帶來了困難。
 
優點
系統易於重組,增加了系統的靈活性。
系統易於更新、升級和維護。
過濾器組件易於重用。
並行處理提高了系統的效率。
支持快速原型系統的設計和實現。
系統具有清晰的拓撲結構,方便進行某些系統性能的分析。
 
缺點
管道-過濾器結構會經常導致數據的批處理方式。
管道-過濾器結構不適合處理交互式應用要求。
數據轉換增加了系統的開銷和複雜性。
共享狀態信息代價高且不靈活。
用並行方式獲得高效率往往不可行。
難於進行錯誤處理。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章