共享記憶體是最快的可用ipc形式。它允許多個不相關(無親緣關係)的程序去訪問同一部分邏輯記憶體。
如果需要在兩個程序之間傳輸資料,共享記憶體將是一種效率極高的解決方案。一旦這樣的記憶體區對映到共享它的程序的位址空間,這些程序間資料的傳輸就不再涉及核心。這樣就可以減少系統呼叫時間,提高程式效率。
共享記憶體是由ipc為乙個程序建立的乙個特殊的位址範圍,它將出現在程序的位址空間中。其他程序可以把同一段共享記憶體段「連線到」它們自己的位址空間裡去。所有程序都可以訪問共享記憶體中的位址。如果乙個程序向這段共享記憶體寫了資料,所做的改動會立刻被有訪問同一段共享記憶體的其他程序看到。
要注意的是共享記憶體本身沒有提供任何同步功能。也就是說,在第乙個程序結束對共享記憶體的寫操作之前,並沒有什麼自動功能能夠預防第二個程序開始對它進行讀操作。共享記憶體的訪問同步問題必須由程式設計師負責。可選的同步方式有互斥鎖、條件變數、讀寫鎖、紀錄鎖、訊號燈。
實際上,程序之間在共享記憶體時,並不總是讀寫少量資料後就解除對映,有新的通訊時,再重新建立共享記憶體區域。而是保持共享區域,直到通訊完畢為止。
使用posix共享記憶體需要用到下面這些api:
#include #include/*for mode constants
*/#include
#include
/*for o_* constants
*/#include
int shm_open(const
char *name, int
oflag, mode_t mode);
int shm_unlink(const
char *name);
int ftruncate(int
fildes, off_t length);
void *mmap(void *addr, size_t len, int prot, int flags, int
fildes, off_t off);
int munmap(void *addr, size_t len);
int close(int
fildes);
int fstat(int fildes, struct stat *buf);
int fchown(int
fildes, uid_t owner, gid_t group);
int fchmod(int fildes, mode_t mode);
穿件並開啟乙個新的共享記憶體物件或者開啟乙個既存的共享記憶體物件, 與函式open的用法是類似的. 函式返回值是乙個檔案描述符,會被下面的api使用.
設定共享記憶體物件的大小,新建立的共享記憶體物件大小為0.
將共享記憶體物件對映到呼叫程序的虛擬位址空間.
取消共享記憶體物件到呼叫程序的虛擬位址空間的對映.
刪除乙個共享記憶體物件名字.
當shm_open函式返回的檔案描述符不再使用時,使用close函式關閉它.
獲得共享記憶體物件屬性的stat結構體. 結構體中會包含共享記憶體物件的大小(st_size), 許可權(st_mode), 所有者(st_uid), 歸屬組 (st_gid).
改變乙個共享記憶體物件的所有權.
改變乙個共享記憶體物件的許可權.
posix 共享記憶體隨核心持續必須鏈結rt(librt)庫,也就是real-time library.
-lrt
在linux系統中, 共享記憶體物件是在虛擬檔案系統(tmpfs)中建立的, 通常掛載在目錄 /dev/shm 下.
linux從核心2.4 和glibc 2.2版本開始支援posix共享記憶體.
從linux核心2.6.19版本起, linux支援使用訪問控制列表(acls) 來控制虛擬檔案系統中物件的許可權.
to be continued...
posix.1-2001.
多程序必須使用同步機制來訪問共享記憶體物件, 比如使用posix訊號量.
system v 的共享記憶體是過時的, posix共享記憶體提供了使用更簡單、設計更合理的api.
POSIX共享記憶體
本文參考 嵌入式linux開發教程 和 linux unix系統程式設計手冊 共享記憶體是允許兩個不相關的程序訪問同乙個邏輯記憶體的程序間通訊方法,是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間的共享記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自...
Posix共享記憶體區
1 概述 posix提供了兩種在無親緣關係程序間共享記憶體區的方法 者兩種方法多需要呼叫mmap,差別在於作為mmap的引數之一的描述符的獲取手段。2 posix共享記憶體區物件 posix共享記憶體區涉及以下兩個步驟要求 1 指定乙個名字引數呼叫shm open,以建立乙個新的共享記憶體區物件或開...
Posix共享記憶體區
posix提供了兩種在無親緣關係程序間共享記憶體區的方法 2 共享記憶體區物件 先有shm open開啟乙個posix ipc名字 也可以是檔案系統中的乙個路徑名 然後呼叫mmap將返回的描述符對映到當前程序的位址空間。者兩種方法多需要呼叫mmap,差別在於作為mmap的引數之一的描述符的獲取手段。...