共享記憶體 Shared Memory

2021-09-25 15:09:01 字數 3373 閱讀 2150

**自cdevelopr的linux 高階程式設計 - 共享記憶體 shared memory

ipc(程序間通訊) 方式:共享記憶體 shared memory的基本原理是:核心開闢一片記憶體區域,然後多個使用者程序可以將這片區域對映到它們自己的位址空間中進行讀寫。

這種方式速度很快,因為資料不需要在程序之間複製,只要乙個程序寫入資料,另乙個程序就能馬上讀取資料了,但是讀取和寫入必須同步

1.1、共享記憶體屬性

我們可以在終端中使用ipcs -m檢視系統當前開闢的共享記憶體:

ipcs -m

------ shared memory segments --------

key shmid owner perms bytes nattch status

0x00000000 104529920 orange 600 2097152 2 dest

0x00000000 688129 orange 600 524288 2 dest

0x00000000 113672194 orange 600 524288 2 dest

...

可以看到列出了共享記憶體的一些屬性:位址,id,擁有者等等。

1.2、共享記憶體在**?

程序可以將共享記憶體對映到自己的位址空間中,如下:

可以看到中間有乙個記憶體對映區域,程序把核心的共享記憶體對映到這個地方,模型如下:

程序可以通過共享記憶體的 api 獲得核心所管理的共享記憶體的乙份對映,例如直接同步讀寫自己的對映檔案就可以實現程序 a 和 b 之間的通訊了,非常簡單。

共享記憶體使用起來比較簡單,但是需要注意必須保持不同程序的讀寫同步,可以使用訊號量或者互斥鎖等,但是本篇文章主要介紹共享記憶體,不會涉及同步相關的操作,下面的例子主要介紹共享記憶體相關的 api 操作,當你熟悉了基本的用法,在以後學習同步時可以加上同步機制來保證讀寫正確。

共享記憶體(shm)的操作主要分為下面 4 個步驟:

建立或獲取 shm

對映 shm 到程序位址空間

操作對映後的區域,即讀寫

關閉程序位址空間的對映區域

分別來了解這些操作的 api。

2.1、建立:shmget

建立 shm 呼叫shmget

#include

#include

/* * key:shm 標識

* size:shm 大小

* shm***:建立或得到的屬性,例如 ipc_creat

* return:成功返回 shmid,失敗返回 -1,並設定 erron

*/int

shmget

(key_t key, size_t size,

int shm***)

;

2.2、 對映:shmat
#include

#include

/* 1. shmid:shm id

3. shm***:shm 許可權

*/void

*shmat

(int shmid,

const

void

*shmaddr,

int shm***)

;

其中 shmaddr 引數主要有 2 種情況: 即:

註冊成功,返回id對映成功,返回位址

2.3、 關閉對映:shmdt

shmdt解除當前程序對映的 shm:

#include

#include

/* * return:成功返回 0,失敗返回 -1,並設定 erron

*/int

shmdt

(const

void

*shmaddr)

;

3.1、write_shm.c

我們先建立乙個片 shm,然後寫入內容:

#include

//註冊

#include

#include

//對映、關閉

#include

#include

#include

intmain()

else

}else

return0;

}

3.2、read_shm.c

我們再寫乙個程式來對映 shm 並讀取其中的內容:

#include

#include

#include

#include

#include

#include

intmain()

;memcpy

(str, shm,

strlen

("i'm share memory"))

;printf

("shm = %s\n",(

char

*)shm)

;// 4. 關閉 shm

shmdt

(shm);}

else

}elseif(

0==shmctl

(shm_id, ipc_rmid, null))

printf

("delete shm success.\n");

return0;

}

3.3、編譯、執行

編譯

gcc write_shm.c -o write_shm

gcc read_shm.c -o read_shm

執行
./write_shm
./read_shm

hello world!

成功讀取了寫程序的寫入的資料,雖然不是同步的,但是至少能夠獲取資料。

Linux共享記憶體及共享記憶體API

共享記憶體區是最快的ipc 程序間通訊 形式。用共享記憶體從伺服器拷貝檔案資料到客戶端 共享記憶體基本api include include 1.int shmget key t key,size t size,int shm 功能 用來建立共享記憶體 key 是這個共享記憶體段的名字 size 共...

mysql共享記憶體 MySQL全域性共享記憶體介紹

前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...

mysql共享記憶體 MySQL全域性共享記憶體介紹

前言 全域性共享記憶體則主要是 mysql instance mysqld程序 以及底層儲存引擎用來暫存各種全域性運算及可共享的暫存資訊,如儲存查詢快取的 query cache,快取連線線程的 thread cache,快取表檔案控制代碼資訊的 table cache,快取二進位制日誌的 binl...