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

2021-04-23 20:39:53 字數 1088 閱讀 4740

經常使用到的程序間通訊有:管道、訊息佇列和共享記憶體。

管道最開始出現的管道是用於具有血緣關係的程序之間共享資料的。父程序首先建立乙個管道,然後再fork()出子程序,子程序自動共享對管道的訪問許可權。這種管道是沒有名字的(只有程序中的乙個識別符號進行標識),因此也稱為匿名管道。

如我們在shell中執行 ls * | grep foo 時,shell就會建立乙個匿名管道,並把ls的stdout重定向到該管道的輸入端,把grep的stdin重定向到管道的輸出端,ls 的輸出就自動的稱為grep的輸入。這一切對 ls 和 grep 都是透明的,它們並不知道管道的存在。

後來就出現了fifo(first in first out),也稱為有名管道。有名和無名是針對os來說的,os能直接管理到就是有名的,否則就是無名的。fifo出現後,管道就不僅僅用於具有血緣關係程序的通訊了,而是可以用於任意程序之間的通訊。

管道的生命週期是跟隨程序的。當所有使用管道的程序退出或者所有程序都顯示的呼叫close()後,管道就會被丟棄掉(其實程序退出等效於呼叫close(),因為程序退出時所有開啟的資源識別符號都會被os關掉)。如果這時候管道中仍然有未讀取的資料,這些資料同樣被丟棄掉。而且在往管道中寫入資料時,必須存在讀取資料的程序,不然就沒有任何意義了。

訊息佇列

訊息佇列的作用與管道類似,有足夠寫許可權的程序可往訊息佇列中放置訊息,有足夠讀許可權的的程序可以從訊息佇列中讀取訊息。與管道不同的是在某個程序寫入訊息之前,並不需要另外某個程序在該佇列上等待訊息的到達。這是因為訊息佇列的宣告週期是跟隨核心的。只要核心不刪除訊息佇列,即使程序退出了,訊息佇列依然是存在的。(不過在現有的os的實現中,訊息佇列是通過引用計數的方式記錄當前有多少個程序已經開啟了自己,所有程序退出時,引用計數為0時,此時os也會自動的刪除訊息佇列)。

共享記憶體

共享記憶體也有兩種:匿名共享記憶體和有名共享記憶體。它們的區別和上面提到的管道和fifo一樣,匿名共享記憶體只能用於具有血緣關係的程序間通訊,有名共享記憶體則沒有此限制。

共享記憶體的宣告週期也是跟隨核心的。與上述兩種方式最大的不同在於,使用共享記憶體溝通的程序之間進行資料交換是不經過系統呼叫進行程序--核心的資料copy過程的,所有的資料交換都是在記憶體中完成的。相比於前兩種方式,共享記憶體的方式是速度最快的。

程序間通訊各自的特點

程序通訊的含義 程序是轉入記憶體並準備執行的程式,每個程式都有私有的虛擬位址空間,由 資料以及它可利用的系統資源 如檔案,管道 組成.多程序 多執行緒是windows作業系統的乙個基本特徵.linux系統一般都統稱為程序.由於不同的程序執行在各自不同的記憶體空間中,其中乙個程序對於變數的修改另一方是...

程序間通訊方式(2)

q 訊息佇列實質及運用?a 訊息佇列就是乙個訊息的鍊錶,把訊息看作有特定格式和優先順序的記錄,該記錄包括訊息佇列鍵值,使用者 id,組 id,訊息佇列中訊息數目等,甚至可以包括對訊息佇列讀寫程序的 id。對於訊息有相應許可權的程序可以對訊息程序進行相應寫入和讀取操作 訊息佇列是隨著核心持續的。對於訊...

程序的通訊方式及特點

程序通訊的含義 程序是轉入記憶體並準備執行的程式,每個程式都有私有的虛擬位址空間,由 資料以及它可利用的系統資源 如檔案,管道 組成.多程序 多執行緒是windows作業系統的乙個基本特徵.linux系統一般都統稱為程序.由於不同的程序執行在各自不同的記憶體空間中,其中乙個程序對於變數的修改另一方是...