共享記憶體是最快的一種ipc
使得a程序和b程序都能通過虛擬位址對映到同一塊物理空間上。
區域既屬於a程序又屬於b程序。兩個程序共享同一塊空間。兩個指標訪問同一塊記憶體,不需要切換核心態,不需要經過作業系統。
1、 共享記憶體一旦使得程序對映到此共享記憶體區域,不需要使用者態切換成核心態。
2、 共享記憶體相比較於其他通訊方式,會少兩次資料的拷貝。
共享記憶體實現:
(1) 建立或者獲取
int shmget((key_t)key,int sharedsize,int flag);
失敗返回-1
(2) 將程序中虛擬位址對映到共享記憶體區域
void* shmat(int shmid,void* addr,int flag);
失敗返回null
(3) 斷開連線
int shmdt(void* addr);
(4) 刪除核心物件
int shmctl(int shmid,int cmd,struct shmid_ds* buf);
成功返回0,失敗返回-1
實現:a程序接收使用者輸入,b程序將使用者輸入全部轉為小寫。
程序間通訊的總結:
將程序間通訊分為兩類:第一類訊號&訊號量,不發資料只是通知,第二類,管道、訊息佇列用於傳送資料。
有名管道:通過管道檔案來完成多程序間通訊,一般用於兩個程序間通訊
無名管道:借助於fork開啟的同乙個檔案描述符,只能用於父子兩個程序之間。
訊息佇列:傳送帶有型別的資料,可以真正實現多程序。
共享記憶體:使得兩個程序間共享同一塊物理記憶體,實現資料傳遞,但是必須使用訊號量控制程序同步。共享記憶體是最快的一種ipc
訊號量:完成程序同步控制,用於多程序訪問同一臨界資源。
訊號:完成程序間訊息通知。
Linux程序間通訊 共享記憶體
共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...
Linux程序間共享記憶體通訊
使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...
Linux程序間通訊 共享記憶體
之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...