進程間的通信方式:簡介

進程間的通信方式:簡介

來自專欄 RDMA4 人贊了文章

1.概述

IPC就是進程間通信(interprocess communication)的簡稱。傳統上該術語描述的是運行在某個操作系統之上的不同進程間的消息傳遞(message passing)的方式。

為什麼需要進程間通信呢?因為有些複雜程序或者是系統需要多個進程或者線程共同完成某個具體的任務,那麼也就需要進程之間通信和數據訪問。整個系統以進程粒度運行可以進一步提高系統整體並行性能和內存訪問安全,每個進程可以有各自的分工。所以多個進程共同完成一個大的系統是比單個進程多線程要有很大的優勢。

在Unix操作系統過去30年的演變史中,消息傳遞經歷了如下幾個發展階段。

  • 管道:是第一個廣泛使用的IPC形式,既可以在程序中使用,也可以在shell中使用。管道存在的問題在於他們只能在具有共同祖先(指父子進程之間)的進程間使用,不過該問題已經被有名管道(named pipe)即FIFO消息隊列解決了。
  • System V消息隊列(System V message queue):是在20世紀80年代早期加到System V內核中的。他們可以在同一台主機上有親緣關係或者無親緣關係的進程之間使用。儘管稱呼他們時仍以冠以「System V」前綴,當今多數版本的Unix不論自己是否源自System V都支持他們
  • Posix消息隊列是有Posix實時標準加入的。它們可以用在同一台主機上有親緣關係和無親緣關係的進程之前使用。
  • 遠程過程調用(Remote Procedure Call)出現在20世紀80年代中期,它是從一個系統(客戶主機)是某個程序調用另一個系統(伺服器主機)上某個函數的一種方法,是作為顯示網路編程的一種替換方法開發的。既然客戶端與伺服器之間通常傳遞一些信息(被調用函數的參數和返回值),而且RPC可以用在同一主機上的客戶和伺服器之間,因此可以認為RPC是另一種形式的消息傳遞

2.進程、線程與信息共享

按照傳統的Unix編程模型,我們在一個系統上運行多個進程,每個進程都有各自的地址空間。Unix進程間的信息共享可以有多種方式。如下圖總結所示:

(1)左邊的兩個進程共享存留與文件系統中某個文件的信息。為訪問這些信息,每個進程都得穿過內核(例如read、write、lseek)。當一個文件有待更新的時候,某種形式的同步是有必須要的,這樣可以防止多個進程或者線程並發的寫入,防止相互串擾,也可以保護一個或者讀個讀出者。如果Posix、消息隊列、信號量和共享內存區域是使用映射文件實現的(不是必須條件),那麼他們就是這種共享存留與文件系統的某個信息。

(2)中間兩個進程共享駐留於內核中的某些信息。管道是這種共享類型的例子,SystemV 消息隊列和System V信號量也是。現在訪問共享信息的每次操作涉及對內核的一次系統調用。

(3)右邊的兩個進程有一個雙方都能訪問的共享內存區域。每個進程一旦設置好該共享內存區域,就能夠根本不干涉及內核而訪問其中的數據。共享內存區域的進程需要某種形式進行同步。

線程:

從IPC角度來看,一個給定的進程內所有的線程共享相同的全局變數(也就是說共享內存的概念對這種模型來說是內在的)。然而我們必須關注的是各個線程間對全局數據的同步訪問。同步訪問儘管不是一種明確的IPC的形式,但它確實伴隨許多形式的IPC使用,以控制對某些共享數據的訪問。

3.IPC對象的持續性

我們可以把任意類型的IPC持續性(persistence)定義成該類型的一個對象一直存在多長時間。下圖展示了三種類型的持續性:

(1)隨進程持續的(process-persistent)IPC對象一直存在到打開著該對象的最後一個進程關閉該對象為止。例如管道和FIFO就是這種對象。

(2)隨內核持續的(kernel-persistent)IPC對象一直存在到內核重新自舉或顯示刪除該對象為止。例如System V的消息隊列、信號量和共享內存去就是此類型對象。Posix消息隊列、信號量和共享內存去必須至少是隨內核持續的,但是也可以隨文件系統持續的,具體取決於實現。

(3)隨文件系統持續的(filesystem-persistent)IPC獨顯一直存在到顯示刪除該對象為止。即使內核重新自舉了,該對象還是保持其值。Posix消息隊列、信號量和共享內存區域如果是使用映射文件實現的(不是必需條件),那麼它們就是隨文件系統持續的。

在定義一個IPC對象 的持續性時我們必須要小心,因為他們並不是像看起來的那樣。例如管道內的數據是在內核中維護的,但管道具備的隨進程的持續性而不是隨內核的持續性;最後一個將某個管道打開著用於讀的進程關閉管道後,內核將所有的數據並刪除該管道。類似的,儘管FIFO在文件系統中有名字,他們也只是具備隨進程的特性,因為最後一個將某個FIOF打開的進程關閉FIOF,FIOF中的數據都將丟失。

4.名字空間

當某個或者多個無親緣關係的進程使用某種類型的IPC對象來彼此交換信息時,該IPC對象必須有一個某種形式的名字(name)或標識符(identifier),這樣其中一個進程(往往是伺服器)可以創建IPC對象,其餘進程則可以指定同一個IPC對象。

管道沒有名字(因此不能用於無親緣關係的進程間),但是FIFO有一個在文件系統中的Unix路徑名字作為其標識符(因此可用於無親緣關係的進程間)。對於一個給定的iPC類型,其可能的名字的集合稱為它的名字空間(name space)。名字空間非常重要,因為對於除管道以外的所有形式來說,名字是客戶與伺服器彼此連接以交換信息的手段。


推薦閱讀:

二維碼門禁單門控制器實現同時兩個鎖開門
西遊記中最不適合做老婆的女人(附:唐僧與孫悟空以及孫悟空與白骨精通信)
基於Python的串口通信(1)
中興主要經營活動已無法進行 網傳中興將出售自有手機業務
量子通信見證中國高端製造業轉型升級

TAG:通信 | 計算機科學 | 計算機網路 |