最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

一文玩轉(zhuǎn)Linux內(nèi)核架構(gòu)的內(nèi)存管理(NUMA模型中的內(nèi)存組織)

2022-05-19 13:54 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

一,概述

  • 內(nèi)存通過節(jié)點(diǎn)(pg_data_t)來管理,每個(gè)節(jié)點(diǎn)關(guān)聯(lián)到系統(tǒng)中的一個(gè)處理器節(jié)點(diǎn)又進(jìn)一步劃分為內(nèi)存域,是對(duì)內(nèi)存的進(jìn)一步細(xì)分,一個(gè)節(jié)點(diǎn)最多有3個(gè)內(nèi)存域。各個(gè)內(nèi)存域關(guān)聯(lián)了一個(gè)數(shù)組,用來組織屬于該內(nèi)存域的物理內(nèi)存頁(頁幀)。對(duì)各個(gè)頁幀,都分配了一個(gè)struct page實(shí)例以及所需的管理數(shù)據(jù)。除了節(jié)點(diǎn)自己的內(nèi)存域,每個(gè)節(jié)點(diǎn)還提供了一個(gè)備用列表(struct zonelist),該列表包含了其他節(jié)點(diǎn),可用于代替當(dāng)前節(jié)點(diǎn)分配內(nèi)存。

二,數(shù)據(jù)結(jié)構(gòu)

1. 內(nèi)存域類型

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。?!前100名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?

  1. node_zones:包含了節(jié)點(diǎn)內(nèi)各內(nèi)存域的數(shù)據(jù)結(jié)構(gòu).

  2. node_zonelists:指定了備用節(jié)點(diǎn)及其內(nèi)存域的列表,如果當(dāng)前節(jié)點(diǎn)沒有可用空間時(shí),可在備用節(jié)點(diǎn)內(nèi)分配內(nèi)存

  3. nr_zones:節(jié)點(diǎn)內(nèi)內(nèi)存域的個(gè)數(shù)

  4. node_mem_map:包含節(jié)點(diǎn)內(nèi)的所有物理內(nèi)存頁

  5. bdata:指向自舉內(nèi)存分配器數(shù)據(jù)結(jié)構(gòu)的實(shí)例

  6. node_start_pfn:該節(jié)點(diǎn)內(nèi)第一個(gè)頁幀的邏輯編號(hào),系統(tǒng)內(nèi)所有頁幀是依次編號(hào)的,每個(gè)頁幀的號(hào)碼是全局唯一的

  7. node_present_pages:節(jié)點(diǎn)中頁幀的個(gè)數(shù)

  8. node_spanned_pages:節(jié)點(diǎn)中包含空洞的頁幀個(gè)數(shù)

  9. node_id:全局節(jié)點(diǎn)ID

  10. pgdat_next:連接到下一個(gè)內(nèi)存節(jié)點(diǎn),系統(tǒng)中的所有內(nèi)存節(jié)點(diǎn)都通過單鏈表連接起來.

  11. kswapd_wait:交換守護(hù)進(jìn)程的等待隊(duì)列.


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!??!前100名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?


  1. 節(jié)點(diǎn)狀態(tài)管理數(shù)據(jù)結(jié)構(gòu)

  2. static inline void node_set_state(int node, enum node_states state)

  3. static inline void node_clear_state(int node, enum node_states state)

3.內(nèi)存域

  1. ZONE_PADDING:生成填充字段,使常用數(shù)據(jù)結(jié)構(gòu)處于自身的緩沖行中

  2. pages_min, pages_high,pages_low:頁換出時(shí)使用的內(nèi)存水印,如果內(nèi)存不足,內(nèi)核可以將頁寫到硬盤

  3. 空閑頁多于pages_high:內(nèi)存域是理想狀態(tài)

  4. 空閑頁低于pages_low:內(nèi)核開始將頁換出到硬盤

  5. 空閑頁低于page_min:頁回收工作壓力大

  6. lowmem_reserve:用于一些無論如何都不能失敗的關(guān)鍵性內(nèi)存分配,分別為各個(gè)內(nèi)存域指定了若干頁

  7. pageset:用于實(shí)現(xiàn)每個(gè)CPU的熱/冷頁幀列表,用于保存可用于滿足分配的新鮮頁,仍然在高速緩存中的稱為熱頁

  8. free_area:用于實(shí)現(xiàn)伙伴系統(tǒng),每個(gè)數(shù)組元素表示固定長(zhǎng)度的一些連續(xù)內(nèi)存區(qū)

  9. active_list:活動(dòng)頁的集合

  10. inactive_list:不活動(dòng)頁的集合

  11. nr_scan_active和nr_scan_inactive:內(nèi)存回收時(shí)需要掃描的活動(dòng)和不活動(dòng)頁的數(shù)據(jù)

  12. pages_scanned:從上次換出一頁以來,有多少頁未能成功掃描

  13. flags:內(nèi)存域的當(dāng)前狀態(tài)

  1. ZONE_ALL_UNRECLAIMABLE:頁無法回收

  2. ZONE_RECLAIM_LOCKED:CPU回收內(nèi)存域時(shí)設(shè)置,阻止其他CPU進(jìn)行同樣操作

  3. ZONE_OOM_LOCKED:內(nèi)核試圖殺死消耗進(jìn)程最多的進(jìn)程時(shí)設(shè)置該標(biāo)志位

  4. vm_stat:維護(hù)該內(nèi)存域的統(tǒng)計(jì)信息

  5. prev_priority:上一次掃描該內(nèi)存域的優(yōu)先級(jí)

  6. wait_table, wait_table_bits和wait_table_hash_nr_entries實(shí)現(xiàn)了一個(gè)等待隊(duì)列,可用于等待某一頁表變?yōu)榭捎玫倪M(jìn)程

  7. zone_pgdat:指向父節(jié)點(diǎn)

4.內(nèi)存域水印

  • 在計(jì)算內(nèi)存水印前,內(nèi)核首先要確定為關(guān)鍵性分配保留的內(nèi)存空間的最小值,該值隨可用內(nèi)存大小而非線性增長(zhǎng),并保存在全局變量min_free_kbytes中,一個(gè)不變的約束是不能少于128k也不能多于64MB。

  • 數(shù)據(jù)結(jié)構(gòu)中水印值的填充由init_per_zone_pages_min處理,該函數(shù)在內(nèi)核啟動(dòng)期間調(diào)用,主要調(diào)用如下兩個(gè)函數(shù):

  • setup_per_zone_pages_min負(fù)責(zé)設(shè)置struct zone中的pages_min,pages_low和pages_high成員,在計(jì)算出高端內(nèi)存區(qū)域之外的頁面總數(shù)后(保存在lowmem_pages),內(nèi)核迭代系統(tǒng)中的所有內(nèi)存域并執(zhí)行相關(guān)計(jì)算

  • lowmem_reserve的計(jì)算由setup_per_zone_lowmem_reserve完成,內(nèi)核迭代系統(tǒng)中所有節(jié)點(diǎn),對(duì)每個(gè)節(jié)點(diǎn)的各個(gè)內(nèi)存域分別計(jì)算預(yù)留內(nèi)存最小值

5. 冷熱頁

  • struct zone的pageset成員用于實(shí)現(xiàn)冷熱分配器,熱頁是指那些加載到CPU高速緩存的頁,其數(shù)據(jù)訪問速度比不在高速緩存中的冷頁快

  1. cout:該列表相關(guān)的頁的數(shù)目

  2. high:如果count > high則表明列表中的頁太多了

  3. list:雙鏈表,保存了當(dāng)前CPU的冷頁或者熱頁

6. 頁幀

  • 頁幀是系統(tǒng)內(nèi)存的最小單位,對(duì)內(nèi)存中的每一個(gè)頁都會(huì)創(chuàng)建struct page的一個(gè)實(shí)例

  • 頁的廣泛使用,增加了struct page的復(fù)雜性(內(nèi)核不同部分對(duì)相同的數(shù)據(jù)有不同的解釋)和保持結(jié)構(gòu)長(zhǎng)度的難度。

  1. slab,freelist和inuse用于slub分配器

  2. flags存儲(chǔ)了和體系結(jié)構(gòu)無關(guān)的標(biāo)志,用于描述頁的屬性

  3. _count是一個(gè)使用計(jì)數(shù),表示內(nèi)核中引用該頁的次數(shù)

  4. _mapcount表示在頁表中有多少項(xiàng)指向該頁

  5. lru是一個(gè)表頭,用于在各種鏈表上維護(hù)該頁,以便將頁按照不同類別分組,最重要的類別是活動(dòng)和不活動(dòng)頁

  6. 內(nèi)核可以將多個(gè)毗連的頁合并為較大的復(fù)合頁,第一個(gè)頁稱作首頁,而所有其余各頁叫做尾頁,所有尾頁對(duì)應(yīng)的page實(shí)例,都將first_page設(shè)置為指向首頁

  7. mapping指定了頁幀所在的地址空間,index是頁幀在映射內(nèi)部的偏移量,地址空間是一個(gè)非常一般的概念,例如,可以用在向內(nèi)存讀取文件時(shí),用于將文件的內(nèi)容與裝載數(shù)據(jù)的內(nèi)存區(qū)關(guān)聯(lián)起來。通過一個(gè)小技巧,mapping不僅能保存一個(gè)指針,還能包含一些額外的信息,用于判斷頁是否屬于某個(gè)未關(guān)聯(lián)到地址空間某個(gè)匿名內(nèi)存區(qū):如果將mapping最低位置1,該指針指向另外一個(gè)數(shù)據(jù)結(jié)構(gòu)(anon_vma),這個(gè)結(jié)構(gòu)對(duì)實(shí)現(xiàn)匿名映射的逆向映射很重要

  8. private指向私有數(shù)據(jù)的指針,根據(jù)頁的用途,可以用不同方式使用該指針

  9. virtual用于高端內(nèi)存區(qū)域中的頁

  10. 體系結(jié)構(gòu)無關(guān)的標(biāo)志

  11. PG_locked:鎖定頁面不允許內(nèi)核的其他部分訪問.

  12. PG_error:涉及該頁的I/O操作期間發(fā)生錯(cuò)誤.

  13. PG_referenced, PG_active:控制系統(tǒng)中使用該頁的活躍程度.

  14. PG_uptodate:頁的數(shù)據(jù)已經(jīng)從塊設(shè)備讀取,其間沒有出錯(cuò)

  15. PG_dirty:與硬盤上的數(shù)據(jù)相比,頁的內(nèi)容發(fā)生改變.

  16. PG_lru:有助于實(shí)現(xiàn)頁面回收和切換,內(nèi)核使用兩個(gè)最近最少使用鏈表來區(qū)分活動(dòng)頁和不活動(dòng)頁,如果頁在其中一個(gè)鏈表中,該位置位,如果在活動(dòng)鏈表中,PG_active會(huì)置位

  17. PG_highmem:頁在高端內(nèi)存中

  18. PG_private:表明page的private成員非空

  19. PG_writeback:頁的內(nèi)容處于向塊設(shè)備回寫過程中

  20. PG_slab:頁是slab分配器的一部分

  21. PG_swapcache:頁處于交換緩存中

  22. PG_reclaim:內(nèi)核決定回收特定頁時(shí)設(shè)置

  23. PG_compound:該頁屬于一個(gè)更大復(fù)合頁

  24. PG_buddy:表明頁空閑且包含在伙伴系統(tǒng)的列表中


一文玩轉(zhuǎn)Linux內(nèi)核架構(gòu)的內(nèi)存管理(NUMA模型中的內(nèi)存組織)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
兴安盟| 曲水县| 奉新县| 长海县| 阿巴嘎旗| 和林格尔县| 辽源市| 犍为县| 西华县| 通州区| 疏勒县| 安远县| 淮滨县| 文安县| 水城县| 共和县| 嘉善县| 江城| 安图县| 保靖县| 方山县| 青川县| 柘城县| 双鸭山市| 庆云县| 东明县| 黄平县| 长岭县| 治县。| 永顺县| 常州市| 桦川县| 利川市| 哈巴河县| 中西区| 集贤县| 栾城县| 嫩江县| 洪江市| 郧西县| 武清区|