程序間通訊各自的特點

2021-07-15 02:46:47 字數 2690 閱讀 2518

程序通訊的含義

程序是轉入記憶體並準備執行的程式,每個程式都有私有的虛擬位址空間,由**,資料以及它可利用的系統資源(如檔案,管道)組成.多程序/多執行緒是windows作業系統的乙個基本特徵.linux系統一般都統稱為程序.

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

.

程序通訊的分類

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

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

高階通訊主要用於程序間資料塊資料的交換和共享,常見的高階通訊有管道,訊息佇列,共享記憶體等.

程序通訊的方式

1)檔案和記錄鎖定

為避免兩個程序間同時要求訪問同一資源而引起訪問和操作的混亂,在程序對共享資源進行訪問前必須對其鎖定

,該程序訪問完後再釋放

.這是unix為共享資源提供的互斥性保障.

2)管道

管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用

.程序的親緣關係一般指的是父子關係.管道一般用於兩個不同程序之間的通訊.當乙個程序建立了乙個管道,並呼叫fork建立自己的乙個子程序後,父程序關閉讀管道端,子程序關閉寫管道端,這樣提供了兩個程序之間資料流動的一種方式.

3)有名管道

有名管道也是一種半雙工的通訊方式,但是它允許無親緣關係程序間的通訊

.

4)fifo

fifo是一種先進先出的佇列.它類似於乙個管道,只允許資料的單向流動.每個fifo都有乙個名字,允許你不相關的程序訪問同乙個fifo,因此也成為命名管.

5)訊號量

訊號量是乙個計數器,可以用來控制多個執行緒對共享資源的訪問.,它不是用於交換大批資料

,而用於多執行緒之間的同步

.它常作為一種鎖機制

,防止某程序在訪問資源時其它程序也訪問該資源.因此,主要作為程序間以及同乙個程序內不同執行緒之間的同步手段.

6)訊號

訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生.

7)訊息佇列

訊息佇列是訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識.訊息佇列克服了訊號傳遞資訊少

,管道只能承載無格式位元組流以及緩衝區大小受限等特點

.訊息佇列是unix下不同程序之間可實現共享資源的一種機制,unix允許不同程序將格式化的資料流以訊息佇列形式傳送給任意程序.對訊息佇列具有操作許可權的程序都可以使用msget完成對訊息佇列的操作控制.通過使用訊息型別,程序可以按任何順序讀資訊,或為訊息安排優先順序順序.

8)共享記憶體

共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問.共享記憶體是最快的ipc(程序間通訊)方式,它是針對其它程序間通訊方式執行效率低而專門設計的.它往往與其他通訊機制

,如訊號量

,配合使用

,來實現程序間的同步與通訊

.

9)套接字(socket)

套介面也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同程序及其間程序的通訊.

通訊方式的優缺點

幾種通訊方法總結綜上所述.程序之間的多種通訊方法各自有各自的優點和缺點:如果使用者傳遞的資訊較少.或是需要通過訊號來觸發某些行為.前文提到的軟中斷

訊號機制不失為一種簡捷有效的程序間通訊方式.但若是程序間要求傳遞的資訊量比較大或者程序間存在交換資料的要求,那就需要考慮別的通訊方式了。無名管道簡單方便.但侷限於單向通訊的工作方式.並且只能在建立它的程序及其子孫程序之間實現管道的共享:有名管道雖然可以提供給任意關係的程序使用.但是由於其長期存在於系統之中,使用不當容易出錯.所以普通使用者一般不建議使用。訊息緩衝可以不再侷限於父子程序.而允許任意程序通過共享訊息佇列

來實現程序間通訊

.並由系統呼叫

函式來實現訊息傳送和接收之間的同步.從而使得使用者在使用訊息緩衝進行通訊時不再需要考慮同步問題.使用方便,但是訊息佇列中資訊的複製需要額外消耗

cpu的時間.不適宜於資訊量大或操作頻繁的場合。共享記憶體

針對訊息緩衝的缺點改而利用記憶體緩衝區直接交換資訊,無須複製,快捷、資訊量大是其優點。但是共享記憶體

的通訊方式是通過將共享的記憶體緩衝區直接附加到程序的虛擬位址

空間中來實現的.因此,這些程序之間的讀寫操作的同步問題作業系統無法實現。必須由各程序利用其他同步工具解決。另外,由於記憶體實體存在於計算機系統

中.所以只能由處於同乙個計算機系統中的諸程序共享,不方便

網路通訊

。不同的程序通訊方式有不同的優點和缺點.因此.對於不同的應用問題,要根據問題本身的情況來選擇程序間的通訊方式。

一般來說,程序間的通訊根據通訊內容可以劃分為兩種:即控制資訊的傳送與大批資料傳送

。有時也把程序間控制資訊的交換稱為低階通訊,而把程序間大批量資料的交換稱為高階通訊。

程序間通訊2 通訊方式及各自特點

經常使用到的程序間通訊有 管道 訊息佇列和共享記憶體。管道最開始出現的管道是用於具有血緣關係的程序之間共享資料的。父程序首先建立乙個管道,然後再fork 出子程序,子程序自動共享對管道的訪問許可權。這種管道是沒有名字的 只有程序中的乙個識別符號進行標識 因此也稱為匿名管道。如我們在shell中執行 ...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間的通訊

程序間的通訊就麻煩一些了,訊號的種類就有 種,可以在終端中輸入kill l檢視!就先說幾個今天剛學的吧 sigint,這個訊號是由硬體產生的,比如按下ctrl c時就會產生這個訊號。sigalrm,這個訊號是由alrm unsigned int arg 函式產生的,就是間隔arg秒時間後產生siga...