圖解 | 進(jìn)程之間的通信方式
進(jìn)程間通信示意圖

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

管道實(shí)現(xiàn)通信功能的步驟:

信號(hào)量(semophore)
信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪問(wèn)。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問(wèn)共享資源時(shí),其他進(jìn)程也訪問(wèn)該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。

消息隊(duì)列(message queue)
消息隊(duì)列是消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。

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


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

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