0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

mlock如何鎖住進(jìn)程地址空間關(guān)聯(lián)的物理內(nèi)存

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

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

一、主動缺頁

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

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

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

二、內(nèi)存回收處理

1. 掃描活躍的lru鏈表

內(nèi)存回收掃描活躍的lru鏈表時(shí),對于設(shè)定了VM_LOCKED的vma處理鏈路如下:

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

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

2.掃描不活躍的lru鏈表

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

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

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

3.反向映射處理

shrink_page_list在回收物理頁面之前會調(diào)用try_to_unmap來解除映射到這個(gè)頁面所有頁表項(xiàng),相關(guān)處理如下:

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

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

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

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

mlock_vma_page處理的重點(diǎn)就是將頁面加入到不可回收的lru鏈表,這樣內(nèi)存回收的時(shí)候就不會在掃描到這樣的頁面了。

mlock的整個(gè)過程如下圖所示:

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

三、munlock處理

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

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

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

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

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

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

四、總結(jié)

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9098

    瀏覽量

    367708
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3028

    瀏覽量

    74082

原文標(biāo)題:mlock鎖原理剖析

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

收藏 人收藏

    評論

    相關(guān)推薦

    IP地址數(shù)據(jù)信息和爬蟲攔截的關(guān)聯(lián)

    IP地址數(shù)據(jù)信息和爬蟲攔截的關(guān)聯(lián)主要涉及到兩方面的內(nèi)容,也就是數(shù)據(jù)信息和爬蟲。IP 地址數(shù)據(jù)信息的內(nèi)容豐富,包括所屬地域、所屬網(wǎng)絡(luò)運(yùn)營商、訪問時(shí)間序列、訪問頻率等。 從IP地址信息中可
    的頭像 發(fā)表于 12-23 10:13 ?54次閱讀

    虛擬內(nèi)存和云計(jì)算的關(guān)系

    在現(xiàn)代計(jì)算機(jī)科學(xué)中,虛擬內(nèi)存和云計(jì)算是兩個(gè)關(guān)鍵的技術(shù)概念。虛擬內(nèi)存是一種內(nèi)存管理技術(shù),它允許計(jì)算機(jī)使用比物理內(nèi)存更多的
    的頭像 發(fā)表于 12-04 09:50 ?125次閱讀

    虛擬內(nèi)存溢出該怎么處理 虛擬內(nèi)存在服務(wù)器中的應(yīng)用

    在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,虛擬內(nèi)存是一種重要的資源管理技術(shù),它允許系統(tǒng)使用硬盤空間來擴(kuò)展物理內(nèi)存的容量。然而,當(dāng)系統(tǒng)運(yùn)行的程序和進(jìn)程超出了
    的頭像 發(fā)表于 12-04 09:49 ?168次閱讀

    Linux下如何管理虛擬內(nèi)存 使用虛擬內(nèi)存時(shí)的常見問題

    在Linux系統(tǒng)中,虛擬內(nèi)存管理是操作系統(tǒng)內(nèi)核的一個(gè)重要功能,負(fù)責(zé)管理物理內(nèi)存和磁盤上的交換空間。以下是對Linux下如何管理虛擬內(nèi)存以及使
    的頭像 發(fā)表于 12-04 09:19 ?416次閱讀

    什么是虛擬內(nèi)存分頁 Windows系統(tǒng)虛擬內(nèi)存優(yōu)化方法

    虛擬內(nèi)存分頁概述 在Windows操作系統(tǒng)中,虛擬內(nèi)存是通過分頁機(jī)制實(shí)現(xiàn)的。分頁允許系統(tǒng)將內(nèi)存中的數(shù)據(jù)移動到硬盤上,以便為當(dāng)前運(yùn)行的程序騰出空間。這個(gè)過程對于保持系統(tǒng)的流暢運(yùn)行至關(guān)重要
    的頭像 發(fā)表于 12-04 09:16 ?355次閱讀

    虛擬內(nèi)存不足如何解決 虛擬內(nèi)存物理內(nèi)存的區(qū)別

    物理內(nèi)存,可以減少系統(tǒng)對虛擬內(nèi)存的依賴。 調(diào)整虛擬內(nèi)存設(shè)置 : 進(jìn)入系統(tǒng)設(shè)置,調(diào)整虛擬內(nèi)存的大小。通常,虛擬
    的頭像 發(fā)表于 12-04 09:14 ?426次閱讀

    邏輯內(nèi)存物理內(nèi)存的區(qū)別

    邏輯內(nèi)存物理內(nèi)存是計(jì)算機(jī)系統(tǒng)中兩個(gè)重要的概念,它們在計(jì)算機(jī)的運(yùn)行和數(shù)據(jù)處理中起著至關(guān)重要的作用。 1. 物理內(nèi)存(Physical Mem
    的頭像 發(fā)表于 09-27 15:38 ?716次閱讀

    linux下查詢進(jìn)程占用的內(nèi)存方法有哪些?

    linux下查詢進(jìn)程占用的內(nèi)存方法
    發(fā)表于 04-08 06:03

    物理內(nèi)存模型的演變

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

    Linux內(nèi)核內(nèi)存管理之內(nèi)核非連續(xù)物理內(nèi)存分配

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

    HarmonyOS跨進(jìn)程通信—IPC與RPC通信開發(fā)

    使用Binder驅(qū)動,用于設(shè)備內(nèi)的跨進(jìn)程通信,后者使用軟總線驅(qū)動,用于跨設(shè)備跨進(jìn)程通信。需要跨進(jìn)程通信的原因是因?yàn)槊總€(gè)進(jìn)程都有自己獨(dú)立的資源和內(nèi)存空
    的頭像 發(fā)表于 02-02 17:47 ?1294次閱讀
    HarmonyOS跨<b class='flag-5'>進(jìn)程</b>通信—IPC與RPC通信開發(fā)

    線程是什么的基本單位 進(jìn)程與線程的本質(zhì)區(qū)別

    線程是操作系統(tǒng)中處理器調(diào)度的基本單位,它代表著獨(dú)立的執(zhí)行流。在一個(gè)進(jìn)程中,可以包含多個(gè)線程,這些線程共享相同的進(jìn)程資源,如內(nèi)存空間、文件描述符等。 進(jìn)程是操作系統(tǒng)中運(yùn)行的程序的實(shí)例,它
    的頭像 發(fā)表于 02-02 16:30 ?947次閱讀

    拆解mmap內(nèi)存映射的本質(zhì)!

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

    使用TC399刷寫bootloader的時(shí)候發(fā)現(xiàn)地址0xA0004000-0xA0007FFF被鎖住怎么解決?

    最近在使用TC399刷寫bootloader的時(shí)候發(fā)現(xiàn)地址 0xA0004000-0xA0007FFF 被鎖住,導(dǎo)致這塊區(qū)域不能擦除也不能刷寫,我想知道這是什么原因?qū)е碌模硗庥袥]有什么辦法將這塊區(qū)域解鎖?
    發(fā)表于 01-24 07:12

    mcu線程和進(jìn)程的區(qū)別是什么

    是程序執(zhí)行的基本單位,它是進(jìn)程中的一個(gè)實(shí)體,是進(jìn)程內(nèi)的一條執(zhí)行路徑。線程是CPU調(diào)度的最小單位,它可以看作是輕量級的進(jìn)程,不擁有獨(dú)立的地址空間
    的頭像 發(fā)表于 01-04 10:45 ?763次閱讀