圖解 | 進程之間的通信方式
進程間通信示意圖

管道(pipe)
管道包括三種:
普通管道:通常有兩種限制,一是單工,只能單向傳輸;二是只能在父子或者兄弟進程間使用.流管道:去除了第一種限制,為半雙工,只能在父子或兄弟進程間使用,可以雙向傳輸.命名管道:去除了第二種限制,可以在許多并不相關的進程之間進行通訊.

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

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

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

信號 (sinal)
信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發(fā)生。
共享內存(shared memory)
共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創(chuàng)建,但多個進程都可以訪問。共享內存是最快的 IPC(進程間通信) 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。


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

幾種通信方式的比較
管道:速度慢,容量有限,只有父子進程能通訊。 命名管道:任何進程間都能通訊,但速度慢。 消息隊列:容量受到系統(tǒng)限制,且要注意第一次讀的時候,要考慮上一次沒有讀完數據的問題。 信號量:不能傳遞復雜消息,只能用來同步。 共享內存區(qū):能夠很容易控制容量,速度快,但要保持同步,比如一個進程在寫的時候,另一個進程要注意讀寫的問題,相當于線程中的線程安全,當然,共享內存區(qū)同樣可以用作線程間通訊,不過沒這個必要,線程間本來就已經共享了同一進程內的一塊內存。
https://blog.csdn.net/nk298120/article/details/116532377
評論
圖片
表情
