程序通訊方式總結與盤點

2021-09-29 19:14:04 字數 3817 閱讀 5054

​ 程序通訊是指程序之間的資訊交換。這裡需要和程序同步做一下區分,程序同步控制多個程序按一定順序執行,程序通訊是一種手段,而程序同步是目標。從某方面來講,程序通訊可以解決程序同步問題。

​ 首先回顧下我們前面博文中講到的訊號量機制,為了實現程序的互斥與同步,需要在程序間交換一定的資訊,因此訊號量機制也可以被歸為程序通訊的一種方式,但是也被稱為低階程序通訊,主要原因為:

效率低:一次只可操作少量的共享資料,比如生產者消費者問題,生產者一次只可向緩衝池中投放乙個訊息;

通訊對使用者不透明:os只為程序提供了共享儲存器,而關於程序之間通訊所需的共享資料結構的設計、資料的傳遞、程序的互斥與同步,都必須要有開發者去實現,顯然,這對開發者來說很不方便,增加了程式設計的難度和複雜度。

​ 既然是說到了低階程序通訊,並且解釋了原因,那我們也來看一下高階程序通訊的特點:

使用方便:這也是針對低階程序通訊中的第二點—通訊對使用者不透明,os對開發者隱藏了程序通訊的具體細節,對於使用者來說,只需要使用有os提供的一組原語(實現高階通訊的命令),就可以方便的直接使用並實現程序間的通訊。就像我麼使用第三方的jar包一樣,直接呼叫封裝好的方法即可。

高效的傳送大量資料:可以通過os提供的原語快速的傳輸大量資料。

​ 說完了兩種級別的程序通訊,下面我們就具體的來看一看程序的通訊方式都有哪些。通訊機制也是隨著os的發展而不斷進步的,目前通訊機制可分為四大類:共享儲存器系統、管道通訊系統、訊息傳遞系統以及客戶機-伺服器系統。我們依次來進行講解,對於下面出現的每種通訊方式,我們採用序號來進行標記。

​ 在共享儲存器系統中,相互通訊的程序共享某些資料結構或共享儲存區,程序之間能夠通過這些空間進行通訊。因此按照共享內容的不同,可將其分為以下兩種型別:

​ 也稱為我們上面講到的訊號量機制,此方式要求諸程序共用某些資料結構,藉以實現程序間的資訊交換,共享資料結構的乙個例子就是存放訊息的共享緩衝池,對其的操作需要使用訊號量來保證諸程序間同步的進行。

​ 為了傳輸大量資料,os在記憶體中劃出一塊共享儲存區域,諸程序通過該共享區域讀或寫交換資訊,實現通訊。資料的形式、位置、訪問控制都是由程序來控制的。需要通訊的程序在通訊前,先向系統申請獲得共享儲存區的乙個分割槽,並將其附加到自己的位址空間中(如果不新增,訪問時會產生位址越界中斷,後續的記憶體管理中進行詳細講解),便可對其中的資料進行正常的讀、寫,操作完成或者不在需要時,再講分割槽歸還給共享儲存區。也因為其一次可以操作乙個分割槽,並可將大量的資料讀取或者寫入分割槽,所以這種方式也屬於高階通訊。另外因為資料不需要在程序之間複製,所以這是最快的一種程序通訊機制

​ 所謂「管道」是指連線乙個讀程序和乙個寫程序以實現他們之間通訊的乙個共享檔案,又名pipe檔案。管道系統可分為兩種:

​ 這是unix早期的一種通訊方式,是半雙工通訊,只能用於父子程序或兄弟程序間,並且它不是普通的檔案,並不屬於其他任何檔案系統,並且只存在於記憶體中。

在無關程序間交換資料,fifo也就是先進先出,有路徑名與命名管道關聯,它以一種特殊裝置形式存在於檔案系統中,並且可以實現半雙工或全雙工的通訊。fifo 常用於客戶-伺服器應用程式中,被作為匯聚點,在客戶程序和伺服器程序之間傳遞資料。

​ 該方式隱藏了通訊細節,使通訊過程對使用者透明化,降低了程式設計的複雜性和錯誤率,這也讓它成為當前應用最廣泛的一類程序間通訊機制;並且該機制可以很好的支援多處理機系統、分布式系統和計算機網路,下面我們按照其實現方式,來分別講解下訊息傳遞系統:

​ 直接通訊方式,是直接通過原語將訊息傳送到指定的程序,因此要求放鬆和接收的程序都必須以顯示的方式提供對方的識別符號。下面是兩個os提供的兩條通訊原語:

send

(receiver, message)

;//傳送乙個訊息給接收程序

receive

(sender, message)

;//接收sender發來的訊息

​ 下圖是乙個直接通訊方式的示意圖,圖中可以很清晰的看到程序p1和p2各自傳送了一條訊息給對方,並從對方那接收了一條訊息。

​ 我們來看下信箱通訊的乙個示意圖,從圖中我們可以看到,兩個程序通過信箱來進行訊息的傳送和接收。

​ 我們現在常用的訊息佇列比如activemq、rocketmq、rabbitmq等,都是間接通訊的一種,通過這種共享的中間實體(不一定要在當前主機的記憶體中),可以實現程序間的通訊,並且可以很容易的實現不同主機上的程序通訊。

​ 講到客戶機-伺服器系統,大家可能都會想到c/s架構,想到的可能是qq或者winform等應用,但是c/s模式是乙個邏輯上的概念,在程序通訊中,發起請求的程序為客戶機,進行響應的程序為伺服器,在客戶機-伺服器系統中,除了客戶機和伺服器,還有用與連線所有客戶機和伺服器的網路系統。在網路環境的各種應用領域,客戶機-伺服器系統已經成為當前主流的通訊機制。

​ 其主要的方法有三類:套接字、遠端過程呼叫和遠端方法呼叫。

​ 說起套接字大家應該都比較熟悉,ip+port,可以定位到哪個主機下的哪個程序,這樣就可以對其進行請求,這個就是網路套接字。另一種套接字是檔案套接字,基於本地檔案系統實現的,乙個套接字關聯到乙個特殊檔案,通訊雙放通過這個檔案進行讀寫實現通訊,其原理類似管道。

​ 套接字的優勢就在於,他不僅適用於同一臺計算機內部的程序通訊,也適用於網路環境中不同計算機間的程序通訊;可以保證通訊雙方邏輯鏈路的唯一性(ip+port對ip+port可以保證邏輯鏈路唯一),並與實現資料傳輸的併發服務;隱藏了通訊設施及實現細節,採用統一的介面進行處理。

​ 遠端過程呼叫rpc(remote procedure call)是乙個通訊協議,用於通過網路連線的系統。該協議允許執行於一台主機(本地)系統上的程序呼叫另一台主機(遠端)系統上的程序,而對開發人員表現為常規的過程呼叫,無須額外的為此程式設計。如果設計的軟體採用物件導向程式設計,也可稱之為遠端方法呼叫

​ 最後,我們對這幾種通訊方式進行乙個總結,其中的某幾種通訊方式,被別的博主同一成了乙個,比如訊息傳遞系統中的直接通訊和間接通訊,統稱為訊息佇列,這裡不做正確性的評價,本文是把所有的通訊機制大的方向做乙個總結,具體的實現方式是有很多種的,故不做一一敘述。

1.共享資料結構(訊號量):僅適用於傳遞相對少量的資料,通訊效率低,屬於低階通訊;

2.共享儲存區:允許多個程序共享乙個給定的儲存區,可以從中申請快取區。因為資料不需要在程序之間複製,所以這是最快的一種通訊機制,但要對諸程序的訪問進行同步控制;

3.無名管道:半雙工、速度慢,容量有限,只有父子程序能通訊;

4.命名管道(fifo):任何程序間都能通訊,但速度慢 ,可以實現半雙工或全雙工通訊;

5.訊息緩衝佇列:直接使用os提供的原語,隱藏通訊細節,需要知道接收程序的id和傳送程序的id;

6.訊息佇列:直接通過共享信箱或者佇列,兩個程序可以實現通訊,可實現實時和非實時通訊,兩種訊息傳遞系統容量都容易收到系統的限制;

7.socket:可以用於本機和不同主機間的程序通訊,隱藏通訊細節;

8.rpc:無須額外程式設計,隱藏通訊細節。

程序通訊方式 與 執行緒通訊方式

程序通訊方式 與 執行緒通訊方式 程序通訊方式 7種 管道pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。命名管道fifo 有名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。訊息佇列messagequeue...

程序間通訊方式總結

一 linux系統程序間通訊的方式 二 windows程序間通訊的各種方法 程序是裝入記憶體並準備執行的程式,每個程序都有私有的虛擬位址空間,由 資料以及它可利用的系統資源 如檔案 管道等 組成。多程序 多執行緒是windows作業系統的乙個基本特徵。microsoft win32 api 提供了大...

程序間通訊方式總結

而對unix發展做出重大貢獻的兩大主力at t的貝爾實驗室及bsd 加州大學伯克利分校的伯克利軟體發布中心 在程序間通訊方面的側重點有所不同。前者對unix早期的程序間通訊手段進行了系統的改進和擴充,形成了 system v ipc 通訊程序侷限在單個計算機內 後者則跳過了該限制,形成了基於套介面 ...