圖解 - 進程之間的通信方式

進程間通信示意圖

管道 (pipe)

管道包括三種:

管道實現通信功能的步驟:

信號量 (semophore)

信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。

消息隊列 (message queue)

消息隊列是消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。

信號 (sinal)

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

共享內存 (shared memory)

共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC(進程間通信) 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。

套接字 (socket)

socket 給應用層和傳輸層之間提供應用程序設計接口(應用編程接口 API)。它可用於不同機器間的進程通信。socket 通信的一般過程:

幾種通信方式的比較

  1. 管道:速度慢,容量有限,只有父子進程能通訊。

  2. 命名管道:任何進程間都能通訊,但速度慢。

  3. 消息隊列:容量受到系統限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題。

  4. 信號量:不能傳遞複雜消息,只能用來同步。

  5. 共享內存區:能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當於線程中的線程安全,當然,共享內存區同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存。

轉自:
https://blog.csdn.net/nk298120/article/details/116532377

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/DjTL4JKEzPWFynBLsKpK5g