91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

本文目的

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

1. GFP_ATOMICvs. GFP_KERNEL

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

3. 何時(shí)使用GFP_ATOMIC(一個(gè)patch分析)

GFP_ATOMICvs. GFP_KERNEL

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

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

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

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

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

#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)。下面這個(gè)圖是講述水位watermark的一個(gè)著名的圖,筆者懶得畫了,直接從網(wǎng)下copy過來:

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

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

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

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

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

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

# cat /proc/sys/vm/min_free_kbytes 45056

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

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

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

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

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

說它“緊急”,是因?yàn)槿绻由舷挛纳暾?qǐng)內(nèi)存失敗,往往意味著相應(yīng)的中斷、軟中斷、spinlock內(nèi)部的代碼就會(huì)執(zhí)行失敗,而我們又不會(huì)因?yàn)檫@種失敗,而去嘗試內(nèi)存回收,這顯然比較慘,我們應(yīng)該盡可能讓GFP_ATOMIC申請(qǐng)成功;

說它“半”,是因?yàn)樗恢劣诰o急到PF_MEMALLOC這個(gè)程度,如果我們給它無(wú)限地申請(qǐng)到free內(nèi)存為0的權(quán)力,則會(huì)導(dǎo)致PF_MEMALLOC沒有內(nèi)存了。想想,如果征糧隊(duì)的人都餓死了,還怎么去征糧呢?

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

#define GFP_ATOMIC (__GFP_HIGH|__GFP_ATOMIC|__GFP_KSWAPD_RECLAIM)

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

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

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

那么,“魔鬼”就是在畫紅圈的2行代碼。但是,如果我們進(jìn)一步深究,會(huì)發(fā)現(xiàn),GFP_ATOMIC不只是觸及1/2*min,它甚至可以觸及1/4*min,因?yàn)镚FP_ATOMIC中的__GFP_HIGH讓ALLOC_HIGH成立,而__GFP_ATOMIC讓ALLOC_HARDER成立:

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

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

一個(gè)patch的例子

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

原子上下文使用GFP_ATOMIC

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

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

在內(nèi)存緊急的路徑上(比如不想睡眠,要求低延遲;或者要求內(nèi)存吃緊的情況下,仍然可以從min水位以下申請(qǐng)內(nèi)存),哪怕是進(jìn)程上下文,我們也建議可以考慮使用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個(gè)地方,其實(shí)都是可以睡眠的進(jìn)程上下文,但是我們認(rèn)為在frontendswap的路徑上,我們對(duì)延遲敏感,對(duì)swap內(nèi)存過程中進(jìn)一步引發(fā)內(nèi)存回收也擔(dān)憂,因此,這里哪怕是非原子上下文,我們也沒有使用GFP_KERNEL。

責(zé)任編輯:xj

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

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

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

    關(guān)注

    4

    文章

    1468

    瀏覽量

    42888
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11763

    瀏覽量

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

    關(guān)注

    0

    文章

    5

    瀏覽量

    1582

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    Linux 內(nèi)核中,內(nèi)存管理是整個(gè)系統(tǒng)穩(wěn)定運(yùn)行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動(dòng)開
    的頭像 發(fā)表于 02-10 16:58 ?3634次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)<b class='flag-5'>內(nèi)存</b><b class='flag-5'>申請(qǐng)</b>函數(shù)詳解:從原理到實(shí)戰(zhàn)

    Linux內(nèi)核大塊內(nèi)存申請(qǐng):從場(chǎng)景到落地全解析

    網(wǎng)卡、硬盤等外設(shè)的 DMA 控制器,要求內(nèi)存物理地址連續(xù)(無(wú)法識(shí)別虛擬地址映射),且需一次性分配大尺寸緩沖區(qū)(如 1GB 網(wǎng)絡(luò)幀緩存)。
    的頭像 發(fā)表于 02-09 16:41 ?680次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>大塊<b class='flag-5'>內(nèi)存</b><b class='flag-5'>申請(qǐng)</b>:從場(chǎng)景到落地全解析

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    Linux 內(nèi)核的世界里,有一個(gè)默默工作的 "計(jì)時(shí)器"——jiffies。它不像我們手機(jī)上的時(shí)鐘那樣顯示年月日,卻掌控內(nèi)核中絕大多數(shù)時(shí)間相關(guān)的操作:從進(jìn)程調(diào)度到設(shè)備驅(qū)動(dòng)的定時(shí)檢查
    的頭像 發(fā)表于 02-04 16:27 ?828次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實(shí)戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認(rèn)的內(nèi)核參數(shù)配置往往無(wú)法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務(wù)、大數(shù)據(jù)處理、容器化部署等場(chǎng)景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?454次閱讀

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

    最近這段時(shí)間內(nèi)存條、硬盤的價(jià)格飛漲,隨著AI產(chǎn)品的興起,大數(shù)據(jù)模型的應(yīng)用,對(duì)硬件存儲(chǔ)要求的更高。這節(jié)閱讀有關(guān)Linux內(nèi)存管理方面的知識(shí)。 Linux系統(tǒng)使用了“虛擬
    發(fā)表于 01-16 20:05

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開發(fā)基礎(chǔ)

    感謝電子發(fā)燒友論壇提供的《Linux設(shè)備驅(qū)動(dòng)開發(fā)(第2版)》閱讀機(jī)會(huì),測(cè)評(píng)將從Linux內(nèi)核開發(fā)基礎(chǔ)、Linux內(nèi)核平臺(tái)抽象和設(shè)備驅(qū)動(dòng)程序、
    發(fā)表于 01-12 22:45

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

    內(nèi)核對(duì)容量的識(shí)別), 64 位平臺(tái)上認(rèn)為所有內(nèi)存都可 用。然后通過一系列 reserve_xxx() 接口從內(nèi)存末尾往前預(yù)留需要的內(nèi)存,最后把自己 relocate 到某段 reser
    的頭像 發(fā)表于 12-15 10:42 ?215次閱讀
    rk基于<b class='flag-5'>linux</b>/android<b class='flag-5'>內(nèi)存</b>管理

    Linux-RT特點(diǎn)及簡(jiǎn)單應(yīng)用

    :CFS調(diào)度器的設(shè)計(jì)重點(diǎn)是優(yōu)化多任務(wù)系統(tǒng)的整體吞吐量和響應(yīng)時(shí)間,而不是嚴(yán)格保證任務(wù)的實(shí)時(shí)性。這意味著在高負(fù)載情況下,某些任務(wù)可能會(huì)經(jīng)歷延遲或不確定的響應(yīng)時(shí)間。 不可預(yù)測(cè)性:由于CFS調(diào)度器的非實(shí)時(shí)性質(zhì)
    發(fā)表于 12-05 07:37

    電能質(zhì)量在線監(jiān)測(cè)裝置通過了CQC認(rèn)證意味著什么?

    LZ-100電能質(zhì)量在線監(jiān)測(cè)裝置 電能質(zhì)量在線監(jiān)測(cè)裝置通過CQC 認(rèn)證(中國(guó)質(zhì)量認(rèn)證中心認(rèn)證),意味著該裝置在合規(guī)性、技術(shù)性能、安全性、可靠性等核心維度,均符合國(guó)家 / 行業(yè)相關(guān)標(biāo)準(zhǔn)及 CQC 認(rèn)證
    的頭像 發(fā)表于 09-03 15:57 ?794次閱讀
    電能質(zhì)量在線監(jiān)測(cè)裝置通過了CQC認(rèn)證<b class='flag-5'>意味著</b>什么?

    IMU的精度對(duì)無(wú)人機(jī)姿態(tài)控制意味著什么?

    IMU的精度對(duì)無(wú)人機(jī)姿態(tài)控制至關(guān)重要,是決定無(wú)人機(jī)飛行穩(wěn)定安全、響應(yīng)性和任務(wù)執(zhí)行能力的關(guān)鍵因素之一, IMU(包含三軸加速度計(jì)和三軸陀螺儀)是飛控系統(tǒng)實(shí)時(shí)估算無(wú)人機(jī)姿態(tài)(俯仰、橫滾、偏航角)的核心傳感器,直接決定了飛控系統(tǒng)“感知”自身姿態(tài)變化的準(zhǔn)確性和及時(shí)性。 ER-MIMU-043的技術(shù)優(yōu)勢(shì)直擊無(wú)人機(jī)對(duì)“小體積、高精度、低功耗”的需求,帶外殼尺寸僅40×40×42mm(80g),內(nèi)臺(tái)體壓縮至27×26×34mm(40g),可輕松集成于各類無(wú)人機(jī)中,大幅降
    的頭像 發(fā)表于 07-25 17:01 ?798次閱讀

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

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

    如何配置和驗(yàn)證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運(yùn)維和性能優(yōu)化中,內(nèi)核參數(shù)(sysctl)的配置至關(guān)重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡(luò)性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗(yàn)證這些參數(shù)是否生效同樣關(guān)鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1164次閱讀

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

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

    樹莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實(shí)時(shí)Linux 4.19內(nèi)核的延遲測(cè)試

    引言本文是對(duì)我之前關(guān)于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標(biāo)準(zhǔn)內(nèi)核,以及應(yīng)用了RT補(bǔ)丁的相似內(nèi)核版本。對(duì)于實(shí)時(shí)版,我
    的頭像 發(fā)表于 03-25 09:39 ?823次閱讀
    樹莓派4 性能大比拼:標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>與實(shí)時(shí)<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測(cè)試

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-驅(qū)動(dòng)基本介紹

    驅(qū)動(dòng)程序到內(nèi)核意味著將驅(qū)動(dòng)代碼與內(nèi)核代碼合并,并通過重新編譯整個(gè)內(nèi)核將其包含在內(nèi)核鏡像中。這種方式將驅(qū)動(dòng)程序與
    發(fā)表于 03-10 17:03