下麵簡單的總結一下,自己對進程間通信的理解。首先,要意識到一點:各進程間擁有相互獨立的地址空間,所以進程間無法在用戶態完成通信,必須要藉助操作系統,也就是內核態來完成相應的操作。 內核態和用戶態 由上圖可知,系統分為內核態和用戶態,其中內核態包括內核,用戶態主要指應用程式。內核控制了電腦的軟體和硬 ...
下麵簡單的總結一下,自己對進程間通信的理解。首先,要意識到一點:各進程間擁有相互獨立的地址空間,所以進程間無法在用戶態完成通信,必須要藉助操作系統,也就是內核態來完成相應的操作。
- 內核態和用戶態
由上圖可知,系統分為內核態和用戶態,其中內核態包括內核,用戶態主要指應用程式。內核控制了電腦的軟體和硬體資源,為了便於應用程式也能使用由硬體提供的相關功能,操作系統提供了系統調用、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