chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-03-14 09:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

一、主動缺頁

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

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

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

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

1. 掃描活躍的lru鏈表

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

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

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

2.掃描不活躍的lru鏈表

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

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

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

3.反向映射處理

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

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

對于映射到這個物理頁的每個vma來說,如果vma->vm_flags設置了VM_LOCKED標志,則會調(diào)用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鏈表,這樣內(nèi)存回收的時候就不會在掃描到這樣的頁面了。

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

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

三、munlock處理

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

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

當然代碼中也會有對應的vma的分裂處理,主要處理為:清除vma的VM_LOCKED標志,清除頁描述符的PG_mlocked標志,最后就會將原來在不可回收的lru中的頁面重新加入對應的lru鏈表中。 這里還有一個細節(jié),那就是有可能這個頁面對多個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函數(shù)重新將頁面加入到不可回收的lru鏈表。 munlock的整個處理過程如下圖:

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

四、總結

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

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

    關注

    135

    文章

    9538

    瀏覽量

    390337
  • 內(nèi)存
    +關注

    關注

    9

    文章

    3185

    瀏覽量

    76242

原文標題:mlock鎖原理剖析

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil中c語言的動態(tài)分配內(nèi)存

    * malloc(size_t size); 該函數(shù)向內(nèi)存(堆區(qū))申請一塊連續(xù)可用空間(size個字節(jié)),并返回這塊空間地址,注意一下幾點: (1)如果
    發(fā)表于 01-21 06:04

    【「Linux 設備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內(nèi)核內(nèi)存分配

    ,目前4KB是廣泛使用的頁大小。在Linux操作系統(tǒng)中,每個進程甚至內(nèi)核本身都被分配了地址空間,這是處理器的虛擬地址空間的一部分,內(nèi)核和
    發(fā)表于 01-16 20:05

    進程概念和特征

    。   2. 并發(fā)性:指多個進程實體,同存于內(nèi)存中,能在一段時間內(nèi)同時運行,并發(fā)性是進程的重要特征,同時也是操作系統(tǒng)的重要特征。引入進程的目的就是為了使程序能與其他
    發(fā)表于 01-15 06:39

    進程通信

    訪問的共享空間,通過對這片共享空間進行寫/讀操作實現(xiàn)進程之間的信息交換。在對共享空間進行寫/讀操作時,需要使用同步互斥工具(如 P操作、V操作),對共享
    發(fā)表于 01-15 06:16

    進程的控制

    內(nèi)存空間(在PCB 中體現(xiàn))。注意:這里如果資源不足(比如內(nèi)存空間),并不是創(chuàng)建失敗,而是處于”等待狀態(tài)“,或稱為“阻塞狀態(tài)”,等待的是內(nèi)存這個資源。   3. 初始化PCB,主要包括初始化標志信息
    發(fā)表于 01-15 06:05

    CW32F030片上FLASH閃存存儲器物理區(qū)域的劃分

    片上 FLASH 閃存由兩部分物理區(qū)域組成:主 FLASH 存儲器和啟動程序存儲器。 1、主 FLASH 存儲器,共 64KB,地址空間為 0x0000 0000 - 0x0000 FFFF。該區(qū)
    發(fā)表于 12-23 08:28

    解析Linux的進程、線程和協(xié)程

    進程間通信(IPC):Linux提供了多種IPC機制,如管道、信號、共享內(nèi)存和消息隊列,用于進程之間的通信。 線程管理 在Linux中,線程可以通過pthread庫來管理。線程共享同一進程
    發(fā)表于 12-22 11:00

    rk基于linux/android內(nèi)存管理

    一、內(nèi)存分布 ? U-Boot 由前級 Loader 加載到 CONFIG_SYS_TEXT_BASE 地址,初始化時會探明當前系統(tǒng)的總內(nèi)存容 量, 32 位平臺上認為最大 4GB 可用(但是不影響
    的頭像 發(fā)表于 12-15 10:42 ?138次閱讀
    rk基于linux/android<b class='flag-5'>內(nèi)存</b>管理

    Linux Swap交換空間詳解:Android編譯內(nèi)存不足?這樣擴充立竿見影

    ? ? 在 ?Linux? 系統(tǒng)使用過程中,你是否遇到過? “ 內(nèi)存不足 ”? 的報錯?比如編譯? Android? 源碼時,明明按教程操作,卻因物理內(nèi)存沒達到? 16G? 要求而編譯中斷?這正是
    的頭像 發(fā)表于 12-06 08:10 ?3977次閱讀

    請問e203定義的地址空間是虛擬地址還是物理地址?

    ; RED_LED_OFFSET); GPIO_REG為基地址,GPIO_OUTPUT_VAL為偏移量,從而確定了要操作的寄存器的絕對地址。 同樣地,在做上電復位時,可以配置pc_rtvec使得程序從不同的內(nèi)存空間啟動。
    發(fā)表于 11-11 06:20

    如何為蜂鳥添加DDR內(nèi)存擴展

    本隊伍編號CICC3042,本文介紹如何為蜂鳥添加DDR內(nèi)存擴展。一些需要大存儲空間的設計中經(jīng)常需要使用DDR,這時我們希望蜂鳥可以訪問DDR,以實現(xiàn)更好的軟硬件協(xié)同。 簡單閱讀蜂鳥的代碼發(fā)現(xiàn)
    發(fā)表于 10-31 06:07

    通過sysmem接口擴展內(nèi)存空間

    存儲器的訪問接口,在e203_subsys_mems.v文件中可以找到: 同時在這個源文件中實現(xiàn)了一主多從的總線系統(tǒng),可以看到sysmem被分配到0x80000000到0xFFFFFFFF的地址空間
    發(fā)表于 10-24 08:12

    DSP仿真器下載報錯,似乎是地址映射問題還是FLASH鎖住

    dsp下載程序報錯,仿真器連接是沒錯的,開發(fā)板為F28335,仿真器為XDS100v1,程序下載為仿真器時報錯,問題還沒有解決,請大神解答,下面是以為FLASH鎖住了,然后自己去嘗試解鎖的報錯。
    發(fā)表于 07-11 20:44

    工業(yè)APP頻繁崩潰?聚徽廠家分享安卓工控機內(nèi)存碎片化與進程管理優(yōu)化指南

    進程管理兩大核心維度,深入剖析崩潰根源,并提出系統(tǒng)性優(yōu)化方案。 一、內(nèi)存碎片化:工業(yè)APP崩潰的隱形推手 1. 內(nèi)存碎片化的成因與危害 內(nèi)存碎片化是指
    的頭像 發(fā)表于 06-10 10:24 ?456次閱讀

    進程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    :操作系統(tǒng)分配資源的最小單位,自帶「獨立戶口本」(虛擬地址空間)和「保鏢團隊」(系統(tǒng)級資源)。 技術細節(jié): 每個進程都有自己獨立的內(nèi)存空間(就像你家的房子,別人不能隨便進) 創(chuàng)建
    發(fā)表于 03-26 09:27