版權所有 © 2014 tutorialspoint
#include <sys/mman.h> int mlock(const void *addr, size_t len); int munlock(const void *addr, size_t len); int mlockall(int flags); int munlockall(void);
int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
int mlockall(int flags);
int munlockall(void);
munlock() 解鎖從addr開始,持續len位元組的地址範圍內的頁面。在此呼叫之後,所有包含指定記憶體範圍一部分的頁面都可以由核心再次移動到外部交換空間。
flags 引數是以下一個或多個常量的按位或結果
munlockall() 解鎖對映到呼叫程序地址空間的所有頁面。
正在使用mlockall() 來防止頁面錯誤延遲的即時程序應該在進入時間關鍵部分之前預留足夠鎖定的堆疊頁面,以便函式呼叫不會導致任何頁面錯誤。這可以透過呼叫分配足夠大的自動變數(陣列)並寫入該陣列佔用的記憶體來實現,以便訪問這些堆疊頁面。這樣,將為堆疊對映足夠的頁面,並可以將其鎖定到 RAM 中。虛擬寫入確保在關鍵部分不會發生複製時寫入頁面錯誤。
記憶體鎖不會被透過fork(2)建立的子程序繼承,並且會在execve(2)期間或程序終止時自動刪除(解鎖)。
如果透過munmap(2)取消對映地址範圍,則該地址範圍上的記憶體鎖會自動刪除。
記憶體鎖不會堆疊,即,已透過呼叫mlock() 或mlockall() 多次鎖定的頁面將透過對相應範圍呼叫munlock() 或透過munlockall() 解鎖。對映到多個位置或由多個程序對映的頁面只要至少在一個位置或至少一個程序中被鎖定,就會保持鎖定在 RAM 中。
從 Linux 2.6.9 開始,對特權程序可以鎖定的記憶體量沒有限制,並且RLIMIT_MEMLOCK軟資源限制改為定義非特權程序可以鎖定的記憶體量限制。
從核心 2.6.9 開始,如果特權程序呼叫mlockall(MCL_FUTURE) 並在以後放棄特權(例如,透過將其有效 UID 設定為非零值來丟失CAP_IPC_LOCK功能),則如果遇到RLIMIT_MEMLOCK資源限制,後續的記憶體分配(例如,mmap(2)、brk(2))將失敗。
在提供mlockall() 和munlockall() 的 POSIX 系統上,_POSIX_MEMLOCK 在<unistd.h>中定義為大於 0 的值。(另請參閱sysconf(3)。)
mmap (2)
shmctl (2)
setrlimit (2)
廣告