虛擬內存以頁(通常 4KB)為單位管理。鎖頁 指告知內核:特定虛擬頁必須關聯物理頁框,且不允許換出到交換分區。調用 mlock 時若頁已換出,內核會先換入再鎖定。
munlock、進程退出(虛擬地址空間銷毀)。fork 子進程不繼承鎖,但因複製時共享物理頁(COW),子進程實際受益於父進程的鎖。CAP_IPC_LOCK),任意進程可解鎖。RLIMIT_MEMLOCK 限制可鎖內存總量(ulimit -l 查看)。#include <sys/mman.h> int mlock(const void *addr, size_t len); // 鎖定 [addr, addr+len) 覆蓋的頁 int munlock(const void *addr, size_t len); // 解鎖 int mlockall(int flags); // 鎖定進程全部當前/未來映射 int munlockall(void); // 全部解鎖
返回 0 成功,-1 失敗(errno 指示原因:ENOMEM 超限、EPERM 權限不足、EINVAL 參數無效等)。
mmap(MAP_LOCKED)(Linux 2.5.37+)可在映射時直接鎖定。sched_setscheduler(SCHED_FIFO/RR) 使用。