91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

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

Linux內(nèi)核中用GFP_ATOMIC申請內(nèi)存意味著什么

Linux閱碼場 ? 來源:Linuxer ? 作者:Linuxer ? 2021-01-04 13:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文目的

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

1. GFP_ATOMICvs. GFP_KERNEL

2. 內(nèi)存水位,PF_MEMALLOC和GFP_ATOMIC

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

GFP_ATOMICvs. GFP_KERNEL

我們都知道,在中斷、軟中斷、spinlock等原子上下文里面,申請內(nèi)存,應(yīng)該使用GFP_ATOMIC標(biāo)記,譬如內(nèi)核中有大量的kmalloc/GFP_ATOMIC的例子:

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

對于不可睡眠的上下文,如果我們用常規(guī)的GFP_KERNEL這樣的標(biāo)記去申請內(nèi)存,可能引發(fā)直接的內(nèi)存reclaim,從而引起睡眠,所以GFP_KERNEL這種標(biāo)記只適合進程上下文調(diào)用:

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

GFP_KERNEL的標(biāo)記可以引發(fā)直接的內(nèi)存回收,從而導(dǎo)致進程阻塞睡眠,這在原子上下文顯然是不允許的。

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

內(nèi)存水位,PF_MEMALLOC和GFP_ATOMIC

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

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

在Linux中,內(nèi)存有3個水位:

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

LOW: 系統(tǒng)的free內(nèi)存達到LOW水位的時候,啟動后臺kswapd進行內(nèi)存回收,回收的目標(biāo)是讓空閑內(nèi)存達到HIGH水位;

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

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

# cat /proc/sys/vm/min_free_kbytes 45056

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

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

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

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

當(dāng)然,PF_MEMALLOC不是唯一的緊急用戶,GFP_ATOMIC實際也是一個“半緊急”任務(wù):

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

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

所以,內(nèi)存的設(shè)計選擇是,當(dāng)有人用GFP_ATOMIC申請內(nèi)存的時候,允許它從MIN水位以下,申請一定數(shù)量的內(nèi)存。什么叫“一定數(shù)量”呢?就是不能讓GFP_ATOMIC導(dǎo)致free 內(nèi)存觸底,GFP_ATOMIC還包含了高優(yōu)先級的含義:

#define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM)

注意這個里面的__GFP_HIGH不是HIGHMEM高端內(nèi)存的意思,而是高優(yōu)先級。

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

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

那么,“魔鬼”就是在畫紅圈的2行代碼。但是,如果我們進一步深究,會發(fā)現(xiàn),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()的細節(jié)里。

一個patch的例子

在具體的工程實戰(zhàn)中,我們建議:

原子上下文使用GFP_ATOMIC

比如在網(wǎng)絡(luò)設(shè)備驅(qū)動drivers/net/ethernet中,就有大量的案例

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

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

比如田濤童鞋最近在mm/zswap.c發(fā)的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內(nèi)存過程中進一步引發(fā)內(nèi)存回收也擔(dān)憂,因此,這里哪怕是非原子上下文,我們也沒有使用GFP_KERNEL。

責(zé)任編輯:xj

原文標(biāo)題:宋寶華:Linux內(nèi)核中用GFP_ATOMIC申請內(nèi)存究竟意味著什么?

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

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

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41396
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11508

    瀏覽量

    213653
  • GFP
    GFP
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    1499

原文標(biāo)題:宋寶華:Linux內(nèi)核中用GFP_ATOMIC申請內(nèi)存究竟意味著什么?

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    自動駕駛“單車智能”并不意味著不聯(lián)網(wǎng)?

    [首發(fā)于智駕最前沿微信公眾號]隨著資金投入的不斷加大,越來越多車企選擇自研智駕系統(tǒng),這也就意味著單車智能的技術(shù)路徑成為行業(yè)的普遍選擇。從概念上來看,單車智能就是讓單個車輛的感知、決策和控制能力
    的頭像 發(fā)表于 06-17 08:56 ?232次閱讀
    自動駕駛“單車智能”并不<b class='flag-5'>意味著</b>不聯(lián)網(wǎng)?

    如何維護i.MX6ULL的安全內(nèi)核

    。 5.15 內(nèi)核系列將維護到 2026 年 12 月,這意味著將發(fā)布新版本,從而關(guān)閉已知漏洞。 不幸的是,據(jù)我所知,linux-imx 分支原則上不會使用較新的微版本進行更新;5.15.71 仍然是
    發(fā)表于 04-01 08:28

    AFE0064芯片手冊中把所有的地引腳都表示為GND,是不是就意味著不分數(shù)字地和模擬地呢?

    最近在用AFE0064設(shè)計一款產(chǎn)品,再畫版圖的時候遇到了問題,就是AFE0064芯片手冊中把所有的地引腳都表示為GND,是不是就意味著不分數(shù)字地和模擬地呢?如果后端AD分數(shù)字地和模擬地,為了達到更好的性能,GND應(yīng)該和數(shù)字地相連,還是模擬地鏈接呢?
    發(fā)表于 01-10 07:06

    ADS7230有兩個電源和兩個地,是不是意味著芯片內(nèi)部模擬部分和數(shù)字部分是隔離的?

    ADS7230有兩個電源和兩個地,是不是意味著芯片內(nèi)部模擬部分和數(shù)字部分是隔離的?或者是非隔離,只做電平轉(zhuǎn)換的?忘各位大俠解答,小弟不甚感激!!!
    發(fā)表于 01-08 08:21

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

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

    ADS8671 datasheet里寫的是小信號輸入-3db帶寬為15KHz,是不是意味著正常信號超過10K衰減已經(jīng)很厲害了?

    ADS8671這個芯片,datasheet里寫的是小信號輸入-3db帶寬為15KHz,是不是意味著正常信號超過10K衰減已經(jīng)很厲害了,那要1MSPS這么高的采樣速率有什么用?
    發(fā)表于 12-20 07:54

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

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

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

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

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

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

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

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

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

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

    linux驅(qū)動程序如何加載進內(nèi)核

    Linux系統(tǒng)中,驅(qū)動程序是內(nèi)核與硬件設(shè)備之間的橋梁。它們允許內(nèi)核與硬件設(shè)備進行通信,從而實現(xiàn)對硬件設(shè)備的控制和管理。 驅(qū)動程序的編寫 驅(qū)動程序的編寫是Linux驅(qū)動開發(fā)的基礎(chǔ)。在編
    的頭像 發(fā)表于 08-30 15:02 ?1090次閱讀

    linux驅(qū)動程序的編譯方法是什么

    Linux驅(qū)動程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯 和 編譯成獨立的內(nèi)核模塊 。以下是對這兩種方法的介紹: 一、與內(nèi)核一起編譯 與內(nèi)核
    的頭像 發(fā)表于 08-30 14:46 ?1241次閱讀

    Linux內(nèi)核測試技術(shù)

    Linux 內(nèi)核Linux操作系統(tǒng)的核心部分,負責(zé)管理硬件資源和提供系統(tǒng)調(diào)用接口。隨著 Linux 內(nèi)核的不斷發(fā)展和更新,其復(fù)雜性和代碼規(guī)
    的頭像 發(fā)表于 08-13 13:42 ?1239次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>測試技術(shù)

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

    想要對脈寬3ns的脈沖信號進行放大,是不是意味著我選放大器時的響應(yīng)時間要小于3ns?
    發(fā)表于 08-08 07:31
    主站蜘蛛池模板: 国产叼嘿网站免费观看不用充会员 | 亚洲黄网免费 | 女人被狂躁视频免费网站 | 亚洲成人国产 | 久久国产精品99久久久久久牛牛 | 美女在线看永久免费网址 | 日韩欧美高清色码 | 国产精品美女视频 | 免费观看成人欧美1314www | 1024亚洲视频 | 久久网站免费观看 | 亚洲国产精品乱码在线观看97 | 午夜一级影院 | 加勒比视频网站 | 免费在线你懂的 | 久久婷婷久久一区二区三区 | 欧美性猛交xxxx免费看久久 | 在线观看中文字幕一区 | 新版天堂中文资源8在线 | 一级片在线免费观看 | 精品国产影院 | 欧美大全| 国内黄色录像 | 在线理论视频 | 亚洲欧美色鬼久久综合 | 国产福利影视 | 狠狠色噜噜狠狠狠狠999米奇 | 毛片毛片毛片毛片毛片毛片 | 草馏社区 | 午夜看片在线观看 | 一区二区免费 | 国产亚洲综合精品一区二区三区 | 97色噜噜| 爱草视频| 日本高清一区二区三区不卡免费 | 午夜大片在线观看 | 日本免费色网站 | 欧美一级高清片欧美国产欧美 | 亚洲男人天堂手机版 | 国产精品 视频一区 二区三区 | 免费二级c片观看 |