1. 程式人生 > >程序間資料通訊方式和特點

程序間資料通訊方式和特點

由於不同的程序執行在各自不同的記憶體空間中.一方對於變數的修改另一方是無法感知的.因此.程序之間的資訊傳遞不可能通過變數或其它資料結構直接進行,只能通過程序間通訊來完成。

根據程序通訊時資訊量大小的不同,可以將程序通訊劃分為兩大型別:控制資訊的通訊和大批資料資訊的通訊.前者稱為低階通訊,後者稱為高階通訊。

低階通訊主要用於程序之間的同步、互斥、終止、掛起等等控制資訊的傳遞。

高階通訊主要用於程序間資料塊的交換和共享 常見的高階通訊有管道(PIPE)、訊息佇列(MESSAGE)、共享記憶體(SHARED MEM0RY)等。


這裡主要比較一下高階通訊的這三種方式的特點。

管道通訊(PIPE)
      兩個程序利用管道進行通訊時.傳送資訊的程序稱為寫程序.接收資訊的程序稱為讀程序。管道通訊方式的中間介質就是檔案.通常稱這種檔案為管道檔案.它就像管道一樣將一個寫程序和一個讀程序連線在一起,實現兩個程序之間的通訊。寫程序通過寫入端(傳送端)往管道檔案中寫入資訊;讀程序通過讀出端(接收端)從管道檔案中讀取資訊。兩個程序協調不斷地進行寫和讀,便會構成雙方通過管道傳遞資訊的流水線。
      利用系統呼叫PIPE()可以建立一個無名管道檔案,通常稱為無名管道或PIPE;利用系統呼叫MKNOD()可以建立一個有名管道檔案.通常稱為有名管道或FIFO。無名管道是一種非永
久性的管道通訊機構.當它訪問的程序全部終止時,它也將隨之被撤消。無名管道只能用在具有家族聯絡的程序之間。有名管道可以長期存在於系統之中.而且提供給任意關係的程序使用,但是使用不當容易導致出錯.所以

作業系統將命名管道的管理權交由系統來加以控制管道檔案被建立後,可以通過系統呼叫WRITE()和READ()來實現對管道的讀寫操作;通訊完後,可用CLOSE()將管道檔案關閉。

訊息緩衝通訊(MESSAGE)
      多個獨立的程序之間可以通過訊息緩衝機制來相互通訊.這種通訊的實現是以訊息緩衝區為中間介質.通訊雙方的傳送和接收操作均以訊息為單位。在儲存器中,訊息緩衝區被組織成佇列,通常稱之為訊息佇列。訊息佇列一旦建立後即可由多程序共享.傳送訊息的程序可以在任意時刻傳送任意個訊息到指定的訊息佇列上,並檢查是否有接收程序在等待它所傳送的訊息。若有則喚醒它:而接收訊息的程序可以在需要訊息的時候到指定的訊息佇列上獲取訊息.如果訊息還沒有到來.則轉入睡眠狀態等待。

共享記憶體通訊(SHARED MEMORY)
      針對訊息緩衝需要佔用CPU進行訊息複製的缺點.OS提供了一種程序間直接進行資料交換的通訊方式一共享記憶體 顧名思義.這種通訊方式允許多個程序在外部通訊協議或同步,互斥機制的支援下使用同一個記憶體段(作為中間介質)進行通訊.它是一種最有效的資料通訊方式,其特點是沒有中間環節.直接將共享的記憶體頁面通過附接.對映到相互通訊的程序各自的虛擬地址空間中.從而使多個程序可以直接訪問同一個實體記憶體頁面.如同訪問自己的私有空間一樣(但實質上不是私有的而是共享的)。因此這種程序間通訊方式是在同一個計算機系統中的諸程序間實現通訊的最快捷的方法.而它的侷限性也在於此.即共享記憶體的諸程序必須共處同一個計算機系統.有實體記憶體可以共享才行。

三種方式的特點(優缺點):

1.無名管道簡單方便.但侷限於單向通訊的工作方式.並且只能在建立它的程序及其子孫程序之間實現管道的共享:有名管道雖然可以提供給任意關係的程序使用.但是由於其長期存在於系統之中,使用不當容易出錯。

2.訊息緩衝可以不再侷限於父子程序.而允許任意程序通過共享訊息佇列來實現程序間通訊.並由系統呼叫函式來實現訊息傳送和接收之間的同步.從而使得使用者在使用訊息緩衝進行通訊時不再需要考慮同步問題.使用方便,但是資訊的複製需要額外消耗CPU的時間.不適宜於資訊量大或操作頻繁的場合。

3.共享記憶體針對訊息緩衝的缺點改而利用記憶體緩衝區直接交換資訊,無須複製,快捷、資訊量大是其優點。但是共享記憶體的通訊方式是通過將共享的記憶體緩衝區直接附加到程序的虛擬地址空間中來實現的.因此,這些程序之間的讀寫操作的同步問題作業系統無法實現。必須由各程序利用其他同步工具解決。另外,由於記憶體實體存在於計算機系統中.所以只能由處於同一個計算機系統中的諸程序共享。不方便網路通訊。

 轉自http://blog.csdn.net/jeffcjl/article/details/5523569