下面簡單的總結一下,自己對行程間通信的理解,首先,要意識到一點:各行程間擁有相互獨立的地址空間,所以行程間無法在用戶態完成通信,必須要借助作業系統,也就是內核態來完成相應的操作,
- 內核態和用戶態

由上圖可知,系統分為內核態和用戶態,其中內核態包括內核,用戶態主要指應用程式,內核控制了計算機的軟體和硬體資源,為了便于應用程式也能使用由硬體提供的相關功能,作業系統提供了系統呼叫、shell(基于系統呼叫)和公用函式庫(基于系統呼叫),
- 行程間地址相互獨立
各行程擁有相互獨立的地址空間,彼此相互隔離,符合行程“作業系統資源分配最小單位”的地位,行程間相互獨立的地址空間依賴MMU實作,Linux在操作記憶體的時候,首先由MMU查詢頁表,如果該地址上映射了實際的物理記憶體,就會換算成實際的物理地址;而由內核管理的這種虛實映射,是不可能將其它行程使用的物理記憶體,映射到本行程的虛擬地址上的,這樣就實作了記憶體空間的隔離,
- 行程間通信
1)信號
一個行程可以通過kill函式向其他行程發送信號,其他行程可以在之前通過sigaction函式為對應的信號注冊相關的函式操作,
2)信號量
我覺得信號量其實就是一個鎖,負責對臨界資源提供保護,一般和共享記憶體配合使用,主要是兩個操作P和V,其中P操作負責申請臨界資源,申請成功就將臨界資源總數減一;V操作負責釋放臨界資源,釋放成功就將臨界資源總數加一,
3)共享記憶體
共享記憶體是在內核態實作的,依靠系統呼叫,多個行程可以將同一塊虛擬記憶體映射到本行程對應的虛擬地址空間中,共享記憶體
4)Socket
Socket一般用于不同的計算機上不同行程之間進行通信,但也支持本機內的行程間通信,服務端:socket、bind、listen、accept;客戶端:socket、connect,
5)訊息佇列
借助內核提供的訊息佇列結構,行程之間可以進行通信,異步通信,
6)命名管道
命名管道和訊息佇列類似也能用于不相關的兩行程間進行通信,
補充:
- 訊息佇列是異步通信嗎?
答:訊息佇列屬于異步通信,用途很多,主要有解耦、異步和削峰,
解耦:類似于簡單工廠模式,解耦了訂單系統和其他系統之間耦合性過高的問題,如下圖,

異步:顧名思義,通過異步可以提高并行性,減少系統的處理時間,
削峰:通過訊息佇列為系統提供了一層保護,防止業務量過大,跑死系統,

- 共享記憶體為何是效率最高的行程間通信方式?
答:可以這樣理解,假如行程1需要將檔案1中的內容發送給行程2,行程2再將收到的內容寫到檔案2中,
使用管道、訊息佇列:
A) 使用read函式,將檔案1中的資料復制到行程1的臨時緩沖區中,
B) 將行程1臨時緩沖區中的資料復制到管道或訊息佇列中,
C) 行程2從管道或訊息佇列中將資料復制到自己的緩沖區中,
D) 行程2將緩沖區中的資料寫入到檔案2中,

使用共享記憶體:
A) 行程1從檔案1中將資料讀入到共享記憶體中,
B) 行程2將共享記憶體中的資料寫入到檔案2中,

參考文獻:
- 怎樣去理解Linux用戶態和內核態?https://zhuanlan.zhihu.com/p/69554144
- linux之用戶態和內核態https://www.cnblogs.com/cyyz-le/p/10962818.html
- [MQ]什么是訊息佇列? https://blog.csdn.net/shimazhuge/article/details/93372303
- 【作業系統】 為什么說共享記憶體是最快的一種IPC方式呢?https://blog.csdn.net/LU_ZHAO/article/details/105237107
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/20622.html
標籤:Linux
上一篇:Jenkins插件的安裝、插件依賴關系及插件版本迭代
下一篇:Linux重定向用法詳解
