1. 概述
2. 進程、線程與信息共享
Unix進程間的信息共享有多種方式:注意下圖中內核的位置
web
- 左邊的兩個進程共享存留於文件系統中某個文件上的某些信息。爲訪問這些信息,每一個進程都得穿越內核。
- 中間的兩個進程共享存留於內核中的某些信息。管道、System V消息隊列和System V信號量都是這種共享類型。
- 右邊的兩個進程有一個雙方都能訪問的共享內存區。每一個進程一旦設置好該共享內存區,就能根本不涉及內核而訪問其中的數據。
- 注意:以上的IPC技術能夠做用於任意數目的進程
線程
- 多個進程間的IPC、單個進程中多個線程的IPC
- 從IPC角度來看,一個給定進程內的全部線程共享共享的全局變量(也就是說共享內存區的概念對這種模型來講是內置的)。
- 然而咱們必須關注的是各個線程間對全局數據的同步訪問。
- 同步儘管不是一種明確的IPC形式,但它確實伴隨許多形式的IPC使用,以控制對某些共享數據的訪問。
3. IPC對象的持續性
- 下圖展現了三種類型的持續性:決定了IPC對象存在時間的長短
- 一、隨進程持續的IPC對象一直存在到打開該對象的最後一個進程關閉該對象爲止。如管道、FIFO
- 二、隨內核持續的IPC對象一直存在到內核從新自舉或顯式刪除該對象爲止。如System V的消息隊列、信號量和共享內存區。Posix的消息隊列、信號量和共享內存區則必須至少是隨內核持續的,但也能夠是隨文件系統持續的,取決於實現。
- 三、隨文件系統持續的IPC對象一直存在到顯式刪除該對象爲止。即便內核從新自舉了,該對象仍是保持其值。Posix消息隊列、信號量和共享內存區若是是使用映射文件實現的,那麼它們就是隨文件系統持續的。
多數形式的IPC並無在系統從新自舉後繼續存在的打算,由於進程不可能跨越從新自舉繼續存活。另外,要求它具有隨文件系統的持續性可能會下降其性能,而IPC的一個基本設計目標就是高性能。服務器
4. 名字空間
5. fork、exec、exit對IPC對象的影響
- 一、考慮到無名同步變量(互斥鎖、條件變量、讀寫鎖、Posix基於內存的信號量),從一個具備多個線程的進程中調用fork將變得混亂不堪。
- 二、System V IPC的三種形式沒有打開或關閉的說法。訪問這三種形式的IPC對象只須要知道其標識符,所以知道該標識符的任何進程都能訪問它們。
6. 書中IPC例子索引表
- 序列號持續增1:一個或多個線程或進程給一個共享的序列號持續增1。該序列號有時在一個共享文件中,有時在共享內存中。
7. 小結
- 4個主要領域:
- 消息傳遞:管道、FIFO、消息隊列
- 同步:互斥鎖、條件變量、讀寫鎖、信號量
- 共享內存區:匿名共享內存區、有名共享內存區
- 過程調用:Solaris門、Sun RPC