程序間通訊方式小結
阿新 • • 發佈:2022-01-06
程序間的通訊方式,說白話 就是兩個程序間的資料如何傳輸的?
1.管道pipe(無名管道)
看一條常見linux命令 ps -ef | grep java
其中中間的這條 “ | ” 就是管道,
上述這條命令由兩部分構成可以看作是兩個程序 ps和grep,ps 得到的結果通過管道傳遞給 grep
優點:簡單簡潔
缺點:只能單向傳輸,只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。
2.有名管道
命令: mkfifo myPipe // 我們手動建立一個名為"myPipe" 的管道
echo"thisisapipe">myPipe //echo程序向其中寫資料myPipe
cat< myPipe // cat程序讀出管道中資料
有名管道類似於一種快取, 它允許無親緣關係程序間的通訊。
3.訊息佇列
A程序要給B程序傳送訊息
A將訊息寫至訊息佇列,B從訊息佇列讀訊息
缺點:原理就是從A的記憶體拷貝到訊息佇列,再從訊息佇列拷貝到B的記憶體空間。拷貝消耗效能
4.共享記憶體
A程序與B程序通過共享記憶體的方式實現資料互動
共享記憶體的原理也就是通過二者的虛擬記憶體指向同一塊實體記憶體
虛擬記憶體可以參考這篇虛擬記憶體與Linux層級結構
缺點:多個程序共享記憶體可能會出現併發安全問題
5.訊號量
訊號量的本質就是一個計數器,用來實現程序之間的互斥與同步。
訊號量本身不是一種訊息傳送的方式,而是作為共享記憶體的併發解決辦法
可以把訊號量看作是一把鎖,初始值為1
當有程序訪問時,設定為0,其他程序通過判斷訊號量二實現序列化訪問記憶體,也就解決併發問題了
6.Socket
Socket套解字也是一種程序間通訊機制,代表不同機器間的程序通訊方式