Linux 使用共享記憶體

2021-09-02 04:05:59 字數 1068 閱讀 8629

1. 共享記憶體與訊息佇列的區別

訊息佇列在實現訊息的收發時,首先由傳送程序從程序空間將資料複製到核心分配的資料緩衝區中,接受程序再從核心的緩衝區複製到程序的虛擬位址空間

共享記憶體是將核心分配的共享儲存區域對映到程序的位址空間實現的,沒有資料的複製過程,共享記憶體的訪問速度要比訊息佇列快

2. 共享記憶體模型

開始---> 建立共享記憶體(shmget)--->對映共享記憶體(shmat)--->共享記憶體讀寫--->解除對映(shmdt)---結束

共享記憶體有訪問計數器機制,每有乙個程序進行一次共享記憶體對映,共享記憶體計數器就會加1,每一次解除對映就會減1,只有計數器為0時,才能真正地刪除一塊共享記憶體

可以通過ipcs -m 檢視, nattch項為訪問計數

3. 共享記憶體掛載在/dev/shm裝置上,檔案系統名稱為tmpfs, 完全駐留在系統記憶體中,訪問速度非常快

4. 使用過程

建立共享記憶體的key

key_t ikey = ftok("/etc/profile",1)

建立共享記憶體

int nshmid = shmget(ikey,256,ipc_create|0666)

type structshmstru

對映共享記憶體

shmstru *pshm = shmat(nshmid,null,0)

修改共享記憶體

pshm->n = 3;

strcpy (pshm->str,"12345");

控制共享記憶體訪問許可權

shmctl(nshmid,ipc_stat,..)

解除共享記憶體對映

shmdt(nshmid,pshm);

計數為0時刪除共享記憶體

shmct(nshmid,ipc_rmid,null)

需要注意的:

1. 核心對共享記憶體大小有限制, 檢視 sysctl -a | grep shm, 修改 /etc/sysctl.conf

2. 共享記憶體建立後,除非將其刪除或者重啟系統,否則一直存在系統中

只有計數器為0時,才能刪除

linux共享記憶體使用例項

三個檔案,乙個標頭檔案,乙個讀,乙個寫,用同乙個key值申請共享記憶體。shm.h ifndef shm com h define shm com h 1 define text sz 2048 struct shared use at struct kts endif shm write.c in...

linux共享記憶體的使用

linux共享記憶體和windows的共享記憶體邏輯上有很大區別,要注意一下幾點 標識描述 ipc excl 這個加入後,如果已經存在標識為key的共享記憶體則報錯返回 1 0如果是0 的話,就可以實現,如果共享記憶體不存在則返回失敗 1,否則直接建立返回成功 0666 這個識別符號很多人不知道啥意...

Linux 共享記憶體

一 概念 共享記憶體是被多個程序共享的一部分物理記憶體,是程序間共享資料的最快的一種方法。二 實現 分為兩個步驟 1 建立共享記憶體。2 對映共享記憶體。1 建立 int shmget key t key,int size,int shm 當key的取值為 ipc private 時,將建立一塊新的...