Linux下程序間通訊之共享記憶體

2021-07-22 13:59:12 字數 1179 閱讀 8316

共享記憶體是程序間通訊的一種方式,顧名思義,共享記憶體就是兩個或多個程序共享一塊記憶體。

共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,如果某個程序向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程序。

但要特別注意的是共享記憶體並未提供同步機制。也就是說,在第乙個程序結束對共享記憶體的操作之前,並沒有自動機制可以阻止第二個程序開始對它進行讀取。所以通常需要使用其它的機制來同步對共享記憶體的訪問,比如訊號量。

那麼,共享記憶體是怎麼實現的呢?

如圖,兩個不同的程序通過pcb的頁表+mmu的方式來對映到同一塊物理空間。通過共享記憶體實現程序間通訊是最快的,對比其它的程序間通訊機制,都是程序1將資料寫到公共資源上,程序2去讀,這裡面就包含了兩次拷貝,第一次將資料從使用者空間拷貝到核心,第二次將資料從核心拷貝到使用者空間。而共享記憶體機制中程序1將資料寫到共享記憶體,然後無需任何拷貝,程序2可以直接訪問這部分資料,所以節省了兩次拷貝的時間。

說下實現共享記憶體需要用到的幾個函式,

1、共享記憶體的建立和獲取

size指定共享記憶體大小,最好設定為4096的整數倍,因為作業系統以頁為基本單位來分配共享記憶體。

2、共享記憶體的銷毀

cmd傳ipc_rmid,buf設為null即可。

3、掛接與去掛接

其中:

shmid是shmget返回的共享記憶體物件的引用識別符號;

shmaddr用來指定該共享記憶體區域在程序的虛擬位址空間對應的虛擬位址,但一般不自己指定,因為你不知道**合適,所以設為null即可。

shm***是對映標誌,shm***預設為0.

Ubuntu下Linux程序間通訊 共享記憶體

linux提供了多種程序間通訊的方法,常見有管道 匿名 fifo 有名管道 訊息佇列 訊號量 共享記憶體,socket通訊。linux程序間通訊 匿名管道 linux程序間通訊 fifo 有名管道 linux程序間通訊 訊息佇列 linux程序間通訊 訊號量 linux程序間通訊 共享記憶體 5.共...

Linux高階程式設計基礎 程序間通訊之共享記憶體

建立共享記憶體,寫程序每隔2秒向記憶體寫入一次 hello world 如果結束寫操作,則寫程序寫入 end 讀程序從共享記憶體讀取資料,並列印。直到讀到 end 為止。這是寫程序 include include include include include include include inc...

Linux下程序間通訊 共享記憶體

接下來總結程序間通訊的另外一種方式 共享記憶體。1 概念 共享記憶體是一種最為高效的程序間通訊方式,指兩個或多個程序共享乙個給定的儲存區。它通過核心物件將程序中的虛擬位址對映到相同的物理記憶體上,因此系統分配共享記憶體是按照 頁 為單位。2 特點 共享記憶體是最快的一種 ipc,因為程序是直接對記憶...