共享記憶體優點:
1.在程序之間不通過核心傳遞資料,即不通過系統呼叫拷貝資料,達到快速,高效的資料傳輸。
2.隨核心持續
*nix的共享記憶體有兩套api:posix和system v
兩者的主要差別是共享記憶體的大小
1.posix共享記憶體大小可通過函式ftruncate隨時修改
2.system v共享記憶體大小在建立時就已經確定,而且最大值根據系統有所不同
posix共享記憶體
#include (mmap,munmap,msync,shm_open,shm_unlink)
最主要的函式 -- mmap
void* mmap(void* addr,size_t len,int prot,int flags,int fd,off_t offset)
函式將乙個控制代碼對映到記憶體中,這個控制代碼可以是open的檔案控制代碼,也可以是shm_open的共享記憶體區物件。
*nix一切皆檔案的觀點,shm_open也是在/dev/shm目錄下建立乙個檔案物件,返回物件的描述符。
mmap將控制代碼作為共享記憶體的底層支撐物件,對映到記憶體中,這樣可以不通過read、write在程序之間共享記憶體。由此推測一下,在*nix的程序間傳 遞資料更加原始的方法是程序間讀寫乙個檔案。但是頻繁的open、read、write、lseek系統呼叫會消耗過多的計算資源。所以想到了將這個檔案 控制代碼對映到記憶體中,這樣就提高了程序間傳遞資料的效率。
需要注意的函式 -- msync
當修改了記憶體對映區的記憶體後,核心會在某個時刻將檔案的內容更新。為了確信檔案被更新,呼叫函式msync.檔案的更新可以是同步(ms_sync)也可以是非同步(ms_async)。(估計這裡也是呼叫了函式write更新檔案)
system v共享記憶體
#include (shmget,shmat,shmdt,shmctl)
由於system v的共享記憶體有大小的限制,所以可考慮,使用共享記憶體陣列來解決這個問。雖然陣列的大小即乙個程序可以獲取共享記憶體的數量也是有限制,但是可以緩解system v單個共享記憶體過小的問題。
UNIX網路程式設計 共享記憶體區
ipc形式除了管道 fifo 訊號量以外,還有共享記憶體區和訊息佇列。這裡主要堆共享記憶體進行介紹。共享記憶體區是可用ipc形式中最快的。一旦這樣的記憶體區對映到共享它的程序位址空間,這些程序間資料的傳遞就不再涉及核心。共享記憶體與其他程序通訊方式相比較,不需要複製資料,直接讀寫記憶體,是一種效率非...
UNIX 什麼是IPC物件以及共享記憶體
sys v 的ipc 物件 對於核心中建立的檔案物件,就是檔案識別符號 它引用了檔案物件的全部資訊 在程序中檔案描述符一般使用當前最小可用值。對於ipc識別符號返回的是索引的整數值,它是全域性變數的流水號,在系統中唯一分配的,若果在建立的ipc物件沒有關閉,他會全域性存在,只有在系統關閉的時候才關閉...
UNIX檔案共享
核心使用3種資料結構表示開啟檔案,這三種結構的關係決定了共享檔案程序間的可能產生的影響 結構1.檔案描述符表,檔案描述符表存在於程序表的乙個記錄項中,檔案描述符表中的每一項包含兩個重要資料 a.檔案描述符標誌 b.指向乙個檔案表項的指標 結構2.檔案表項,檔案表項存在於核心為所有開啟檔案維持的一張檔...