什麼是共享記憶體?
共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。
注:頁表是一種陣列結構,存放著各個虛擬頁的狀態,是否對映,是否快取. 程序要知道那些記憶體位址上的資料在物理記憶體上,那些不在,還有物理記憶體上的**需要用頁表來記錄. 頁表的每乙個表項分為兩部分,第一部分記錄此頁是否在物理記憶體上,第二部分記錄物理記憶體頁的位址
相關函式
shmget:用來建立共享記憶體
原型: int shmget(key_t key, size_t size, int shm***);
引數: key:是由ftok函式生成,表示共享記憶體段名字
size:共享記憶體的大小
shn***:用法和建立檔案使用的mode模式標誌一樣
返回值:成功返回乙個非負整數,即就是共享記憶體段的標識碼;失敗返回-1
原型:
void *shmat(int shmid, const
void *shmaddr, int shm***);
引數: shmid:共享記憶體標識
shm***:可取shm_rnd和shm_rdonly
返回值:
成功返回乙個指標,指向給共享記憶體的第一位元組,失敗返回-1
shmdt:將共享記憶體段與當前程序脫離
原型:
void *shmat(int shmid, const
void *shmaddr, int shm***);
int shmdt(const
void *shmaddr);
引數: shmaddr:由shmat返回的指標
返回值:
成功返回0;失敗返回-1
脫離不等於刪除共享記憶體段
shmctl:用於控制共享記憶體
原型: int
shmctl(int shmid, int cmd, struct shmid_ds *buf);
引數: shmid:由shmget返回的共享記憶體標識碼
cmd:將要採取的動作(3個可選值分為ipc_stat,ipc_set,ipc_rmid)
buf:指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構
返回值:
成功返回0;失敗返回-1
實現共享記憶體的步驟如下:
(1) 建立記憶體共享區
程序1通過作業系統提供的api從記憶體中申請一塊共享區域,通過shmget函式實現,生成的共享記憶體塊與某個特定的key進行繫結。
(2) 對映共享記憶體到程序1中
通過shmat實現。
(3)對映共享記憶體到程序2中
程序2通過程序1的shmget函式和同乙個key值,然後執行shmat,將這個記憶體對映到程序2中。
(4)程序1與程序2中相互通訊
共享記憶體實現兩個對映後,可以利用該區域進行資訊交換,由於沒有同步機制,需 要參與通訊的程序自己協商處理。
(5)撤銷記憶體對映關係
完成通訊之後,需要撤銷之前的對映操作,通過shmdt函式實現。
(6)刪除共享記憶體區
通過shctl函式來實現。
**實現
comm.h
#ifndef _comm_h_
#define _comm_h_
#include
#include
#include
#include
#include
#include
#define pathname "."
#define proj_id 0x6666
int createshm(int size);
int destroyshm(int shmid);
int getshm(int size);
#endif
#include"comm.h"
int commshm(int
size,int flags)
int shmid=shmget(key,size,flags);
if(shmid<0)
return shmid;
}int destroyshm(int shmid)
return0;}
int getshm(int
size)
int createshm(int
size)
server.c
#include "comm.h"
int main()
shmdt(addr);
sleep(2);
destroyshm(shmid);
return
0;}
client.c
#include"comm.h"
int main()
shmdt(addr);
sleep(2);
return
0;}
注意:
1.共享記憶體效率高 相對於訊息佇列管道
2.共享記憶體無同步互斥機制
3.雙向通訊適用於任意程序
4.共享記憶體生命週期隨核心,在程序結束之前不再使用時,就斷開與共享記憶體的連線。
程序間通訊之共享記憶體
此程式實現兩個普通程序間通過共享記憶體來進行通訊,共享記憶體能夠進行大資料量的通訊,這一點事訊息佇列無法比擬的。在這裡同時使用了訊號量來保證兩個程序間的讀寫同步。傳送端源 include include include include include include include include ...
程序間通訊之共享記憶體
1.概念 共享記憶體就是多個程序的位址空間對映到同乙個物理記憶體,多個程序都能看到這塊物理記憶體,共享記憶體可以提供給伺服器程序和客戶程序之間進行通訊,不需要進行資料的複製,所以速度最快。2.共享記憶體操作需要的函式 1 我們需要利用ftok函式生成key識別符號。key t ftok const ...
程序間通訊之共享記憶體
ipc物件這個概念需要理解,因為好多書或者料就直接說ipc就是共享記憶體 訊息佇列 訊號燈集,其實ipc是一種機制,這種機制提供了程序間通訊的通道,那麼為什麼加個system v呢,那是因為在system v 系統的四個版本中提出的程序通訊的ipc這種機制。所以叫做system v ipc。目前li...