IPC 共享記憶體

2021-05-05 16:54:04 字數 2160 閱讀 6077

共享記憶體(shared memory)是最簡單的程序間通訊方式,它允許多個程序訪問相同的記憶體,乙個程序改變其中的資料後,其他的程序都可以看到資料的變化。

共享記憶體是程序間最快速的通訊方式:

①程序共享同一塊記憶體空間。

②訪問共享記憶體和訪問私有記憶體一樣快。

③不需要系統呼叫和核心入口。

④不造成不必要的記憶體複製。

核心不對共享記憶體的訪問進行同步,因此程式設計師必須自己提供同步。

使用共享記憶體:

①某個程序分配記憶體段。

②使用這個記憶體段的程序要連線(attach)這個記憶體段。

③每個程序使用完共享記憶體段後,要分離(detach)這個記憶體段。

④在某個地方,必須有乙個程序來銷毀這個記憶體段。

linux的記憶體模型:

①每個程序的虛擬記憶體被分為頁(page)。

②每個程序維護自己的記憶體位址到虛擬記憶體頁之間的對映。

③實際的資料存在於程序的記憶體位址上。

④儘管每個程序有自己的位址空間,多個程序的對映還是可以指向相同的頁。

所有的共享記憶體段的大小,都是linux記憶體頁大小的整數倍。

linux的頁大小是4kb,不過程式設計師應該使用getpagesize函式來獲得這個值。

分配:shmget

函式原型:shmget(key_t key, int size, int shm***);

①:shmget用來取得引數key所關聯的記憶體識別**。如果引數key為ipc_private,則會建立新的共享記憶體,大小是由size來決定的,

實際分配的位元組數會捨棄多餘部分到頁大小的整數倍。

②:如果引數key不是ipc_private,也不是已經建立的ipc key, 那麼系統會根據shm***是否有ipc_creat位(shm*** | ipc_creat)

為真來決定ipc key為引數的共享記憶體。

③:如果引數包含了ipc_creat 和 ipc_execl位, 那麼如果key標識的共享記憶體已經存在, 那麼會報eexist的錯誤。

④:引數也用來決定共享記憶體的訪問許可權, 相當於open()的 mode引數。

記憶體共享attach:shmat

函式原型: void* shmat(int shmid, const void* shmaddr, int shm***);

①:shmat()用來將引數shmid指定的共享記憶體和目前程序相連(attach)

④:程序結束後,已連線的共享記憶體會自動脫離

脫離:shmdt

函式原型:shmdt(const void *shmaddr);

①:shmdt()用來脫離先前shmat()過的共享記憶體。

控制共享記憶體的操作 shmctl

函式原型:shmctl(int shmid, int cmd, struct shmid_ds *buf);

①:引數cmd 有下面幾種操作

1:ipc_stat:把共享記憶體的 shmid_ds的結構copy到 buf 中。

2:ipc_set: 把引數buf所指的shmid_ds結構中的 shm_perm.uid, shm_perm.gid, shm_perm.mode 拷貝到共享記憶體的

shmid_ds結構中。

3:ipc_rmid:刪除共享記憶體和其資料結構。

看例子:

typedef struct ngx_shm_t;

ngx_int_t

ngx_shm_alloc(ngx_shm_t *shm)

ngx_log_debug1(ngx_log_debug_core, shm->log, 0, "shmget id: %d", id);

/* 每次有程序shmat,那麼在這個共享記憶體中的shmid_ds 結構中的shm_nattach就會加一 */

shm->addr = shmat(id, null, 0);

if (shm->addr == (void *) -1)

/* 只有在id所標識的共享記憶體中的shmid_ds結構中的shm_nattach為0的情況下才能被刪除。否者無效*/

if (shmctl(id, ipc_rmid, null) == -1)

return (shm->addr == (void *) -1) ? ngx_error : ngx_ok;

}void

ngx_shm_free(ngx_shm_t *shm)

}

IPC 共享記憶體

a 意義 多個程序共享一部分物理記憶體。訪問快,方便 b 先建立共享記憶體 int shmget key t key,int size,int shm 1.key 標誌共享記憶體的鍵值 0 ipc private a key 0 a 意義 多個程序共享一部分物理記憶體。訪問快,方便 b 先建立共享記...

IPC 共享記憶體

程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址。共享記憶體並未提供同步機制,使用訊號量進行同步。共享記憶體的特點 1 共享記憶體是程序間共享資料的一種最快的方法。乙個程序向共享的記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。2...

IPC 共享記憶體

共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享的記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體允許兩個或者多個程序共享給定的儲存區域。使用共享記憶體要注意的是多個程序之間對乙個給定儲存區訪問的互斥。若乙個程序正在向共享記憶體區寫資料,則在它做完這一...