shm(共享記憶體api)
1、共享記憶體的特點:
(1)減少進入核心空間的次數;
(2)直接使用位址來讀寫快取時,效率會更高,適用於大資料量的通訊。
2、共享記憶體的使用步驟:
(1)程序呼叫shmget函式,建立新的或獲取已有共享記憶體;
(2)程序呼叫shmat函式,將物理記憶體對映到自己的程序空間;
(3)程序呼叫shmdt函式,取消共享記憶體的對映;
(4)程序呼叫shmctl函式,釋放開闢的那片物理記憶體空間(刪除)。
1、shmget(建立/獲取共享記憶體)
1、標頭檔案:#include
2、函式原型:int shmget(key_t key, size_t size, int shm***);
3、函式形參:key:用於為共享記憶體生成唯一的共享記憶體id(識別符號);
size:指定共享記憶體的大小;
shm***:指定建立時的原始許可權,一般都設定為0664|ipc_creat。
注:(1)key有三種設定:(msgget)
① ipc_private:指定後每次呼叫shmget時都會建立乙個新的共享記憶體;
②使用ftok函式,通過路徑名和乙個8位的整形數來生成key值;
注:ftok函式標頭檔案:#include #include
函式原型:key_t ftok(const char *pathname, int proj_id);
proj_id一般指定為乙個ascii碼值,如』a』。
③自己指定乙個長整型數。
(2)要求size是虛擬頁大小的整數倍(一般來說虛擬頁大小是4k(4096位元組))。
(3)shmget只有在建立乙個新的共享記憶體時才會用到,否者不會用到。
4、函式返回值:成功返回共享記憶體識別符號以便後續操作,失敗返回-1,錯誤存於erron中。
5、使用示例:
(1)使用ftok函式生成key
key_t key = ftok("/tmp/shm",『a』); //生成乙個隨機數配置
int shmid = shmget(key, max_size, 0644);
(2)使用ipc_private
int shmid = shmget(ipc_private, max_size, 0644);
2、shmat(對映共享記憶體)
1、標頭檔案:#include
2、函式原型:void *shmat(int shmid, const void *shmaddr, int shm***);
3、函式形參:shmid:共享記憶體識別符號;
shmaddr:指定對映的起始位址(通常使用null);
shm***:指定對映條件。
注:(1)shmaddr有兩種設定方式:
①null:表示由核心自己來選擇對映的起始位址(虛擬位址);
②自己指定對映的起始位址(虛擬位址)。
(2)shm***條件(許可權)設定:
①0:以可讀可寫的方式對映共享記憶體;
②shm_rdonly:以唯讀方式對映共享記憶體。
4、函式返回值:成功返回對映位址,失敗返回-1,錯誤存於erron中。
5、使用示例:char *addr = (char *)shmat(shmid, null, 0);
3、shmdt(取消建立的對映)
1、標頭檔案:#include #include
2、函式原型:int shmdt(const void *shmaddr);
3、函式形參:shmaddr:對映的起始位址(虛擬位址)。
注:shmaddr具體見shmat。
4、函式返回值:成功返回0,失敗返回-1,錯誤存於erron中。
5、使用示例:shmdt(addr); //對映的起始位址,形成於shmat
4、shmctl(控制共享記憶體)
1、標頭檔案:#include
2、函式原型:int shmctl(int shmid, int cmd, struct shmid_ds *buf);
3、函式形參:shmid:共享記憶體識別符號;
cmd:控制選項;
buf:存放屬性資訊(控制為刪除時,設定為null即可)
注:cmd選項:
① ipc_stat:從核心獲取共享記憶體屬性資訊,讀到第三個引數(應用快取)。
②ipc_set:修改共享記憶體的屬性(修改方法與訊息佇列相同)。
③ipc_rmid:刪除共享記憶體(前提:所有的對映全部取消)。
4、控制功能:獲取共享記憶體的屬性資訊、修改共享記憶體的屬性資訊、刪除共享記憶體等。
5、使用示例:shmctl(shmid,ipc_rmid,null); //刪除共享記憶體
程序間通訊之共享記憶體 shm
include include include struct shm共享記憶體使用的結構體的宣告 int main int argc,const char argv shmid shmget key,sizeof struct shm ipc creat ipc excl 0666 共享記憶體的獲取...
docker複製相關,調整shm共享記憶體
docker中執行selenium的自動化,啟動之後報頁面崩潰失敗,網上查說是shm記憶體不夠導致,df h命令檢視shm記憶體才64m,啟動一次瀏覽器不關閉就占用超過50 檢視了伺服器上的所有docker的shm都是64m,可能後端服務不需要用到shm。網上找了一些命令未能處理掉這個問題 不管是d...
linux儲存 共享記憶體機制shm(十三)
實現程序間通訊最簡單也是最直接的方法就是共享記憶體 為參與通訊的多個程序在記憶體中開闢乙個共享區。由於程序可以直接對共享記憶體進行讀寫操作,因此這種通訊方式效率特別高,但其弱點是,它沒有互斥機制,需要訊號量之類的手段來配合。共享記憶體,顧名思義,就是兩個或多個程序都可以訪問的同一塊記憶體空間,乙個程...