詳解程序之間的通訊方式
一、管道
管道類似於一種特殊的檔案(並不是),它存在於記憶體中,程序可以對它進行讀寫,它提供流控制,保證程序的正確讀寫,即管道為空時讀程序會阻塞,管道為滿時寫程序會阻塞,以此實現程序之間的通訊。
管道有三種:1.普通管道(無名管道、也常直接稱管道) 2.流管道 3.命名管道(FIFO)
- 普通管道
它是半雙工的,即只能單向傳輸。
它是有程序關係限制的,只能在父子程序之間使用。
- 流管道
相對於普通管道而言,它不止是單向傳輸,可以雙向傳輸。
- 命名管道(FIFO):
相對於普通管道而言,它沒有程序關係限制,可以在無關程序之間進行資料交換。
二、訊息佇列
類似於用連結串列的結構儲存訊息。
它相比於管道,不止只能傳輸位元組流,也沒有緩衝區大小的限制。
它獨立於程序存在,程序終止時,訊息佇列及其內容並不會被刪除。
它實現了訊息的隨機讀取。
三、套接字(socket)
與其它通訊機制不同是,套接字可用於不同機器間的程序通訊,即可用於網路之間的程序通訊。
四、訊號量
訊號量用於實現程序間的互斥與同步,而不是用於儲存程序間通訊資料。它是一個計數器,用來控制多個程序對共享資源的訪問,常作為一種鎖機制,實現程序間的同步和互斥。(JUC的Semaphore的設計思想來源吧)
五、共享記憶體
即多個程序共享某塊記憶體,共享記憶體是通訊方式中最快的一種。
作業系統建立一塊共享記憶體,並將其對映到參與通訊的每個程序的地址空間上,程序就可以直接對這塊共享記憶體進行讀寫。
那麼,共享記憶體這種方式為什麼是最快的呢?
這是因為共享記憶體的整個通訊過程對訊息的複製只有兩次。
1.從資料來源複製到共享記憶體
2.從共享記憶體複製到資料目的地
而管道、訊息佇列等方式對訊息的複製需要四次,因為有緩衝區的存在,讀寫都要經過緩衝區。