內存鎖定

mlockall函數,頭文件sys/mman.h
1. 原型: int mlockall(int flags);
2. mlockall函數將調用進程的全部虛擬地址空間加鎖。防止出現內存交換,將該進程的地址空間交換到外存上。
3. mlockall將所有映射到進程地址空間的內存上鎖。這些頁包括: 代碼段,數據段,棧段,共享庫,共享內存,user space kernel data,memory-mapped file.當函數成功返回的時候,所有的被映射的頁都在內存中。
4. flags可取兩個值:MCL_CURRENT,MCL_FUTURE
MCL_CURRENT: 表示對所有已經映射到進程地址空間的頁上鎖
MCL_FUTURE: 表示對所有將來映射到進程地空間的頁都上鎖。
5. 返回: 成功返回0,出錯返回-1
6. 此函數有兩個重要的應用: real-time algorithms(實時算法) 和 high-security data processing(機密數據的處理)
real-time algorithms:對時間要非常高。
high-security data processing: 如果數據被交換到外存上,可能會泄密
7. 如果進程執行了一個execve類函數,所有的鎖都會被刪除。
8. 內存鎖不會被子進程繼承。
9. 內存鎖不會疊加,即使多次調用mlockall函數,只調用一次munlock就會解鎖

Linux 實現了請求頁面調度,頁面調度是說頁面從硬盤按需交換進來,當不再需要的時候交換出去。這樣做允許系統中每個進程的虛擬地址空間和實際物理內存的總量再沒有直接的聯繫,因爲在硬盤上的交換空間能給進程一個物理內存幾乎無限大的錯覺。

  交換對進程來說是透明的,應用程序一般都不需要關心(甚至不需要知道)內核頁面調度的行爲。然而,在下面兩種情況下,應用程序可能像影響系統的頁面調度:

確定性(Determinism)

  時間約束嚴格的應用程序需要確定的行爲。如果一些內存操作引起了頁錯誤,導致昂貴的磁盤操作,應用程序的速度便不能達到要求,不能按時做計劃中的操作。如果能確保需要的頁面總在內存中且從不被交換進磁盤,應用程序就能保證內存操作不會導致頁錯誤,提供一致的,可確定的程序行爲,從而提供了效能。

安全性(Security)

  如果內存中含有私人祕密,這祕密可能最終被頁面調度以不加密的方式儲存到硬盤上。例如,如果一個用戶的私人密鑰正常情況下是以加密的方式保存在磁盤上的,一個在內存中爲加密的密鑰備份最後保存在了交換文件中。在一個高度注重安全的環境中,這樣做可能是不能被接受的。這樣的應用程序可以請求將密鑰一直保留在物理內存上。當然,改變內核的行爲會導致系統整體性能的負面影響。當頁面被鎖定在內存中,一個應用程序的安全性可能提高了,但這能使得另外一個應用程序的頁面被交換出去。如果內核的設計是值得信任的,它總是最優地將頁面交換出去(看上去將來最不會被使用的頁面)。

  如果不希望某進程使用交換空間,可以對該進程進行內存鎖定。相關函數如下:

#include <sys/mman.h> 

int mlock(const void *addr,size_t length)  
int munlock(void *addr,size_t length)  
int mlockall(int flag)  
int munlockall(void)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章