管道和過濾器

2021-05-25 14:14:32 字數 1664 閱讀 8271

現在的學習筆記要側重自己的理解。用自己的語言,經驗來闡釋它。讀一段後,寫下我的理解。

管道和過濾器體系結構模式為資料流的系統提供了一種結構。每個處理步驟封裝在乙個過濾器元件中,過濾器元件間通過通道連線。重組管理器元件可以得到不同的系統族。這個和之前見過的乙個語音流的處理結構非常相似。

1.例子

這裡列舉了乙個編譯器軟體。從**到可執行檔案經過了很多步驟,每個步驟都抽象成乙個過濾器元件。

2.語境

處理資料流。

3.問題

保持系統的靈活性。可以通過替換處理步驟,或對處理步驟進行排序來進行系統公升級。

把這個系統劃分為乙個個小的元件,這些組比大粒度元件更易於重用。

不相連線的處理步驟不共享資訊???相互了解的步驟需要共享資訊嗎?不需要。只要輸出指定格式的資料流即可。

後面兩個難於理解。

這樣的系統有乙個特點,不需要人的參與,和人的互動性補強。比如乙個互動式的事件驅動的系統則不宜使用此模式。

4.解決方案

第乙個過濾器的輸出成為資料來源,最後乙個過濾器的輸出成為資料匯點。

簡單的解決方案是線性的:

複雜一點的,可能存在資料匯接點:

5.結構

過濾器是流水線(其實相當於整個系統,流水線只是形象的說法)的處理單元。

過濾器可以分為主動過濾器和被動過濾器,區分的標準是他們處理資料的方式,是主動獲取輸入並且輸出,還是等待輸入,並且等待輸出。

管道表示過濾器之間的連線。有一種方案,就是主動過濾器呼叫被動過濾器,比如前乙個過濾器處理完畢資料流後,直接呼叫後乙個過濾器來處理資料流,這樣管道就是過濾器元件間的呼叫。這樣有個問題,會降低系統的靈活性。可以考慮建立乙個專門的過濾器類來完成類似工作。後面對系統的重組其實就是對管道的重組或重定義。

6.動態特性

乙個推進流水線,過濾器活動通過向被動過濾器寫資料而啟動。也就是可以理解為輸入時被動的,而輸出時主動的。

乙個拉的流水線,也就是可以理解為輸入時主動的,輸出時被動的。

混合了推和拉。

所有的過濾器都迴圈的主動拉出、計算並推入資料。這個方案有乙個好處,就是每個過濾器都可以是乙個單獨的程序或執行緒。對於處理大量的資料是有好處的。

所有的過濾器都是被動的,而所有的操作都由管道來觸發,它迴圈的從過濾器拉資料並且向過濾器推入資料。

過濾器之間全部用通道連線,所有的過濾器都是被動輸入,主動輸出。這樣就減少了緩衝處理步驟。另外,這個在實現上可以將這個系統作為乙個程式,而每個過濾器只是程式的乙個模組。這個方案的複雜度相對較低,適合小型系統構建。這其實是第一種方案。

7.實現

本系統劃分為一系列的處理階段。每乙個處理階段必須只依賴前一階段的輸出。

定義沿每個管道傳輸的資料格式。

決定如何實現每個管道連線。

設計和實現過濾器。

設計錯誤處理。這是乙個難點。需要根據具體的應用來做權衡。

建立處理流水線。

8.效果

優點:靈活性,可以通過重組過濾器來實現不同的處理過程;可以方便的替換過濾器;過濾器元件可以重用;並行處理提高效率;

缺點:不易於共享全域性狀態;資料轉換的額外開銷;錯誤處理;

關於Linux 管道和過濾器

在linux中,將兩個命令連線起來使用時,乙個命令的輸出作為另乙個命令的輸入,這就叫做管道。為了建立管道,兩個命令之間使用 連線。管道是linux程序之間重要的通訊機制,除了管道,還有共享記憶體,訊息佇列,訊號量,套接字 socket 等程序通訊機制。能夠接受資料,過濾 處理或篩選 後在輸出的工具,...

Linux命令 5 管道和過濾器

1管道 有時候,我們可以把兩個命令連起來使用,乙個命令的輸出作為另乙個命令的輸入,這就叫做管道 為了建立管道,需要在兩個命令之間使用豎線 連線。管道是linux程序之間一種重要的通訊機制 除了管道,還有共享記憶體 訊息佇列 訊號 套接字 socket 等程序通訊機制 2過濾器 能夠接受資料,過濾 處...

wireshark捕獲過濾器和顯示過濾器

wireshark的捕獲過濾器是在裝置驅動級別提供抓包的過濾介面 表示式 目的埠 dst post 80 源埠 src port 80 協議 udp 設定網段 net 192.168.0.0 mask 255.255.255.0等價於net 192.168.0.0 24 埠範圍 portrange ...