进程间的通信方式:简介
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)。名字空間非常重要,因為對于除管道以外的所有形式來說,名字是客戶與服務器彼此連接以交換信息的手段。
?
總結
以上是生活随笔為你收集整理的进程间的通信方式:简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程间的通信方式(一):共享内存
- 下一篇: 进程间的通信方式(二):管道Pipe和命