細說linux IPC:各種IPC形式比較總結

這個系列基本上到現在為止已經差不多把linux上的各種常用的IPC介紹完了,linux上面的IPC大多都是從UNIX上面繼承而來。

最初Unix IPC包括:管道、FIFO、信號。System V IPC包括:System V消息隊列、System V信號燈、System V共享內存區。由於Unix版本的多樣性,電子電氣工程協會(IEEE)開發了一個獨立的Unix標準,這個新的ANSI Unix標準被稱為計算機環境的可移植性作業系統介面(PSOIX)。

現有大部分Unix和流行版本都是遵循POSIX標準的,而Linux從一開始就遵循POSIX標準。

Posix IPC包括: Posix消息隊列、Posix信號燈、Posix共享內存區。 所以目前linux上面支持的IPC主要包括四類:

  1. UNIX早期IPC:管道、FIFO、信號;
  2. system V IPC:System V消息隊列、System V信號燈、System V共享內存區; ADVERTISEMENT
  3. Posix IPC: Posix消息隊列、Posix信號燈、Posix共享內存區;
  4. 基於socket的IPC;

我們這一系列沒有講述信號燈相關內容,是因為信號燈是進程間以及同一進程不同線程之間的一種同步方式,我們這一系列把精力主要放在進程之間信息的交互上面,而同步與互斥的內容放在另一個系列,這樣更便於知識的細化歸類,各個擊破。其實同步與互斥是進程間通信的一個很重要的內容,所以我們會立即在下一個系列詳細講解同步與互斥的內容。

下面分析一下我們這一系列文章各種IPC的特點:

1. socket

a、使用socket通信的方式實現起來簡單,可以使用網際網路域和UNIX域來實現,使用網際網路域可以實現不同主機之間的進出通信。
b、該方式自身攜帶同步機制,不需要額外的方式來輔助實現同步。
c、隨進程持續。

2. 共享內存

a、最快的一種通信方式,多個進程可同時訪問同一片內存空間,相對其他方式來說具有更少的數據拷貝,效率較高。
b、需要結合信號燈或其他方式來實現多個進程間同步,自身不具備同步機制。
c、隨內核持續,相比於隨進程持續生命力更強。

3. 管道

a、較早的一種通信方式,缺點明顯:只能用於有親緣關係進程之間的通信;只支持單向數據流,如果要雙向通信需要多創建一個管道來實現。
b、自身具備同步機制。
c、隨進程持續。

4. FIFO

a、是有名管道,所以支持沒有親緣關係的進程通信。和共享內存類似,提供一個路徑名字將各個無親緣關係的進程關聯起來。但是也需要創建兩個描述符來實現雙向通信。
b、自身具備同步機制。
c、隨進程持續。

5. 信號

a、這種通信可攜帶的信息極少。不適合需要經常攜帶數據的通信。
b、不具備同步機制,類似於中斷,什麼時候產生信號,進程是不知道的。

6. 消息隊列

a、與共享內存和FIFO類似,使用一個路徑名來實現各個無親緣關係進程之間的通信。消息隊列相比於其他方式有很多優點:它提供有格式的字節流,減少了開發人員的工作量;消息具有類型(system V)或優先級(posix)。其他方式都沒有這些優點。
b、具備同步機制。
c、隨內核持續。

這個系列就這樣完了,時間倉促,做程式設計師的苦逼日子時間就是那麼的有限,分析不是特別深入,淺嘗輒止而已,也難免有所錯誤。期待下一個同步與互斥系列