您當前的位置:首頁 > 體育

程序間的通訊方式:簡介

作者:由 圍城 發表于 體育時間:2018-06-08

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)。名字空間非常重要,因為對於除管道以外的所有形式來說,名字是客戶與伺服器彼此連線以交換資訊的手段。

標簽: 程序  IPC  核心  共享記憶體  物件