linux-鎖定內存

轉載請註明出處:http://blog.csdn.net/muge0913/article/details/7314854


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

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


確定性(Determinism)

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


安全性(Security)

如果內存中含有私人祕密,這祕密可能最終被頁面調度以不加密的方式儲存到硬盤上。

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



 

如果用戶不希望某塊內存在暫時不用時置換到磁盤上,可以對該內存進行內存鎖定。

相關函數如下:


  1. #include <sys/types.h>  
  2.   
  3. int mlock(const void *addr,size_t length)  
  4.   
  5. int munlock(void *addr,size_t length)  
  6.   
  7. int mlockall(int flag)  
  8.   
  9. int munlockall(void  

)

 

函數:mlock鎖定一片內存區域,addr爲內存地址,length要鎖定的長度。

     munlock接觸已鎖定的內存

      mlockall一次鎖定多個內存頁。flag取值有兩個MCL_CURRENT鎖定所用內存頁,MCL_FUTURE鎖定爲進程分配的地址空間內存頁。munlockall用於解除鎖定的內存。

注:只有超級用戶才能進行鎖定和解除內存操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章