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

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

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

3天內不再提示

page struct的三種存放方式

Linux閱碼場 ? 來源:Linuxer ? 2020-08-03 16:33 ? 次閱讀

隨著硬件能力的提升,系統(tǒng)內存容量變得越來越大。尤其是在服務器上,過T級別的內存容量也已經不罕見了。

如此海量內存給內核帶來了很多挑戰(zhàn),其中之一就是page struct存放在哪里。

page struct的三種存放方式

在內核中,我們將物理內存按照頁大小進行管理。這樣每個頁就對應一個page struct作為這個頁的管理數(shù)據(jù)結構。

隨著內存容量的增加,相對應的page struct也就增加。而這部分內存和其他的內存略有不同,因為這部分內存不能給到頁分配器。也就是必須在系統(tǒng)能夠正常運行起來之前就分配好。

在內核中我們可以看到,為了應對這樣的變化進化出了幾個不同的版本。有幸的是,這部分內容我們現(xiàn)在還能在代碼中直接看到,因為這個實現(xiàn)是通過內核配置來區(qū)分的。我們通過查找_pfn_to_page的定義就能發(fā)現(xiàn)一下幾種memory model:

CONFIG_FLATMEM

CONFIG_SPARSEMEM

CONFIGSPARSEMEMVMEMMAP

接下來讓小編給各位看官一一道來。

1) FLATMEM

在這種情況下,宏_pfn_to_page的定義是:

#define__pfn_to_page(pfn)(mem_map+((pfn)-ARCH_PFN_OFFSET))

而這個mem_map的定義是

structpage*mem_map;

所以在這種情況下,page struct就是一個大數(shù)組,所有的人都按照自己的物理地址有序得挨著。

2) SPARSEMEM

雖然第一種方式非常簡單直觀,但是有幾個非常大的缺點:

內存如果有空洞,那么中間可能會有巨大的page struct空間浪費

所有的page struct內存都在一個NUMA節(jié)點上,會耗盡某一個節(jié)點內存,甚至是分配失敗

且會產生夸NUMA訪問導致性能下降

所以第二種方式就是將內存按照一定粒度,如128M,劃分了section,每個section中有個成員指定了對應的page struct的存儲空間。

這樣就解決了上述的幾個問題:

如果有空洞,那么對應的 page struct就不會占用空間

每個section對應的page struct是屬于本地NUMA的

怎么樣,是不是覺得很完美。這一部分具體的實現(xiàn)可以可以看函數(shù)sparse_init()函數(shù)。

有了這個基礎知識,我們再來看這種情況下_pfn_to_page的定義:

#define __pfn_to_page(pfn) ({ unsigned long __pfn = (pfn); struct mem_section *__sec = __pfn_to_section(__pfn); __section_mem_map_addr(__sec) + __pfn; })

就是先找到pfn對應的section,然后在section中保存的地址上翻譯出對應pfn的page struct。

既然講到了這里,我們就要對sparsemem中重要的組成部分mem_section多說兩句。

先來一張mem_section的整體圖解:

這是一個 NRSECTIONROOTS x SECTIONSPERROOT的二維數(shù)組。其中每一個成員就代表了我們剛才提到的128M內存。

當然最開始它不是這個樣子的。

其實最開始這個數(shù)組是一個靜態(tài)數(shù)組。很明顯這么做帶來的問題是這個數(shù)組定義太大太小都不合適。所以后來引進了CONFIGSPARSEMEMEXTREME編譯選項,當設置為y時,這個數(shù)組就變成了動態(tài)的。

如果上面這個算作是空間上的限制的話,那么接下來就是一個時間上的限制了。

在系統(tǒng)初始化時,每個mem_section都要和相應的內存空間關聯(lián)。在老版本上,這個步驟通過對整個數(shù)組接待完成。原來的版本上問題不大,因為整個數(shù)組的大小還沒有很大。但隨著內存容量的增加,這個數(shù)值就變得對系統(tǒng)有影響了。如果系統(tǒng)上確實有這么多內存,那么確實需要初始化也就忍了。但是在內存較小的系統(tǒng)上,哪怕沒有這么多內存,還是要挨個初始化,那就浪費了太多的時間。

commit c4e1be9ec1130fff4d691cdc0e0f9d666009f9aeAuthor: Dave Hansen Date: Thu Jul 6 15:36:44 2017 -0700 mm, sparsemem: break out of loops earl

Dave在這個提交中增加了對系統(tǒng)最大存在內存的跟蹤,來減少不必要的初始化時間。

瞧,內核代碼一開始其實也沒有這么高大上不是。

3) SPARSEMEM_VMEMMAP

最后要講的,也是當前x86系統(tǒng)默認配置的內存模型是SPARSEMEM_VMEMMAP。那為什么要引入這么一個新的模型呢?那自然是sparsemem依然有不足。

細心的朋友可能已經注意到了,前兩種內存模型在做pfn到page struct轉換是有著一些些的差異。為了看得清,我們把這兩個定義再拿過來對比一下:

先看看FLATMEM時的定義:

#define__pfn_to_page(pfn)(mem_map+((pfn)-ARCH_PFN_OFFSET))

再來看看使用SPASEMEM后的定義:

#define __pfn_to_page(pfn) ({ unsigned long __pfn = (pfn); struct mem_section *__sec = __pfn_to_section(__pfn); __section_mem_map_addr(__sec) + __pfn; })

更改后,需要先找到section,然后再從section->memmap的內容中換算出page的地址。

不僅計算的內容多了,更重要的是還有一次訪問內存的操作

可以想象,訪問內存和單純計算之間的速度差異那是巨大的差距。

既然產生了這樣的問題,那有沒有辦法解決呢?其實說來簡單,內核開發(fā)者利用了我們常見的一個內存單元來解決這個問題。

頁表

是不是很簡單粗暴?如果我們能夠通過某種方式將page struct線性映射到頁表,這樣我們不就能又通過簡單的計算來換算物理地址和page struct了么?

內核開發(fā)者就是這么做的,我們先來看一眼最后那簡潔的代碼:

#define__pfn_to_page(pfn)(vmemmap+(pfn))

經過內核開發(fā)這的努力,物理地址到page struct的轉換又變成如此的簡潔。不需要訪問內存,所以速度的問題得到了解決。

但是天下沒有免費的午餐,世界哪有這么美好,魚和熊掌可以兼得的情況或許只有在夢境之中。為了達到如此簡潔的轉化,我們是要付出代價的。為了實現(xiàn)速度上的提升,我們付出了空間的代價。

至此引出了計算機界一個經典的話題

時間和空間的轉換

話不多說,也不矯情了,我們來看看內核中實現(xiàn)的流程。

既然是利用了頁表進行轉換,那么自然是要構建頁表在做這樣的映射。這個步驟主要由函數(shù)vmemmap_populate()來完成,其中還區(qū)分了有沒有大頁的情況。我們以普通頁的映射為例,看看這個實現(xiàn)。

int __meminit vmemmap_populate_basepages(unsigned long start, unsigned long end, int node){ unsigned long addr = start; pgd_t *pgd; p4d_t *p4d; pud_t *pud; pmd_t *pmd; pte_t *pte; for (; addr < end; addr += PAGE_SIZE) { pgd = vmemmap_pgd_populate(addr, node); if (!pgd) return -ENOMEM; p4d = vmemmap_p4d_populate(pgd, addr, node); if (!p4d) return -ENOMEM; pud = vmemmap_pud_populate(p4d, addr, node); if (!pud) return -ENOMEM; pmd = vmemmap_pmd_populate(pud, addr, node); if (!pmd) return -ENOMEM; pte = vmemmap_pte_populate(pmd, addr, node); if (!pte) return -ENOMEM; vmemmap_verify(pte, node, addr, addr + PAGE_SIZE); } return 0;}

內核代碼的優(yōu)美之處就在于,你可能不一定看懂了所有細節(jié),但是從優(yōu)美的結構上能猜到究竟做了些什么。上面這段代碼的工作就是對每一個頁,按照層級去填充頁表內容。其中具體的細節(jié)就不在這里展開了,相信有興趣的同學會自行去探索。

那這么做的代價究竟是多少呢?

以x86為例,每個section是128M,那么每個section的page struct正好是2M,也就是一個大頁。

(128M / 4K) * 64 = (128 * (1 < 20) / (1 < 12)) * 64 = 2M

假如使用大頁做頁表映射,那么每64G才用掉一個4K頁表做映射。

128M * 512 = 64G

所以在使用大頁映射的情況下,這個損耗的級別在百萬分之一。還是能夠容忍的。

好了,我們終于沿著內核發(fā)展的歷史重走了一遍安放page struct之路。相信大家在這一路上領略了代碼演進的樂趣,也會對以后自己代碼的設計有了更深的思考。

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

    關注

    12

    文章

    9123

    瀏覽量

    85324
  • 數(shù)據(jù)結構

    關注

    3

    文章

    573

    瀏覽量

    40123
  • PAGE
    +關注

    關注

    0

    文章

    11

    瀏覽量

    20180

原文標題:page結構體,何處安放你的靈魂?

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

收藏 人收藏

    評論

    相關推薦

    systemd journal收集日志的三種方式

    隨著 systemd 成了主流的 init 系統(tǒng),systemd 的功能也在不斷的增加,比如對系統(tǒng)日志的管理。Systemd 設計的日志系統(tǒng)好處多多,這里筆者就不再贅述了,本文筆者主要介紹 systemd journal 收集日志的三種方式
    的頭像 發(fā)表于 10-23 11:50 ?234次閱讀
    systemd journal收集日志的<b class='flag-5'>三種</b><b class='flag-5'>方式</b>

    Windows管理內存的三種主要方式

    Windows操作系統(tǒng)提供了多種方式來管理內存,以確保系統(tǒng)資源的有效利用和性能的優(yōu)化。以下是關于Windows管理內存的三種主要方式的詳細闡述,包括堆內存管理、虛擬內存管理以及共享內存管理,每種
    的頭像 發(fā)表于 10-12 17:09 ?699次閱讀

    typedef struct和直接struct的區(qū)別

    使用方式和靈活性上存在一些區(qū)別。下面詳細解釋這兩方式的區(qū)別和用法。 直接使用 struct 當你直接使用 struct 關鍵字定義一個結構
    的頭像 發(fā)表于 08-20 10:58 ?2712次閱讀

    常用的pwm跟蹤控制方式是哪三種

    PWM(脈寬調制)跟蹤控制是一廣泛應用于電機控制、電源管理、通信等領域的技術。它通過調整脈沖的寬度來控制輸出信號的占空比,從而實現(xiàn)對系統(tǒng)的精確控制。常用的PWM跟蹤控制方式主要有三種:增量式PWM
    的頭像 發(fā)表于 08-14 10:34 ?1119次閱讀

    計算機網絡中的三種通信方式

    計算機網絡中的三種通信方式,即單工通信、半雙工通信和全雙工通信,是理解和設計高效網絡架構的基礎。每種通信方式都有其獨特的特性、應用場景及優(yōu)缺點。以下是對這三種通信
    的頭像 發(fā)表于 08-07 15:00 ?2471次閱讀

    簡述斬波電路的三種控制方式

    斬波電路是一常見的電力電子器件,廣泛應用于直流電壓調節(jié)、電壓變換、電流變換等領域。它可以實現(xiàn)對電流和電壓的控制,以滿足不同的電氣設備的需求。斬波電路的控制方式主要有三種:脈寬調制控制、頻率調制控制
    的頭像 發(fā)表于 03-11 15:22 ?3855次閱讀

    熱傳遞的三種方式是什么

    熱傳遞有三種基本形式:導熱(Thermal Conduction)、對流(Thermal Convection)和輻射(Thermal Radiation)。每種形式都有其獨特的物理過程和應用領域
    的頭像 發(fā)表于 02-06 14:02 ?2219次閱讀
    熱傳遞的<b class='flag-5'>三種</b><b class='flag-5'>方式</b>是什么

    光耦隔離 電容隔離 磁隔離這三種隔離方式各有什么優(yōu)缺點?

    光耦隔離、電容隔離和磁隔離是三種常見的隔離方式,它們各有優(yōu)缺點,適用于不同的應用場景。
    的頭像 發(fā)表于 01-30 15:38 ?5825次閱讀

    介紹三種建模方式

    據(jù)量大,而是指樣本的完備性。還有就是大數(shù)據(jù)或者AI被專業(yè)學者或者行業(yè)工程師所詬病的就是,純粹的數(shù)據(jù)驅動搞不出所以然出來,需要領域知識(即Domain Knowledge)的協(xié)助。此外,還有第三種建模方式就是混合驅動,即基礎物理模型加上數(shù)據(jù)驅動的
    的頭像 發(fā)表于 01-23 10:48 ?1802次閱讀

    運動控制的三種控制方式

    非標項目中有非常多的運動控制,根據(jù)系統(tǒng)配置、電機類型以及精度需求的不同主要有三種控制方式:開環(huán)控制、半閉環(huán)控制、全閉環(huán)控制。
    的頭像 發(fā)表于 01-23 09:48 ?1465次閱讀
    運動控制的<b class='flag-5'>三種</b>控制<b class='flag-5'>方式</b>

    嵌入式Linux開發(fā)的三種方式

    嵌入式Linux開發(fā)主要有三種方式:裸機開發(fā)、SDK開發(fā)和驅動開發(fā)。
    的頭像 發(fā)表于 01-22 14:22 ?960次閱讀

    通過TestStand三種主要運行方式探究TestStand開放式架構

    在這張圖中,我們可以看到三種主要運行方式分別是”Test UUTs”、”Single Pass”、”Run MainSequence”。大家不妨先嘗試一下看看同一個序列文件用三種運行方式
    的頭像 發(fā)表于 01-19 17:34 ?4671次閱讀
    通過TestStand<b class='flag-5'>三種</b>主要運行<b class='flag-5'>方式</b>探究TestStand開放式架構

    自動控制的基本方式三種是什么

    自動控制是指利用特定的設備和技術手段,通過對被控制系統(tǒng)的輸入信號進行監(jiān)測和調整,以實現(xiàn)期望的輸出狀態(tài)或目標。自動控制的基本方式三種:開環(huán)控制、閉環(huán)控制和神經網絡控制。 第一基本方式
    的頭像 發(fā)表于 01-17 09:38 ?3543次閱讀

    分布式鎖的三種實現(xiàn)方式

    分布式鎖的三種實現(xiàn)方式? 分布式鎖是在分布式系統(tǒng)中用于實現(xiàn)對共享資源進行訪問控制的一機制。分布式鎖的實現(xiàn)需要考慮高可用性、高性能和正確性等方面的問題。在實際應用中,有多種不同的方式
    的頭像 發(fā)表于 12-28 10:01 ?894次閱讀

    伺服電機的三種控制方式 如何確定選擇伺服電機控制方式?

    伺服電機的三種控制方式 如何確定選擇伺服電機控制方式? 伺服電機是一能夠根據(jù)輸入信號實時調整轉速和位置的電動機。它通常用于需要高精度、高效率、高可靠性的工業(yè)領域,如機床、機器人、印刷
    的頭像 發(fā)表于 12-26 14:02 ?1599次閱讀
    主站蜘蛛池模板: 窝窝午夜色视频国产精品东北| 热综合一本伊人久久精品| 青青草原伊人网| 先锋影音av资源站av| 中文字幕国产在线观看| 二色AV天堂在线| 久久国产精品无码视欧美| 欧美夜夜噜2017最新| 性盈盈剧场| 99亚洲精品自拍AV成人软件| 国产人妻人伦精品1国产| 老师真棒无遮瑕版漫画免费| 特级毛片内射WWW无码| 中文字幕人妻无码系列第三区| 攵女yin乱合集高h| 久久久久久久尹人综合网亚洲| 色 花 堂 永久 网站| 中文字幕在线观看网址| 国产精品第十页| 内射人妻骚骚骚| 亚洲午夜AV久久久精品影院色戒| seyeye免费高清观看| 久久国产精品福利影集| 无码11久岁箩筣| FREESEXVIDEO 性老少配| 精品久久久久久久高清| 四虎永久在线精品国产免费| 99re久久免费热在线视频手机| 寂寞夜晚视频在线观看| 丝袜诱惑qvod| a视频免费在线| 久久久96| 亚洲AV无码A片在线观看蜜桃| 成年人视频免费在线观看| 久久综合伊人 magnet| 美女内射少妇三区五区| 人妻天天爽夜夜爽三区麻豆A片| 日本高清二区| 1788vv视频| 扒开黑女人p大荫蒂老女人| 国产视频这里只有精品|