1.原理:
系統在實體地址空間上開闢一塊用於存放共享資料的資料區,然後程序在其虛擬位址空間上開闢一塊共享記憶體資料區,通過頁表對映到實體地址的共享記憶體資料區,當不同的程序都對映到實體地址空間上的共享記憶體資料區時,這兩個程序就可以直接從該共享記憶體拿取資料,不再通過核心的系統呼叫傳遞資料,實現程序間通訊的目的。
注:由於共享記憶體不再通過系統呼叫傳遞資料,也就 節約了資料從使用者到核心,再由核心到使用者時的時間成本,所以,共享記憶體被稱為最快的ipc方式!
2.建立共享記憶體*
int shmget(key_t key, size_t size, int shm***);
key:該共享記憶體的識別符號(名字)
size:該共享記憶體的大小(單位:byte)
shm***:標誌位 (ipc_creat|0644)
成功返回該共享記憶體的標識碼(操作控制代碼),失敗返回-1
3.將共享記憶體對映到虛擬位址空間上
void shmat(int shmid, const void shmaddr, int shm***);
shmid:共享記憶體的操作控制代碼
shmaddr:對映到虛擬位址空間上的共享記憶體片段的起始位址,一般設定為null,表示由作業系統隨機分配
shm***:標誌位,shm_ronly:表示只對共享記憶體進行讀操作
shm_rnd:表示 round attach address to shmlba boundary
成功返回虛擬位址空間上指向共享記憶體段的指標
失敗返回-1
注:shmaddr若不為空,再看shm***是否為shm_rnd
是:則表示將shmaddr作為虛擬位址中對映共享記憶體段的起始位置
否:表示會自動將起始位址附加到shmlba邊界
共享記憶體圖析:
關於虛擬位址空間的內容,大家可以參考:
4.將共享記憶體從虛擬位址空間上脫離
int shmdt(const void shmaddr);*
shmaddr:虛擬空間中對映共享記憶體段的起始位置
成功返回0,失敗返回-1
5.刪除共享記憶體
*int shmctl(int shmid, int cmd, struct shmid_ds buf);
shmid:該共享記憶體的操作控制代碼
cmd:該共享記憶體將要執行的動作(ipc_rmid用於刪除)
buf:用於獲取該共享記憶體的資訊的資料結構
成功返回0,失敗返回-1
刪除共享記憶體資源實質,圖析:
首先執行兩個程序:
圖析:
關於該部落格中的**,大家可以在碼雲檢視:
6.共享記憶體的命令操作
ipcs -m: 檢視該系統中的共享記憶體
ipcrm -m +shmid:刪除shmid共享記憶體資源
ipcrm -m +key:刪除key共享記憶體資源
注:共享記憶體的操作沒有進行同步與互斥
關於其他程序間通訊方式,大家可以檢視我的其他文章:
管道:
訊息佇列:
程序間通訊 共享記憶體
下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...
程序間通訊 共享記憶體
共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...
程序間通訊 共享記憶體
共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...