程序間通訊 共享記憶體

2021-08-01 08:59:19 字數 3647 閱讀 6484

在linux中,每個程序都有自己的p c b 和位址空間,並且都有乙個對應的頁表,負責將程序的位址和實體地址進行對映,通過mmu來管理。建立一段共享儲存區(臨界資源),被對映到不同程序的位址空間內,從而實現了高效率的資源共享。

優點:

共享記憶體在所有用於程序間通訊的ipc資源中實現程序間通訊的速度是 最快的,因為它少了兩次資源的拷貝。

缺點:

作業系統對共享記憶體並沒有提供同步與互斥機制,所以需要使用者來實現同步與互斥機制,我們知道,訊號量就可以實現。

程序間通訊的本質是使不同的程序可以看到同乙份資源,這份資源稱之為臨界資源,那麼這裡的共享記憶體即是這份臨界資源。

所以,首先應該建立一段共享儲存區。然後使其要訪問這個共享儲存區的每乙個程序都要將該共享儲存區連線至每個程序的位址空間。

當通訊完成後,所有的程序需要對其去關聯,通俗點講,也就是說將這些程序和這塊共享儲存區的連線斷開,並由建立共享儲存區的程序釋放該共享儲存區。

注意:建議使用者申請的共享儲存塊的大小最好是系統頁面大小的整數倍。因為,如果使用者申請的共享儲存段的大小不是頁面大小的整數倍的話,那麼系統會採用向上對齊至頁面大小的整數倍,但是使用者可以使用的還是自定義的儲存段。在linux系統下,頁面大小預設為4kb。

1.檢視系統中的共享儲存段:

ipcs -m

2.刪除系統中的共享儲存段:

1.shmght:建立乙個新的共享儲存段或引用乙個現有的共享儲存段。

#include 

#include

int shmget(key_t key, size_t size, int shm***)

返回值:

成功時返回乙個新建立的共享記憶體識別符號或者乙個已存在的共享記憶體識別符號。取決於shmglg引數。

失敗時返回-1並設定錯誤碼。

引數說明:

*key:由ftok函式得到的ipc鍵值,標識系統中唯一的ipc資源。

*size:該共享儲存段的長度,以位元組為單位。通常需要將其向上取為系統頁長的整數倍。(一頁為4k)。

如果在建立乙個新段,那麼必須指定size值,如果引用乙個現存的段,則將size指定為0。當建立乙個新段時,段內的內容初始化為0.

*shm***:

pc_creat||ipc_excl|0666 保證返回乙個新的共享記憶體識別符號,並且指定該共享記憶體的勸降為0666.

pc_creat 如果共享記憶體不存在,則建立並返回,如果存在,則開啟並返回其識別符號。

2.shmat:掛接

#include 

#include

void *shmat(int shmid, const

void shmaddr, int shm***)

若成功,返回指向共享儲存段的指標(該段所連線的虛擬位址),並且核心將使其與該共享儲存段相關的shmid_ds結構中的shm_nattch計數器加1(類似於引用計數);若出錯,返回-1.

引數:

*shmid:共享儲存段識別符號。

*shm***:

若指定了shm_rdonly位,則以唯讀方式連線此段,否則以讀寫方式連線此段。

3.shmdt(去關聯)

函式說明:

當對共享儲存的操作已經結束時,則需呼叫shmdt與該段分離。與shmat函式相反,是用來斷開與共享記憶體附加點的位址,禁止本程序訪問此片共享記憶體。

需要注意的是,該函式並不刪除所指定的共享記憶體區,而是將之前用shmat函式連線好的共享記憶體區脫離目前的程序。

#include 

#include

void *shmdt(const

void* shmaddr);

返回值:

若成功,返回0,並將shmid_ds結構中的shm_nattch計數器值減一;若出錯,返回-1.

4.shmctl:刪除共享記憶體段。

#include 

#include

int shmctl(int shmid, int cmd, struct shmid_ds* buf);

返回值:若刪除成功,返回0;

若出錯,返回-1。

引數:

*shmid:共享儲存段識別符號;

*cmd:指定的操作。

執行刪除:設定為ipc_rmid。

*buf:刪除時忽略該引數,設定為null

key值與shmid值都是標識唯一的乙份ipc資源,那麼它們之間又有什麼區別呢?

key值:在作業系統層面,用來標識唯一的乙份ipc資源。

shmid:在使用者層面,即就是在**層面,用來標識乙份ipc資源。 —–>這個是使用者所關注的

場景描述:

程序server建立共享儲存段,並與之連線,程序client獲取共享儲存段的識別符號,並與之關聯起來,然後程序server將資料寫入共享儲存段,同時,程序client就可以看見程序server寫的資料了,

然後讓程序client讀取共享儲存段的資料。最終,通訊完成後,程序server和程序client都要斷開和共享儲存段的關聯,並由程序server釋放共享儲存段,

結果展示:

監控:

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...