精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

mlock如何鎖住進程地址空間關聯的物理內存

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-03-14 09:36 ? 次閱讀

一般用戶空間關聯的物理頁面是按需通過缺頁異常的方式分配和調頁,當系統物理內存不足時頁面回收算法會回收一些最近很少使用的頁面,但是有時候我們需要鎖住一些物理頁面防止其被回收(如時間有嚴格要求的應用),Linux中提供了mlock相關的系統調用供用戶空間使用來鎖住部分或全部的地址空間關聯的物理頁面。 本文的分析基于arm64處理器架構,內核版本為Linux-5.10.27,我們會結合重點內核源代碼來解析mlock是如何做到鎖住進程地址空間關聯的物理內存的,又是如何防止相關的物理頁面被交換出去的。

一、主動缺頁

mlock的主要代碼處理流程如下,這里我們主要關注主動缺頁部分:

6808a960-9fc5-11ec-952b-dac502259ad0.png

mlock處理路徑中,會將VM_LOCKED標志加入到vma->vm_flags中(由于設置的地址區域有可能跨越多個vma,所以代碼中會涉及到分裂和合并的操作,實質上都會設置相關的vma->vm_flags的VM_LOCKED標志),然后會調用__mm_populate來填充虛擬頁對應的物理頁,最終在faultin_page函數中試圖查找vma中的每個虛擬頁對應的物理頁面(對應于follow_page_mask函數),如果沒有找到會調用handle_mm_fault主動觸發缺頁處理。 handle_mm_fault函數是內核通用的缺頁異常處理例程,如vma是匿名映射的則分配物理頁面然后建立頁表映射關系,vma是文件映射則會從磁盤讀取對應的文件頁(如果page cache沒有對應頁面時)到內存的page cache,然后建立虛擬頁面建立頁表映射關系。

二、內存回收處理

1. 掃描活躍的lru鏈表

內存回收掃描活躍的lru鏈表時,對于設定了VM_LOCKED的vma處理鏈路如下:

68239090-9fc5-11ec-952b-dac502259ad0.png

可以看到:當掃描活躍的lru鏈表的時候,會通過反向映射機制查找到映射這個物理頁面的每個vma, 對于設置了vma->vm_flags 的VM_LOCKED標志的vma來說直接退出反向映射處理即可,不需要進行訪問計數的統計工作,本身這樣的物理頁面就需要常駐內存不要進行回收。

2.掃描不活躍的lru鏈表

內存回收掃描不活躍的lru鏈表時,對于設定了VM_LOCKED的vma處理鏈路如下:

6836084c-9fc5-11ec-952b-dac502259ad0.png

可以看到:調用鏈中也會調用page_referenced 函數通過反向映射機制查找到映射這個物理頁面的每個vma, 對于設置了vma->vm_flags 的VM_LOCKED標志的vma來說直接退出反向映射處理即可,返回到page_check_references函數時,判斷如果有vma設置了VM_LOCKED標志就會返回PAGEREF_RECLAIM到shrink_page_list函數接著處理。 shrink_page_list函數在處理完page_check_references之后,就進行回收處理,對于頁表映射頁會調用try_to_unmap來解除頁表映射。

3.反向映射處理

shrink_page_list在回收物理頁面之前會調用try_to_unmap來解除映射到這個頁面所有頁表項,相關處理如下:

684fd8bc-9fc5-11ec-952b-dac502259ad0.png

對于映射到這個物理頁的每個vma來說,如果vma->vm_flags設置了VM_LOCKED標志,則會調用mlock_vma_page來做mlock處理,然后返回false,結束反向映射處理。 下面我們來看mlock_vma_page做了什么事情:

6867d480-9fc5-11ec-952b-dac502259ad0.png

可以看到:mlock_vma_page首先設置頁描述符的PG_mlocked標志,然后會zone的NR_MLOCK頁面記賬,然后會將頁面從原來的lru鏈表中隔離出來,最后會將頁面加入不可回收的lru中(這個代碼大家自行閱讀,實際上是判斷頁描述符的PG_mlocked標志)。

mlock_vma_page處理的重點就是將頁面加入到不可回收的lru鏈表,這樣內存回收的時候就不會在掃描到這樣的頁面了。

mlock的整個過程如下圖所示:

6887a3aa-9fc5-11ec-952b-dac502259ad0.png

三、munlock處理

munlock會解除原來鎖住的頁面,處理路徑如下:

68bf2c58-9fc5-11ec-952b-dac502259ad0.png

當然代碼中也會有對應的vma的分裂處理,主要處理為:清除vma的VM_LOCKED標志,清除頁描述符的PG_mlocked標志,最后就會將原來在不可回收的lru中的頁面重新加入對應的lru鏈表中。 這里還有一個細節,那就是有可能這個頁面對多個vma共享,所以會通過try_to_munlock來處理,處理路徑如下:

68d7e3e2-9fc5-11ec-952b-dac502259ad0.png

會通過反向映射機制,遍歷這樣頁對應的所有vma,如果傳遞的ttu_flags為TTU_MUNLOCK且vma->vm_flags沒有設置VM_LOCKED標志,則直接返回,檢查下一個vma;如果有一個vma設置了VM_LOCKED標志,說明這個頁面還不能被回收,就會通過mlock_vma_page函數重新將頁面加入到不可回收的lru鏈表。 munlock的整個處理過程如下圖:

68f2923c-9fc5-11ec-952b-dac502259ad0.png

四、總結

對于一些對時間有嚴格要求的應用場景,訪問時按需分配和調頁機制的時延可能是未知的,內核中提供了mlock相關的系統調用,用于將虛擬內存區域對應的物理頁面“鎖在”內存中。內核對應mlock鎖住的頁面實際上它主要做了兩步比較重要的操作:1,調用mlock的時候就將所需要的物理頁面準備好;2,內存回收時當掃描到相關的物理頁面時,將其放入不可回收的lru鏈表。第一步保證訪問的虛擬地址對應的物理頁面在內存中,第二步保證了鎖住的頁面不會被回收。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9054

    瀏覽量

    366827
  • 內存
    +關注

    關注

    8

    文章

    3002

    瀏覽量

    73887

原文標題:mlock鎖原理剖析

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    邏輯內存物理內存的區別

    邏輯內存物理內存是計算機系統中兩個重要的概念,它們在計算機的運行和數據處理中起著至關重要的作用。 1. 物理內存(Physical Mem
    的頭像 發表于 09-27 15:38 ?454次閱讀

    linux下查詢進程占用的內存方法有哪些?

    linux下查詢進程占用的內存方法
    發表于 04-08 06:03

    物理內存模型的演變

    內存管理概述中,主要是以Linux v2.6.11為例進行分析的,但是計算技術在不斷發展,新的存儲架構、新的指令集架構、新的SoC架構等都對物理內存模型的抽象提出了更高要求。為此,必須抽象一種完全獨立于硬件架構的
    的頭像 發表于 02-25 10:35 ?439次閱讀

    Linux內核內存管理之內核非連續物理內存分配

    的主要優點是避免了外部碎片,而缺點是需要修改內核頁表。顯然,非連續內存區域的大小必須是4096的倍數。Linux使用非連續物理內存區的場景有幾種:(1)為swap區分配數據結構;(2)為模塊分配
    的頭像 發表于 02-23 09:44 ?872次閱讀
    Linux內核<b class='flag-5'>內存</b>管理之內核非連續<b class='flag-5'>物理</b><b class='flag-5'>內存</b>分配

    HarmonyOS跨進程通信—IPC與RPC通信開發

    使用Binder驅動,用于設備內的跨進程通信,后者使用軟總線驅動,用于跨設備跨進程通信。需要跨進程通信的原因是因為每個進程都有自己獨立的資源和內存空
    的頭像 發表于 02-02 17:47 ?1224次閱讀
    HarmonyOS跨<b class='flag-5'>進程</b>通信—IPC與RPC通信開發

    線程是什么的基本單位 進程與線程的本質區別

    線程是操作系統中處理器調度的基本單位,它代表著獨立的執行流。在一個進程中,可以包含多個線程,這些線程共享相同的進程資源,如內存空間、文件描述符等。 進程是操作系統中運行的程序的實例,它
    的頭像 發表于 02-02 16:30 ?863次閱讀

    拆解mmap內存映射的本質!

    mmap 內存映射里所謂的內存其實指的是虛擬內存,在調用 mmap 進行匿名映射的時候(比如進行堆內存的分配),是將進程虛擬
    的頭像 發表于 01-24 14:30 ?1492次閱讀
    拆解mmap<b class='flag-5'>內存</b>映射的本質!

    使用TC399刷寫bootloader的時候發現地址0xA0004000-0xA0007FFF被鎖住怎么解決?

    最近在使用TC399刷寫bootloader的時候發現地址 0xA0004000-0xA0007FFF 被鎖住,導致這塊區域不能擦除也不能刷寫,我想知道這是什么原因導致的,另外有沒有什么辦法將這塊區域解鎖?
    發表于 01-24 07:12

    mcu線程和進程的區別是什么

    是程序執行的基本單位,它是進程中的一個實體,是進程內的一條執行路徑。線程是CPU調度的最小單位,它可以看作是輕量級的進程,不擁有獨立的地址空間
    的頭像 發表于 01-04 10:45 ?695次閱讀

    你還是分不清多進程和多線程嗎?一文搞懂!

    中同時運行多個獨立的進程。每個進程都有自己獨立的內存空間,可以同時執行不同的任務。多進程之間通過進程間通信的方式進行數據交換。 優點: -
    的頭像 發表于 12-19 16:07 ?540次閱讀

    Linux進程地址空間詳解

    RAM 的某些部分永久地分配給內核, 并用來存放內核代碼以及靜態內核數據結構. RAM 的其余部分稱為動態內存 (dynamic memory). 動態內存不僅是進程所需的寶貴資源, 也是內核本身
    的頭像 發表于 12-18 09:45 ?674次閱讀
    Linux<b class='flag-5'>進程</b><b class='flag-5'>地址</b><b class='flag-5'>空間</b>詳解

    如何綁定ip地址與mac物理地址呢?

    如何綁定ip地址與mac物理地址呢? 綁定IP地址與MAC物理地址是一種網絡管理和安全措施,可以幫助確保網絡設備的身份驗證和安全性。在這篇文章中,我們將詳細介紹如何進行IP
    的頭像 發表于 12-07 09:33 ?6522次閱讀

    Linux中進程、線程和協程的基礎概念

    進程是計算機中運行的程序的實例,它是操作系統中最基本的執行單元之一。每個進程都有自己的獨立內存空間、系統資源和代碼執行流。這意味著一個進程的崩潰通常不會影響其他
    的頭像 發表于 12-06 09:22 ?787次閱讀

    java虛擬機內存包括遠空間內存

    Java虛擬機(JVM)內存是Java程序執行時所使用的內存空間的總稱,包括了Java堆、方法區、本地方法棧、虛擬機棧和程序計數器等多個部分。在這些內存空間中,并不包含“遠空間內存”的
    的頭像 發表于 12-05 14:15 ?379次閱讀

    jmap dump內存的命令是

    jmap dump是Java內存映像工具(Java Memory Map Tool)的一個功能,用于生成Java虛擬機(JVM)中的堆內存快照。堆內存快照是一個包含了Java對象及其所占用內存
    的頭像 發表于 12-05 10:38 ?3084次閱讀