進程間通訊(IPC)的5種方式詳解


每個進程的用戶地址空間是獨立的,不能夠相互訪問,但是他們的內核空間是共享的,所以進程之間要通信可以通過內核。

一、管道通信

發送進程以字符流的形式將大量數據送入管道,接收進程可以從管道接收數據,二者利用管道進行通信。

管道實際上內核中的一塊緩沖區,多個進程訪問同一個緩沖區實現通信,分為匿名管道和命名管道。

C/S結構開發環境,主要通過命名管道實現進程間甚至跨服務器通信。匿名管道用於本地機器上父子進程之間通信,系統開銷小。

C#命名管道通信 - wardensky - 博客園 (cnblogs.com)

 

三、消息隊列 

消息隊列(Message Queue)是保存在內核中消息鏈表。不太適合比較大數據的傳輸,應為他在通訊過程中會存在用戶態和內核態兩次數據拷貝。

“消息”是在兩台計算機間傳送的數據單位。

消息隊列管理器在將消息從它的源中繼到它的目標時充當中間人。

隊列的主要目的是提供路由並保證消息的傳遞;如果發送消息時接收者不可用,消息隊列會保留消息,直到可以成功地傳遞它。

 參考博客:https://blog.csdn.net/dnazhd/article/details/88300163

 

二、信號量

信號量其實是一個整形的計數器,主要用於實現進程間的同步與互斥。

1.信號量用於進程間同步與互斥,若要在進程間傳輸數據需要結合共享內存。

2.信號量基於操作系統的PV操作,程序對信號量的操作都是原子操作。

3.每次對信號量的PV操作不僅限於信號量值加一減一,而且可以加減任意整數。

信號量表示資源的數量,控制信號量的方式有兩種原子操作:

1.一個是 P 操作,這個操作會把信號量減一,相減后如果信號量 < 0,則表明資源已被占用,進程需阻塞等待;相減后如果信號量 >= 0,則表明還有資源可使用,進程可正常繼續執行。

2.另一個是 V 操作,這個操作會把信號量加一,相加后如果信號量 <= 0,則表明當前有阻塞中的進程,於是會將該進程喚醒運行;相加后如果信號量 > 0,則表明當前沒有阻塞中的進程;

3.P 操作是用在進入共享資源之前,V 操作是用在離開共享資源之后,這兩個操作是必須成對出現的。

 參考博客:C#中的信號量---Semaphore -

信號量初始化為1,則該信號量就和互斥鎖的用法一樣。

信號量初始化為0,則代表是同步信號量。

四、共享內存

即在物理內存上開辟一塊空間,然后多個進程通過頁表將這同一個物理內存映射到自己的虛擬地址空間中,通過自己的虛擬地址空間來訪問這塊物理內存,達到了數據共享的目的。

1.共享內存是最快的IPC,因為進程是直接對內存進程存取

2.因為多個進程可以同時操作,所以需要同步

3.信號量+共享內存通常結合在一起使用,信號量用來同步對共享內存的訪問

 

 

 

參考博客: C# 進程間共享內存通信方式C# 進程間通信(共享內存) 

五、Socket

1111

 

參考博客:

1: 進程間通信 | 管道 消息隊列 共享內存 信號量 信號 socket_HUAERBUSHI521的博客-CSDN博客


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM