背景:頁面調度的雙面性
- 優點:虛擬地址空間 > 物理內存,硬盤交換空間提供「無限內存」假象
- 缺點:
- 確定性:頁錯誤觸發磁盤 I/O,破壞實時/時間敏感應用的時間可預測性
- 安全性:敏感數據(密鑰等)可能以明文寫入交換分區
解決方案:內存鎖定
將指定內存區域「釘住」在物理內存,不參與頁面交換。
核心 API
| 函數 | 原型 | 作用 |
| mlock | int mlock(const void *addr, size_t len) | 鎖定 [addr, addr+len) 頁面 |
| munlock | int munlock(const void *addr, size_t len) | 解除鎖定 |
| mlockall | int mlockall(int flags) | 一次鎖定多個頁面 |
| munlockall | int munlockall(void) | 解除所有鎖定 |
mlockall flags
MCL_CURRENT:鎖定**當前**映射的所有頁面
MCL_FUTURE:鎖定**未來**映射的所有頁面(含後續 mmap/malloc)
- 可組合:
MCL_CURRENT | MCL_FUTURE
權限要求
僅超級用戶 (root/CAP_IPC_LOCK) 可調用。普通用戶調用返回 EPERM。
性能代價
- 鎖定頁面減少可交換內存,可能導致其他進程頻繁換頁
- 內核設計假設為最優換頁策略,強制鎖定破壞全局最優
- 僅在確有必要(實時控制、加密密鑰)時使用
典型應用場景
- 硬實時控制迴路:鎖定 ISR/控制算法代碼段與數據段
- 密鑰管理:鎖定存儲私鑰/會話密鑰的緩衝區
- 高頻交易:鎖定熱點數據結構避免抖動
- 上一篇文章: Linux C 進程等待機制全解析:wait/waitpid/waitid 語義差異、僵屍進程與信號交互
- 下一篇文章: 華為 C 語言面試題精選:變量存儲區域劃分與靜態/動態內存分配深度對比
Copyright ©
程式碼之家 All Rights Reserved