国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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】歡迎添加關注!文章轉載請注明出處。

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

    關注

    4

    文章

    1467

    瀏覽量

    42873
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219009
  • GFP
    GFP
    +關注

    關注

    0

    文章

    5

    瀏覽量

    1582

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內核伙伴系統內存申請函數詳解:從原理到實戰

    Linux 內核中,內存管理是整個系統穩定運行的基石,而伙伴系統(Buddy System) 作為內核物理內存分配的核心機制,更是驅動開
    的頭像 發表于 02-10 16:58 ?3630次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>伙伴系統<b class='flag-5'>內存</b><b class='flag-5'>申請</b>函數詳解:從原理到實戰

    Linux內核大塊內存申請:從場景到落地全解析

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

    Linux內核的“心跳”:jiffies如何為系統計時?

    Linux 內核的世界里,有一個默默工作的 "計時器"——jiffies。它不像我們手機上的時鐘那樣顯示年月日,卻掌控內核中絕大多數時間相關的操作:從進程調度到設備驅動的定時檢查
    的頭像 發表于 02-04 16:27 ?817次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內核</b>的“心跳”:jiffies如何為系統計時?

    Linux系統內核參數調優實戰指南

    Linux 內核參數調優是系統性能優化的核心環節。隨著云原生架構的普及和硬件性能的飛速提升,默認的內核參數配置往往無法充分發揮系統潛力。在高并發 Web 服務、大數據處理、容器化部署等場景下,合理的
    的頭像 發表于 01-28 14:27 ?426次閱讀

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

    最近這段時間內存條、硬盤的價格飛漲,隨著AI產品的興起,大數據模型的應用,對硬件存儲要求的更高。這節閱讀有關Linux內存管理方面的知識。 Linux系統使用了“虛擬
    發表于 01-16 20:05

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】Linux內核開發基礎

    感謝電子發燒友論壇提供的《Linux設備驅動開發(第2版)》閱讀機會,測評將從Linux內核開發基礎、Linux內核平臺抽象和設備驅動程序、
    發表于 01-12 22:45

    rk基于linux/android內存管理

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

    Linux-RT特點及簡單應用

    :CFS調度器的設計重點是優化多任務系統的整體吞吐量和響應時間,而不是嚴格保證任務的實時性。這意味著在高負載情況下,某些任務可能會經歷延遲或不確定的響應時間。 不可預測性:由于CFS調度器的非實時性質
    發表于 12-05 07:37

    電能質量在線監測裝置通過了CQC認證意味著什么?

    LZ-100電能質量在線監測裝置 電能質量在線監測裝置通過CQC 認證(中國質量認證中心認證),意味著該裝置在合規性、技術性能、安全性、可靠性等核心維度,均符合國家 / 行業相關標準及 CQC 認證
    的頭像 發表于 09-03 15:57 ?770次閱讀
    電能質量在線監測裝置通過了CQC認證<b class='flag-5'>意味著</b>什么?

    自動駕駛“單車智能”并不意味著不聯網?

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

    如何配置和驗證Linux內核參數

    Linux系統運維和性能優化中,內核參數(sysctl)的配置至關重要。合理的參數調整可以顯著提升網絡性能、系統穩定性及資源利用率。然而,僅僅修改參數是不夠的,如何驗證這些參數是否生效同樣關鍵。
    的頭像 發表于 05-29 17:40 ?1150次閱讀

    如何維護i.MX6ULL的安全內核

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

    樹莓派4 性能大比拼:標準Linux與實時Linux 4.19內核的延遲測試

    引言本文是對我之前關于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標準內核,以及應用了RT補丁的相似內核版本。對于實時版,我
    的頭像 發表于 03-25 09:39 ?809次閱讀
    樹莓派4 性能大比拼:標準<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內核</b>的延遲測試

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-驅動基本介紹

    驅動程序到內核意味著將驅動代碼與內核代碼合并,并通過重新編譯整個內核將其包含在內核鏡像中。這種方式將驅動程序與
    發表于 03-10 17:03

    飛凌嵌入式ElfBoard ELF 1板卡-驅動基本介紹

    驅動程序到內核意味著將驅動代碼與內核代碼合并,并通過重新編譯整個內核將其包含在內核鏡像中。這種方式將驅動程序與
    發表于 03-07 10:19