色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

Linux內核中用GFP_ATOMIC申請內存意味著什么

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2021-01-04 13:43 ? 次閱讀

本文目的

本文補充校正一些Linux內核開發者關于GFP_ATOMIC的認知不完整的地方,闡述GFP_ATOMIC與free內存watermark的關系,并明確什么時候應該用GFP_ATOMIC申請內存。目錄:

1. GFP_ATOMICvs. GFP_KERNEL

2. 內存水位,PF_MEMALLOC和GFP_ATOMIC

3. 何時使用GFP_ATOMIC(一個patch分析)

GFP_ATOMICvs. GFP_KERNEL

我們都知道,在中斷、軟中斷、spinlock等原子上下文里面,申請內存,應該使用GFP_ATOMIC標記,譬如內核中有大量的kmalloc/GFP_ATOMIC的例子:

fd0acb90-4e4c-11eb-8b86-12bb97331649.png

對于不可睡眠的上下文,如果我們用常規的GFP_KERNEL這樣的標記去申請內存,可能引發直接的內存reclaim,從而引起睡眠,所以GFP_KERNEL這種標記只適合進程上下文調用:

fd396c0c-4e4c-11eb-8b86-12bb97331649.png

GFP_KERNEL的標記可以引發直接的內存回收,從而導致進程阻塞睡眠,這在原子上下文顯然是不允許的。

#define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS) #define __GFP_RECLAIM ((__force gfp_t)(___GFP_DIRECT_RECLAIM|___GFP_KSWAPD_RECLAIM)

內存水位,PF_MEMALLOC和GFP_ATOMIC

那么GFP_ATOMIC是否僅僅意味著不能睡眠呢?檔案是否定的,GFP_ATOMIC還與內存reclaim的水位相關。下面這個圖是講述水位watermark的一個著名的圖,筆者懶得畫了,直接從網下copy過來:

fda0690c-4e4c-11eb-8b86-12bb97331649.jpg

在Linux中,內存有3個水位:

HIGH:系統的free內存大于HIGH水位的時候,是一個相對保險的值,不需要急著做內存回收(reclaim);

LOW: 系統的free內存達到LOW水位的時候,啟動后臺kswapd進行內存回收,回收的目標是讓空閑內存達到HIGH水位;

MIN:系統應該保有的最小free內存,當空閑內存達到這個值的時候,kswapd的后臺回收可能來不及了,一般用戶在申請內存的時候,進行DIRECT RECLAIM。

min水位一般是系統自動換算的,其具體值可以從/proc看出:

# cat /proc/sys/vm/min_free_kbytes 45056

而LOW水位一般是min*125%,HIGH 一般是min*150%。

MIN水位以下的內存,只能被緊急情況下的用戶申請到,最著名的緊急用戶莫過于PF_MEMALLOC用戶,task_struct設置了這個標記表示忽略MIN水位。比如回收內存的代碼本身也可能需要申請內存,這個時候我們應該給它無限制的申請能力。典型地,比如kswapd就設置了這個標記,這個代碼里面的注釋也非常精彩:

fddec24c-4e4c-11eb-8b86-12bb97331649.png

如果我們不允許回收內存的代碼申請min以下的內存,則回收內存的代碼可以觸發回收內存,這樣“子子孫孫,無窮匱也”。

當然,PF_MEMALLOC不是唯一的緊急用戶,GFP_ATOMIC實際也是一個“半緊急”任務:

說它“緊急”,是因為如果原子上下文申請內存失敗,往往意味著相應的中斷、軟中斷、spinlock內部的代碼就會執行失敗,而我們又不會因為這種失敗,而去嘗試內存回收,這顯然比較慘,我們應該盡可能讓GFP_ATOMIC申請成功;

說它“半”,是因為它不至于緊急到PF_MEMALLOC這個程度,如果我們給它無限地申請到free內存為0的權力,則會導致PF_MEMALLOC沒有內存了。想想,如果征糧隊的人都餓死了,還怎么去征糧呢?

所以,內存的設計選擇是,當有人用GFP_ATOMIC申請內存的時候,允許它從MIN水位以下,申請一定數量的內存。什么叫“一定數量”呢?就是不能讓GFP_ATOMIC導致free 內存觸底,GFP_ATOMIC還包含了高優先級的含義:

#define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM)

注意這個里面的__GFP_HIGH不是HIGHMEM高端內存的意思,而是高優先級。

當我們用GFP_ATOMIC申請內存的時候,內核的水位檢查代碼,會允許我們觸及到MIN水位以下的1/2:

fe13730c-4e4c-11eb-8b86-12bb97331649.png

那么,“魔鬼”就是在畫紅圈的2行代碼。但是,如果我們進一步深究,會發現,GFP_ATOMIC不只是觸及1/2*min,它甚至可以觸及1/4*min,因為GFP_ATOMIC中的__GFP_HIGH讓ALLOC_HIGH成立,而__GFP_ATOMIC讓ALLOC_HARDER成立:

fe5222dc-4e4c-11eb-8b86-12bb97331649.png

所以,“魔鬼”又隱藏在了gfp_to_alloc_flags()的細節里。

一個patch的例子

在具體的工程實戰中,我們建議:

原子上下文使用GFP_ATOMIC

比如在網絡設備驅動drivers/net/ethernet中,就有大量的案例

fe6582dc-4e4c-11eb-8b86-12bb97331649.png

在內存緊急的路徑上(比如不想睡眠,要求低延遲;或者要求內存吃緊的情況下,仍然可以從min水位以下申請內存),哪怕是進程上下文,我們也建議可以考慮使用GFP_ATOMIC

比如田濤童鞋最近在mm/zswap.c發的RFC patch:

https://lore.kernel.org/linux-mm/1608894171-54174-2-git-send-email-tiantao6@hisilicon.com/

fe85c902-4e4c-11eb-8b86-12bb97331649.png

fea50934-4e4c-11eb-8b86-12bb97331649.png

上面2個地方,其實都是可以睡眠的進程上下文,但是我們認為在frontendswap的路徑上,我們對延遲敏感,對swap內存過程中進一步引發內存回收也擔憂,因此,這里哪怕是非原子上下文,我們也沒有使用GFP_KERNEL。

責任編輯:xj

原文標題:宋寶華:Linux內核中用GFP_ATOMIC申請內存究竟意味著什么?

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

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

    關注

    3

    文章

    1372

    瀏覽量

    40298
  • Linux
    +關注

    關注

    87

    文章

    11310

    瀏覽量

    209601
  • GFP
    GFP
    +關注

    關注

    0

    文章

    5

    瀏覽量

    1417

原文標題:宋寶華:Linux內核中用GFP_ATOMIC申請內存究竟意味著什么?

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

收藏 人收藏

    評論

    相關推薦

    ADS1274沒有DRDY信號輸出,是否意味著芯片已經損壞?

    ADS1274有CLK信號,但是沒有DRDY信號輸出,是否意味著芯片已經損壞? 芯片工作正常應該一直有DRDY信號輸出的,之前芯片一直是正常的,接了個傳感器加載測試結果DRDY就沒輸出了,傳感器
    發表于 12-31 07:34

    Linux下如何管理虛擬內存 使用虛擬內存時的常見問題

    Linux系統中,虛擬內存管理是操作系統內核的一個重要功能,負責管理物理內存和磁盤上的交換空間。以下是對Linux下如何管理虛擬
    的頭像 發表于 12-04 09:19 ?414次閱讀

    在ADS8320的規格書里,Tcsd最大為0ns,請問這是不是意味著Dclock極性只能是空閑為低?

    在ADS8320的規格書里,Tcsd最大為0ns,請問這是不是意味著Dclock極性只能是空閑為低?
    發表于 11-29 06:47

    ADC的數據表給出了±VREF的輸入范圍,是否意味著可以測量相對于接地的負電壓?

    我的 ADC 的數據表給出了 ±VREF 的輸入范圍。這是否意味著我可以測量相對于接地的負電壓?
    發表于 11-26 08:22

    ADS1262浮空測量波動大,是否意味著連接上信號實測波動也會很大?

    : 1.這樣的測試數據是否具有參考價值?換句話說,浮空測量波動大,是否意味著連接上信號實測波動也會很大? 2.USB轉TTL芯片接電腦輸出的5V電壓是否不夠穩定,無法正確反應采集效果?
    發表于 11-19 06:17

    請問固定增益芯片是否意味著不能通過改變外圍參數來改變增益?

    固定增益芯片是否意味著我不能通過改變外圍參數來改變增益?
    發表于 09-11 07:13

    Linux內核測試技術

    Linux 內核Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規
    的頭像 發表于 08-13 13:42 ?504次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>測試技術

    想要對脈寬3ns的脈沖信號進行放大,是不是意味著我選放大器時的響應時間要小于3ns?

    想要對脈寬3ns的脈沖信號進行放大,是不是意味著我選放大器時的響應時間要小于3ns?
    發表于 08-08 07:31

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    自誕生以來的最大一次升級換代。HarmonyOS NEXT不依賴傳統的Unix內核Linux內核,而是依靠自主的鴻蒙內核。這就意味著,鴻蒙
    的頭像 發表于 06-27 11:30 ?849次閱讀

    可以在RTOS的任何位置使用malloc申請內存了嗎?

    今天看了CubeIDE 1.7.0的release note ,里面寫的一條新特性是:Thread-safe malloc solution 這是否意味著我可以在RTOS的任何位置使用malloc申請內存了?
    發表于 04-03 07:23

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

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

    Linux內核內存管理之ZONE內存分配器

    內核中使用ZONE分配器滿足內存分配請求。該分配器必須具有足夠的空閑頁幀,以便滿足各種內存大小請求。
    的頭像 發表于 02-21 09:29 ?906次閱讀

    linux內核主要由哪幾個部分組成,作用是什么

    Linux內核主要由以下幾個部分組成: 進程管理:Linux內核負責管理和調度系統中的進程。它通過進程調度算法來決定哪個進程在什么時間運行以及如何分配系統資源。
    的頭像 發表于 01-22 14:34 ?2703次閱讀

    ADM1191本身芯片電源為3.15到26V,是否意味著SENSE端只能測試接近這個范圍的電壓?

    小弟我是一個尚在學習過程的學生,現如今試圖用ADM1191芯片測試其他電路的電流, 有兩個問題想要請教: 1、ADM1191本身芯片電源為3.15到26V,是否意味著SENSE端只能測試接近這個
    發表于 01-09 06:15

    Linux內核內存管理架構解析

    內存管理子系統可能是linux內核中最為復雜的一個子系統,其支持的功能需求眾多,如頁面映射、頁面分配、頁面回收、頁面交換、冷熱頁面、緊急頁面、頁面碎片管理、頁面緩存、頁面統計等,而且對性能也有很高
    的頭像 發表于 01-04 09:24 ?668次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b><b class='flag-5'>內存</b>管理架構解析
    主站蜘蛛池模板: 久久国语精品| 精品一区二区三区在线成人| 国产 在线 亚洲 欧美 动漫| 男女床上黄色| 用震蛋调教女性下面视频| 国产熟妇无码一区二| 熟女少妇内射日韩亚洲| 成人小视频在线观看免费| 欧美极限扩肛| 99国产在线精品观看二区| 快播电影官方网站| 影音先锋色小姐| 久久亚洲A片COM人成A | 94vvv男人的天堂| 理论片午午伦夜理片I| 在线免费中文字幕| 捆绑调教网站| 97精品少妇偷拍蜜桃AV| 女侠含泪巨臀迎合79| 啊灬啊别停灬用力啊在线观看视频| 欧美激情视频一区| 爱情岛论坛网亚洲品质| 色列少女漫画| 国产毛A片啊久久久久久A| 亚洲精品91| 久久一区精品| hdsex老太婆70| 三色午夜秀| 果冻传媒最新视频在线观看| 亚洲一区二区三区高清网| 久久中文字幕乱码免费| 99在线免费| 视频网站入口在线看| 黑人巨茎vide抽搐| 在线免费观看成年人视频| 女人一级毛片免费视频观看| 高H辣肉办公室| 亚洲伊人精品综合在合线| 免费观看的毛片| 国产AV国产精品国产三级在线L| 亚洲地址一地址二地址三|