(1)管道通信管道是一種最基本的進(jìn)程間通信機(jī)制。管道就是操作系統(tǒng)在內(nèi)核中開(kāi)辟的一段緩沖區(qū),進(jìn)程1可以將需要交互的數(shù)據(jù)拷貝到這段緩沖區(qū),進(jìn)程2就可以讀取了。管道的特點(diǎn):只能單向通信只能血緣關(guān)系的進(jìn)程進(jìn)行通信依賴于文件系統(tǒng)生命周期隨進(jìn)程面向字節(jié)流的服務(wù)管道內(nèi)部提供了同步機(jī)制
(2)消息隊(duì)列通信消息隊(duì)列就是一個(gè)消息的列表。用戶可以在消息隊(duì)列中添加消息、讀取消息等。消息隊(duì)列提供了一種從一個(gè)進(jìn)程向另一個(gè)進(jìn)程發(fā)送一個(gè)數(shù)據(jù)塊的方法。 每個(gè)數(shù)據(jù)塊都被認(rèn)為含有一個(gè)類型,接收進(jìn)程可以獨(dú)立地接收含有不同類型的數(shù)據(jù)結(jié)構(gòu)。可以通過(guò)發(fā)送消息來(lái)避免命名管道的同步和阻塞問(wèn)題。但是消息隊(duì)列與命名管道一樣,每個(gè)數(shù)據(jù)塊都有一個(gè)最大長(zhǎng)度的限制。使用消息隊(duì)列進(jìn)行進(jìn)程間通信,可能會(huì)收到數(shù)據(jù)塊最大長(zhǎng)度的限制約束等,這也是這種通信方式的缺點(diǎn)。如果頻繁的發(fā)生進(jìn)程間的通信行為,那么進(jìn)程需要頻繁地讀取隊(duì)列中的數(shù)據(jù)到內(nèi)存,相當(dāng)于間接地從一個(gè)進(jìn)程拷貝到另一個(gè)進(jìn)程,這需要花費(fèi)時(shí)間。
(3)信號(hào)量通信共享內(nèi)存最大的問(wèn)題就是多進(jìn)程競(jìng)爭(zhēng)內(nèi)存的問(wèn)題,就像類似于線程安全問(wèn)題。我們可以使用信號(hào)量來(lái)解決這個(gè)問(wèn)題。信號(hào)量的本質(zhì)就是一個(gè)計(jì)數(shù)器,用來(lái)實(shí)現(xiàn)進(jìn)程之間的互斥與同步。例如信號(hào)量的初始值是 1,然后 a 進(jìn)程來(lái)訪問(wèn)內(nèi)存1的時(shí)候,我們就把信號(hào)量的值設(shè)為 0,然后進(jìn)程b 也要來(lái)訪問(wèn)內(nèi)存1的時(shí)候,看到信號(hào)量的值為 0 就知道已經(jīng)有進(jìn)程在訪問(wèn)內(nèi)存1了,這個(gè)時(shí)候進(jìn)程 b 就會(huì)訪問(wèn)不了內(nèi)存1。所以說(shuō),信號(hào)量也是進(jìn)程之間的一種通信方式。
(4)信號(hào)通信信號(hào)(Signals )是Unix系統(tǒng)中使用的最古老的進(jìn)程間通信的方法之一。操作系統(tǒng)通過(guò)信號(hào)來(lái)通知進(jìn)程系統(tǒng)中發(fā)生了某種預(yù)先規(guī)定好的事件(一組事件中的一個(gè)),它也是用戶進(jìn)程之間通信和同步的一種原始機(jī)制。
(5)共享內(nèi)存通信共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)(使多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間)。共享內(nèi)存是最快的 IPC 方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。
(6)套接字通信上面說(shuō)的共享內(nèi)存、管道、信號(hào)量、消息隊(duì)列,他們都是多個(gè)進(jìn)程在一臺(tái)主機(jī)之間的通信,那兩個(gè)相隔幾千里的進(jìn)程能夠進(jìn)行通信嗎?答是必須的,這個(gè)時(shí)候 Socket 這家伙就派上用場(chǎng)了,例如我們平時(shí)通過(guò)瀏覽器發(fā)起一個(gè) http 請(qǐng)求,然后服務(wù)器給你返回對(duì)應(yīng)的數(shù)據(jù),這種就是采用 Socket 的通信方式了。