mlock實現原理及應用【轉】


轉自:https://blog.csdn.net/yiyeguzhou100/article/details/78085857

mlock實現原理及應用
 
1 mlock簡介
 
1) mlock(memory locking)是內核實現鎖定內存的一種機制,用來將進程使用的部分或
全部虛擬內存鎖定到物理內存。
 
2) mlock機制主要有以下功能:
a)被鎖定的物理內存在被解鎖或進程退出前,不會被頁回收流程處理。
b)被鎖定的物理內存,不會被交換到swap設備。
c)進程執行mlock操作時,內核會立刻分配物理內存(注意COW的情況)。
 
2 mlock原理
1) 每個進程都擁有一段連續的虛擬內存,內核並不是以整個虛擬內存為管理單位,而是將
整個虛擬內存划分為若干個虛擬內存區域。
2) 內核中使用vm_area_struct數據結構來管理虛擬內存區域,簡稱vma。vma管理虛擬內
存的方式如下圖所示:
3) 每一個vma代表一個已映射的、連續的且屬性相同(如可讀/寫)的虛擬內存區域。內核采用鏈表和
AVL樹形式管理vma,其中鏈表用於遍歷,AVL樹用來查找(VMA的兩種數據結構組織形式,就像pid的三種組織形式一樣)。
4) mlock操作會給相應的vma的vm_flags置一個VM_LOCKED標記,而這個標記則會影響到物理內存回收和交換。 
#define VM_LOCKED 0x00002000
5) Linux分配內存到page且只能按頁鎖定內存,所以指定的地址會被round down到下一個page的邊界。
6) 當mlock鎖定的虛擬內存區域跟現有vma管理的虛擬內存區域並不完全重合時,由於同一個vma的內存屬性要求一致,而VM_LOCKED標記也是其屬性,因此會導致現有的vma被合並或分割,如下圖所示:
說明:
 a) prev與next是已受鏈表管理的vma結構,new是將要新加入鏈表的vma。
 b) 當new加入時,如果new的起始地址與prev的結束地址相同,且new屬性與prev屬性均為VM_LOCKED
,則將prev和new合並成prev’。
 c) 如果new的結束地址與next的起始地址有重合,但next屬性是VM_EXEC,則next被分割成兩部分,一部分加入
prev’,另一部分變成next’。
 
7) 操作系統通過LRU算法來管理Linux進程的虛擬內存,LRU算法主要通過兩個頁面標志
符(PG_active和 PG_referenced)來標識某個頁面的活躍程度,
從而決定頁面如何在兩個鏈表(active_list和inactive_list)之間進行移動。
8) 內核函數vmscan會遍歷掃描active_list和inactive_list鏈表來回收頁面。
9) 內核在LRU算法中新增了一個unevictable_list鏈表,將不可回收的頁面都放在unevictable_list
中,mlock的頁面就被放在unevictable_list中,同時給該頁置一個PG_mlocked標記。
 
注:除了mlock的頁,ramdisk或ramfs頁以及共享內存映射的頁也被放入unevictable_list中。
 
10) 解鎖並不立刻將解鎖的頁回收,而是將解鎖的頁放回active_list或inactive_list鏈表,然后交由頁回收流程處理,所以mlock的頁不會被頁回收流程處理。
11) 由於線程共享進程資源,所以線程的vma將繼承VM_LOCKED標記。但fork后的子進程的vma並不繼承VM_LOCKED
標記,以及調用exec執行其它程序時,不繼承VM_LOCKED標記。
 
3 mlock函數
mlock機制通過提供四個函數來使用,如下所示:
 
注:
1) 上述函數只能由root用戶執行。
2) mlock操作不可疊加,多次調用mlock的一段內存會被一次unlock解鎖。
3) 鎖定進程所有映射到地址空間的數據包括:代碼、數據、棧片段分頁,共享庫、用戶空間內核數據、
共享內存以及內存映射的文件
 
4 mlock應用
1) mlock機制在虛擬化中的應用
libvirt已提供對mlock支持,可以通過在Guest的xml文件中添加如下內容來開啟qemu-kvm進程的mlock
機制
<memoryBacking> 
<locked/> 
</memoryBacking> 
 
注:默認情況下qemu-kvm進程中的mlock選項是關閉的。
 
2) mlock機制在實時環境下的應用 
mlocked  訪問內存產生page fault次數 訪問內存時間開銷
on  1  低
off  >1  高
 
說明:
a) 采用mlock機制時,僅在虛擬內存和物理內存建立映射關系時產生一次page fault。
b) 未采用mlock機制時,每當訪問不同的虛擬內存單元時,就會產生一次page fault。
 
3) mlock機制在多線程環境下的應用
mlocked  線程棧空間映射物理內存大小 映射物理內存時間開銷
on  10MB  高
off  1MB  低
 
注: 
a) 假設線程整個棧空間大小10MB,其中1MB空間已使用。
b) 假設10MB虛擬內存和物理內存建立映射關系耗時1ms,1MB虛擬內存和物理內存建立映射關系
耗時0.1ms。
 
說明: 
當進程涉及多線程操作時:
a) 采用mlock機制時,線程整個棧空間10MB會被映射到物理內存,若一個進程中有2000
個線程,則線程棧空間和物理內存建立映射關系共耗時2000ms。
b) 未采用mlock機制時,線程棧空間已使用的1MB會被映射到物理內存,若一個進程中有2000
個線程,則線程棧空間和物理內存建立映射關系共耗時200ms。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM