程序間通訊之共享記憶體

2021-08-17 20:06:21 字數 2829 閱讀 2729

什麼是共享記憶體?

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。

注:頁表是一種陣列結構,存放著各個虛擬頁的狀態,是否對映,是否快取. 程序要知道那些記憶體位址上的資料在物理記憶體上,那些不在,還有物理記憶體上的**需要用頁表來記錄. 頁表的每乙個表項分為兩部分,第一部分記錄此頁是否在物理記憶體上,第二部分記錄物理記憶體頁的位址

相關函式

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...