記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

準備面試的過程中,可能由於時間比較緊,市面上大量的面經撲面而來,面經確實可在兵荒馬亂之時有用武之地,不過是短暫的,下面給大家分享下程序間的幾種通訊方式。

1 管道

學習軟體工程規範的時候,我們知道瀑布模型,在整個專案開發過程分為多個階段,上一階段的輸出作為下一階段的輸入。各個階段的具體內容如下圖所示

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

最初我們在學習Linux基本命令使用的時候,我們經常透過多個命令的組合來完成我們的需求。比如說我們想知道如何檢視程序或者埠是否在使用,會使用下面的這條命令

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

這裡的“|”實際上就是管道的意思。“|”前面部分作為“|”後面的輸入,很明顯是單向的傳輸,這樣的管道我們叫做“匿名管道”,自行建立和銷燬。既然有匿名管道,應該就有帶名字的管道“命名管道”。如果你想雙向傳輸,可以考慮使用兩個管道拼接即可。

建立命名管道的方式

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

test即為管道的名稱,在Linux中一切皆檔案,管道也是以檔案的方式存在,咋們可以使用ls -l 檢視下檔案的屬性,它會“p”標識。

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

下面我們向管道寫入內容

echo “666” > test

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

此時按道理來說咋們已經將內容寫入了test,沒有直接輸出是因為我們需要開啟另一個終端進行輸出(可以理解為暫存管道)

cat < test

ok,我們發現管道內容被讀出來,同時echo退出。那麼管道這種通訊方式有什麼缺點?我們知道瀑布模型的軟體開發模式是非常低下的,同理採用管道進行通訊的效率也很低,因為假設現在有AB兩個程序,A程序將資料寫入管道,B程序需要等待A程序將資訊寫完以後才能讀出來,所以這種方案不適合頻繁的通訊。那優點是什麼?

最明顯的優點就是簡單,我們平時經常使用以致於都不知道這是管道。鑑於上面的缺點,我們怎麼去彌補呢?接著往下看

2 訊息佇列

管道通訊屬於一股腦的輸入,能不能稍微溫柔點有規矩點的傳送訊息?

答:可以的。訊息佇列在傳送資料的時候,按照一個個獨立單元(訊息體)進行傳送,其中每個訊息體規定大小塊,同時傳送方和接收方約定好訊息型別或者正文的格式。

在管道中,其大小受限且只能承載無格式位元組流的方式,而訊息佇列允許不同程序以訊息佇列的形式傳送給任意的程序。

但是當傳送到訊息佇列的資料太大,需要複製的時間也就越多,所以還有其他的方式?繼續看

3 共享記憶體

使用訊息佇列可以達到不錯的效果,但是如果我們兩個部門需要交換比較大的資料的時候,一發一收還是不能及時的感知資料。能不能更好的辦法,雙方能很快的分享內容資料,答:有的,共享記憶體

我們知道每個程序都有自己的虛擬記憶體空間,不同的程序對映到不同的物理記憶體空間。那麼我們可不可以申請一塊虛擬地址空間,不同程序透過這塊虛擬地址空間對映到相同的屋裡地址空間呢?這樣不同程序就可以及時的感知程序都幹了啥,就不需要再複製來複製去。

我們可以透過shmget建立一份共享記憶體,並可以透過ipcs命令檢視我們建立的共享記憶體。此時如果一個程序需要訪問這段記憶體,需要將這個記憶體載入到自己虛擬地址空間的一個位置,讓核心給它一個合法地址。使用完畢接觸板頂並刪除記憶體物件。

那麼問題來了,這麼多程序都共享這塊記憶體,如果同時都往裡面寫內容,難免會出現衝突的現象,比如A程序寫了數字5,B程序同樣的地址寫了6就直接給覆蓋了,這樣就不友好了,怎麼辦?繼續往下看

4 訊號量

為了防止衝突,我們得有個約束或者說一種保護機制。使得同一份共享的資源只能一個程序使用,這裡就出現了訊號量機制。

訊號量實際上是一個計數器,這裡需要注意下,訊號量主要實現程序之間的同步和互斥,而不是儲存通訊內容。

訊號量定義了兩種操作,p操作和v操作,p操作為申請資源,會將數值減去M,表示這部分被他使用了,其他程序暫時不能用。v操作是歸還資源操作,告知歸還了資源可以用這部分。

5 訊號

從管道——訊息佇列-共享記憶體/訊號量,有需要等待的管道機制,共享記憶體空間的程序通訊方式,還有一種特殊的方式——訊號

我們或許聽說過運維或者部分開發需要7 * 24小時值守(專案需要上線的時候),當然也有各種監管,告警系統,一旦出現系統資源緊張等問題就會告知開發或運維人員,對應到作業系統中,這就是訊號。

在作業系統中,不同訊號用不同的值表示,每個訊號設定相應的函式,一旦程序傳送某一個訊號給另一個程序,另一程序將執行相應的函式進行處理。也就是說先把可能出現的異常等問題準備好,一旦訊號產生就執行相應的邏輯即可。

6 套接字

上面的幾種方式都是單機情況下多個程序的通訊方式,如果我想和相隔幾千裡的小姐姐通訊怎麼辦?

這就需要套接字socket了。其實這玩意隨處可見,我們平時的聊天,我們天天請求瀏覽器給予的響應等,都是這老鐵。

7 總結

分享了一下幾種程序間通訊方式,希望大家能知其然並知其所以然,機械式的記憶容易忘記哦。

管道

訊息佇列

共享記憶體

訊號量

訊號

套接字

所有私藏資料我都貢獻出來了!!

我寫了一套 5000 頁的 Java 學習手冊,以及珍藏四本 Java 人必讀4大神器,分享到知乎已經 3 萬讚了!

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

整個資料包內容專注Java技術,包括:

Java概述,基本語法,陣列;

面向物件,多型,介面,異常;

集合框架,IO流,多執行緒,企業級框架,HTML;

資料庫,spring,Java web,專案實戰;

GitHub,IDEA,演算法,面試題等相關內容。。。

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

如果你想獲得完整PDF可以透過以下方式獲得:

(Java基礎精選影片)

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

記一次阿里面試題:都有哪些程序間通訊方式?麻煩你不要再背了

資料獲取方式:

轉發加關注後臺私信電子書 免費獲取!