行程間通信
- 1 行程間通信的介紹
- 1.1 行程間通信的目的
- 1.2 行程間通信的本質
- 1.3 行程間通信的主要方式
- 2 管道(重點)
- 2.1 什么是管道
- 2.2 匿名管道
- 2.3 命名管道
- 2.3.1 命名管道的概念
- 2.3.2 命名管道的創建方式
- 2.3.3 命名管道和匿名管道的區別
- 2.3.4 命名管道的打開規則
- 2.3.5 用命名管道模擬實作服務器和客戶端的通信
- 3 共享記憶體
- 3.1 共享記憶體介紹
- 4 行程互斥
1 行程間通信的介紹
1.1 行程間通信的目的
- 資料傳輸:一個行程需要將它的資料發送給另一個行程
- 資源共享:多個行程之間共享同樣的資源,
- 通知事件:一個行程需要向另一個或一組行程發送訊息,通知它(它們)發生了某種事件(如行程終止時要通知父行程),
- 行程控制:有些行程希望完全控制另一個行程的執行(如Debug行程),此時控制行程希望能夠攔截另一個行程的所有陷入和例外,并能夠及時知道它的狀態改變,
1.2 行程間通信的本質
多個行程間共享資源
1.3 行程間通信的主要方式
管道
- 我們把從一個行程連接到另一個行程的一個資料流稱為一個“管道”
共享記憶體
- 共享記憶體是最快的IPC(行程間通信)形式,
2 管道(重點)
2.1 什么是管道
- 管道是Unix中最古老的行程間通信的形式,
- 我們把從一個行程連接到另一個行程的一個資料流稱為一個“管道”
2.2 匿名管道
介面介紹

引數說明
功能:創建一匿名管道
fildes[2] : 檔案描述符陣列,fd[0] 代表讀端,fd[1] 代表寫端
回傳值:成功回傳0,失敗回傳錯誤代碼
代碼示例:創建匿名管道和父子行程,子行程負責寫資料,父行程負責讀資料


匿名管道的幾個特性
- 如果寫端行程(上面代碼中是子行程),不不管檔案描述符且不寫入或者樹寫入的速度沒有讀端快,讀端行程要被阻塞,讀端行程狀態從 R+ 到 S+
- 當寫入行程進入資料到管道時候,如果此時管道資料已經滿了,即寫入條件不滿足則寫端行程需要阻塞,
- 如果寫端行程關閉了檔案描述符 fd ,則讀端會讀到檔案的末尾讀到 0 值 ,
- 如果讀端行程關閉檔案描述符 fd ,寫端行程會被 OS 系統發 SIGFIPE 信號干掉,上面的代碼子行程就成了僵尸行程,需要父行程等待并回收子行程資源,以避免記憶體泄露,
- 匿名管道只能用于具有共同祖先的行程(具有親緣關系的行程)之間的通信,通常一個管道由一個行程創建,然后該行程呼叫fork,此后父、子行程之間就可應用該管道,因為親緣關系會行程管道檔案資訊,
- 管道提供流式服務
- 一般而言,行程退出,管道釋放,所以管道的生命周期隨行程
- 一般而言,內核會對管道操作進行同步與互斥
- 管道是半雙工的,資料只能向一個方向流動;需要雙方通信時,需要建立起兩個管道
2.3 命名管道
2.3.1 命名管道的概念
- 匿名管道是半雙工的,資料只能向一個方向流動;需要雙方通信時,需要建立起兩個管道
- 如果我們想在不相關的行程之間交換資料,可以使用FIFO檔案來做這項作業,它經常被稱為命名管道,
- 命名管道是一種特殊型別的檔案
2.3.2 命名管道的創建方式
1、在命令列上創建命名管道

實作


2、命名管道還可以從程式中創建

2.3.3 命名管道和匿名管道的區別
- 匿名管道由 pipe 函式創建并打開
- 命名管道由 mkfifo 函式創建,打開用 open
- FIFO (命名管道) 與 pipe (匿名管道) 之間唯一的區別在于它們創建與打開的方式不同,一旦這些作業完成后,它們具有相同的語意,
2.3.4 命名管道的打開規則
- 如果當前打開操作是為了讀而打開 FIFO 時,阻塞當前行程直到有相應行程為寫而打開該 FIFO
- 如果當前打開操作是為寫而打開 FIFO 時,阻塞當前行程直到有相應行程為讀而打開該 FIFO
2.3.5 用命名管道模擬實作服務器和客戶端的通信
服務端(寫端)


客戶端(讀端)

3 共享記憶體
3.1 共享記憶體介紹
共享記憶體區是最快的IPC形式,一旦這樣的記憶體映射到共享它的行程的地址空間,這些行程間資料傳遞不再涉及到內核,換句話說是行程不再通過執行進入內核的系統呼叫來傳遞彼此的資料
共享記憶體示意圖

共享記憶體在 Linux 內核源代碼中,描述其的資料結構


創建共享記憶體的介面




4 行程互斥
- 由于各行程要求共享資源,而且有些資源需要互斥使用,因此各行程間競爭使用這些資源,行程的這種關系為行程的互斥,
- 系統中某些資源一次只允許一個行程使用,稱這樣的資源為臨界資源或者互斥資源,
- 在行程中涉及到互斥資源的程式段叫臨界區
- IPC 資源必須洗掉,否則不會自動清除,除非重啟,所以 system V IPC 資源生命周期隨內核
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/273269.html
標籤:其他
