首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux 鎖頁:mlock/munlock 實現內存常駐與安全防換出

     編輯:關於C語言

概念

虛擬內存以頁(通常 4KB)為單位管理。鎖頁 指告知內核:特定虛擬頁必須關聯物理頁框,且不允許換出到交換分區。調用 mlock 時若頁已換出,內核會先換入再鎖定。

應用場景

  1. 實時/高性能:避免頁錯誤導致的不可預測延遲,配合高優先級調度使用。
  2. 隱私安全:防止敏感數據(密鑰、密碼)被換出到磁盤,減少物理訪問洩露風險。

關鍵特性

  • 鎖針對虛擬頁,同一物理頁若被多個虛擬頁映射,任一加鎖即禁止換出。
  • 不支持疊加鎖:同一虛擬頁最多一把鎖。
  • 解鎖條件:進程調用 munlock、進程退出(虛擬地址空間銷毀)。
  • 不繼承:fork 子進程不繼承鎖,但因複製時共享物理頁(COW),子進程實際受益於父進程的鎖。
  • 權限限制:僅超級用戶可鎖頁(CAP_IPC_LOCK),任意進程可解鎖。
  • 系統限制:RLIMIT_MEMLOCK 限制可鎖內存總量(ulimit -l 查看)。
  • 寫時復制(COW):若兩虛擬頁共享物理頁,一方寫入觸發內核複製物理頁,鎖屬性隨新頁保持。

API

#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) 使用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved