精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

說說Buddy算法的那些事

原創 精選
開發 前端
在本文中,我將重點介紹Buddy算法(又稱為伙伴算法),該算法是以頁為單位進行管理的。

作者 | 趙青窕

審校 | 孫淑娟

內核內存管理比較復雜,主要包含了Buddy算法,vmalloc管理,slab算法,kmapper及與初始化階段物理內存管理相關的兩個模塊memblock和bootmem。除了上述模塊外,還有內存遷移,水線檢測,kmemleak,內存信息統計,PCP等輔助內容。在本文中,我將重點介紹Buddy算法(又稱為伙伴算法),該算法是以頁為單位進行管理的。

Buddy算法介紹

目前,內核中的Buddy算法采用下圖的方式管理內存。我把Buddy算法分為如下圖所示的三部分,在區域一中,核心的數據結構是struct zone;在區域二中核心的數據結構是struct free_area free_area[MAX_ORDER];在區域三中,page鏈表是核心內容。接下來,我將詳細介紹這三個板塊,并通過分配函數來說明Buddy的工作細節。

圖 1 Buddy框架

1.區域

通常用zone代表不同的內存管理區,即把內存劃分成不同的組,每個組就是一個zone。

在內核中,每個zone通過結構體struct zone來表示,其結構體中主要成員如下:

struct zone {
unsigned long watermark[NR_WMARK];

unsigned long zone_start_pfn;
unsigned long managed_pages;
unsigned long spanned_pages;
unsigned long present_pages;
struct free_area free_area[MAX_ORDER];
const char *name;
struct pglist_data *zone_pgdat;
}
  • 標識內存水線的成員unsigned long watermark[NR_WMARK],其中NR_WMARK定義如下:
enum zone_watermarks {
WMARK_MIN,
WMARK_LOW,
WMARK_HIGH,
NR_WMARK
};

從上面定義可知,每個zone存在三個水線,若當前zone中空閑頁高于WMARK_HIGH,則當前zone區的空閑內存較多;若空閑頁低于WMARK_LOW,則交換守護進程開始將內存交換到磁盤上;若空閑頁低于WMARK_MIN,則內存回收系統還需要大量回收內存。在使用Buddy進行內存申請時,會進行水線判斷,從而進行相應的操作;

  • 伙伴系統管理相關的成員
unsigned long   zone_start_pfn;    
unsigned long managed_pages;
unsigned long spanned_pages;
unsigned long present_pages;
struct free_area free_area[MAX_ORDER]

前四個是相應zone區對應的頁號信息,free_area是伙伴算法中的關鍵成員,也是區域一和區域二銜接的關鍵成員,每個zone區會劃分為MAX_ORDER個組,數組free_area中的每個成員就代表一個組。

  • 成員const char *name指明了對應zone區的名稱,通常情況下為dma,Normal或highmem,其中highmem不會出現在64位的系統中;下面是典型的32位系統中的zone劃分方式:

ZONE_DMA(0~16M):DMA內存分配區;

ZONE_NORMAL(16MB~896MB):普通映射的內存區域;

ZONE_HIGHMEM(896MB~):高端內存區域,其中的頁不能永久映射到內核地址空間;內核一般不使用,如果要使用,通過kmap做動態映射;

  • 指向zone區對應node的指針成員struct pglist_data *zone_pgdat,node是內存管理中的一個重要成員。對于UMA架構,僅有一個node,所有的zone均屬于同一個node,但對于NUMA架構,會有多個不同的node,每個node又劃分為不同的zone,所有zone區也是通過struct pglist_data組織在一起的。

2.free_area和頁面鏈表

在內存管理和分配過程中,有一個重要參數order,當我們采用kmalloc申請大內存時,最后會調用函數__alloc_pages_nodemask來進行內存申請。該函數需要一個參數order,當order = 0時,表示要申請的內存大小是1(2的0次方)個頁面;當order = 1時,表示要申請的內存大小是2(2的1次方)個頁面。

次方在Buddy算法中,把內存按照2的冪次方(即2的order次方,order的范圍從0到MAX_ORDER)劃分成不同的組,每個組分別用對應的free_area[order]表示,例如free_area[0]對應的就是由內存塊大小為2的0次方的頁塊組成的組,free_area[1]對應的就是內存由塊大小為2的1次方的頁塊組成的組,而結構體結構區域正是通過成員free_area把圖1中的區域一和區域二串聯在一起。

結構體struct free_area定義如下(不同平臺或者不同內核會有差異,但核心思想相同):

struct free_area {
struct list_head free_list[MIGRATE_TYPES];
unsigned long nr_free;
};

從該結構可以看出,每一個free_area又根據MIGRATE_TYPES劃分為不同的組,每組分別通過鏈表free_list把同一類頁塊串聯在一起,這樣free_list就把圖1中的區域二和區域三串聯在一起了,從而間接的把區域一和區域三關聯在一起了。

結構體結構 page比較復雜,其中有一個成員結構list_head lru,通過該成員把圖1中區域三中的頁塊同區域二中對應的free_list鏈接在一起。

Buddy內存分配與釋放

在此,我將通過一個示例來簡要地展示Buddy內存分配的核心思想。當通過Buddy分配一個物理頁(即order = 0)時,會從對應zone區中free_area[0]管理的區域分配一個頁面(暫時先不考慮PCP的情況),并將該頁面從 free_area[0] 鏈表中移除;當free_area[0] 上沒有可用的物理頁時,Buddy會在free_area[1]上查找,若存在可用的物理頁,則將該頁塊從free_area[1] 的鏈表中移除,同時把該頁塊拆分成兩塊,其中一塊插入到free_area[0]中,另一塊傳遞給內存請求者;倘若free_area[1]上也沒有可用頁,則會繼續向上查找。

下圖2所示是沒有對應oder = 0的頁塊情況,因此把order = 1中的一個頁塊進行拆分,一半返回給order = 1的鏈表,一半返回給請求者。假如order = 1中沒有需要的頁塊,在內存分配過程中會繼續從order = 3中進行查找,直到找到頁塊或者遍歷完所有order。

圖 2 分配物理頁面示意圖

實際上,在整個內存分配過程中,會伴隨很多特殊情況處理。Buddy算法在進行內存分配時,會根據水線設置,來進行內存回收或者喚醒內核線程kswapd,或者是采用CPU的冷熱頁面隊列進行內存分配,或者是進行頁面移動等。假如已經嘗試頁面移動,kswapd已經喚出了一些頁面,同時也進行了內存回收,依然沒有可分配的內存,此時就會觸發out_of_memory??傊?,這些特殊情況的處理方式均離不開圖1所示的Buddy框架。

下圖是我根據我本地的代碼整理的采用kmalloc申請大內存時的調用過程(使用kmalloc申請小內存時不通過Buddy),其中最關鍵的內存分配函數是prepare_alloc_pages,get_page_from_freelist,rmqueue 和__alloc_pages_slowpath。感興趣的朋友可以結合圖1所示的框架查看這幾個函數的具體實現。

當向系統釋放一個物理頁的時候,會通過struct page來推導出該page對應的zone區(比如該page屬于NORMAL區)和對應的page類型,緊接著將根據對應的order進行頁的合并(即圖1中區域三的部分進行合并),最后將合并后的塊插入到新的order中去,這個合并過程一直持續下去,直到不能合并或者已經合并到最大的order處。例如當釋放的物理頁得到其屬于NORMAL區的free_area[0],此時free_area[0]中存在頁面可以和釋放的頁面合并,從而把合并后的添加到free_area[1]中,這個合并操作會一直持續下去,直到合并完為止。這個過程實際上就是圖2的反過程。

總結

內存的管理比較復雜,本文主要介紹了Buddy的核心思想,但這僅僅是內存管理的冰山一角,卻是比較基礎且核心的內容,因此了解Buddy整體架構是非常有必要的。

作者介紹

趙青窕,51CTO社區編輯,從事多年驅動開發。研究興趣包含安全OS和網絡安全領域,發表過網絡相關專利。


責任編輯:華軒 來源: 51CTO
相關推薦

2009-07-29 10:36:04

北電收購

2015-07-06 11:35:07

預裝軟件

2015-05-28 10:07:20

溢算計算方式算法

2011-09-05 17:18:28

2021-01-25 10:05:27

ReactDOM前端

2011-04-14 14:23:06

軟件測試測試

2021-03-09 23:12:51

Python集合項目

2016-06-07 10:47:42

2014-06-06 16:08:17

初志科技

2020-07-29 08:14:59

云計算云遷移IT

2011-09-19 15:40:35

2019-11-20 10:00:56

開源侵權版權

2011-05-19 16:47:50

軟件測試

2012-05-01 08:06:49

手機

2012-05-31 09:53:38

IT風云15年

2024-02-04 17:03:30

2017-05-15 21:50:54

Linux引號

2022-07-28 08:00:00

Buddy算法內存系統

2015-08-20 09:17:36

Java線程池

2015-08-13 10:54:46

點贊
收藏

51CTO技術棧公眾號

国产精品影视天天线| 欧美电影在线观看免费| 一区二区三区在线观看动漫| 亚洲一区二区中文字幕| 久久久久久久伊人| 免费一区二区三区视频导航| 欧美日本一区二区在线观看| 亚洲色欲久久久综合网东京热| 久久米奇亚洲| 国产麻豆精品在线| 全球成人中文在线| 午夜剧场免费在线观看| 青草久久视频| 欧美精品xxxxbbbb| 日韩精品xxxx| 日本免费中文字幕在线| www.成人网.com| 国产精品入口免费视频一| 国产一级aa大片毛片| 欧美最新另类人妖| 亚洲精品一区二区三区在线观看 | 午夜久久黄色| 日韩精品视频三区| 中文字幕第三区| 日本美女一区| 亚洲电影在线免费观看| 夜夜爽www精品| 青青操视频在线| 国产九色精品成人porny| 欧洲成人免费aa| 久久久www成人免费毛片| jizzjizz欧美69巨大| 亚洲精品成人av| 在线播放免费视频| 国产精品亚洲d| 色综合天天做天天爱| 久久亚洲国产成人精品无码区| 婷婷免费在线视频| 国产欧美日本一区二区三区| 国产精品播放| 国产精品一级二级| 免费成人av资源网| 国产精品久久久久久av福利| wwwwww国产| 妖精视频成人观看www| 欧美精品videofree1080p| 国产美女久久久久久| 日韩国产欧美一区二区| 亚洲无限av看| 手机免费看av| 亚洲妇女av| 亚洲精品黄网在线观看| 国产伦精品一区二区免费| 视频亚洲一区二区| 欧美v日韩v国产v| 女教师高潮黄又色视频| 精品久久亚洲| 日韩欧美国产三级| 粗大的内捧猛烈进出视频| 精品一区二区三区亚洲| 欧美一区二区成人6969| 欧美又黄又嫩大片a级| 国产精一区二区| 日韩亚洲欧美高清| wwwxxx色| 欧美精品密入口播放| 亚洲精品wwww| 一区二区三区免费在线观看视频| 亚洲激情播播| 一区二区三区四区视频| 天堂网中文在线观看| 仙踪林久久久久久久999| 九九精品视频在线| 国产亚洲精久久久久久无码77777| 欧美日韩一区二区高清| 97国产精品免费视频| 超碰超碰超碰超碰| 日本va欧美va精品发布| 91九色国产社区在线观看| 国产成年妇视频| 成人午夜大片免费观看| 免费看国产精品一二区视频| 高清av电影在线观看| 国产精品国产三级国产三级人妇 | 999国产精品永久免费视频app| 最新91在线视频| 青青草国产在线观看| 在线成人欧美| 国产成人精品在线| 国产绳艺sm调教室论坛| 成人国产亚洲欧美成人综合网| 久久久一本精品99久久精品| 一本一道波多野毛片中文在线| 亚洲情趣在线观看| 5月婷婷6月丁香| 国产精品亲子伦av一区二区三区| 欧美一区二区三区不卡| 精品国产av色一区二区深夜久久| 国产精品一区二区av日韩在线| 久久精品在线视频| 国产一卡二卡在线| 免费成人在线网站| 激情小说网站亚洲综合网| 91高清在线| 午夜欧美视频在线观看 | 激情五月婷婷小说| 日一区二区三区| 国产偷自视频区视频一区二区| 精品粉嫩超白一线天av| 毛片aaaaaa| 在线观看不卡| 国产欧美久久一区二区| 午夜在线观看视频18| 综合久久久久久久| 免费观看精品视频| 中文字幕一区日韩精品| 伊是香蕉大人久久| 日本少妇激情视频| 国产乱码精品一品二品| 亚洲资源在线网| 亚洲欧美电影| 欧美变态tickle挠乳网站| 日本免费www| 国产精品视频| 成人在线观看av| 美女国产在线| 色综合色狠狠综合色| 国产清纯白嫩初高中在线观看性色| 欧美美女黄色| 欧美韩国理论所午夜片917电影| 一二区在线观看| 国产亚洲精品福利| 无码播放一区二区三区| 97久久亚洲| 久久中国妇女中文字幕| 在线免费看毛片| 久久久蜜桃精品| 日本少妇高潮喷水视频| 国产福利资源一区| 色综合老司机第九色激情| 国产精品国产精品国产专区| 日本一区二区高清| 欧美精品第三页| 亚洲自拍电影| 欧美中文字幕第一页| 二区三区在线视频| 一区二区三区在线免费播放| 91丝袜超薄交口足| 天天久久综合| 成人国产精品久久久| 日本三级在线视频| 欧美高清性hdvideosex| 亚洲国产123| 精品一区二区三区免费毛片爱| 亚洲欧美日韩国产成人综合一二三区| 日韩精品99| 亚洲一区www| 看黄色一级大片| 欧美激情综合网| 亚洲一区在线不卡| 久久国产小视频| 国产在线播放不卡| a级毛片免费观看在线| 91精品免费观看| 欧美xxxx黑人xyx性爽| 粉嫩一区二区三区在线看| 99国产精品白浆在线观看免费| 97色婷婷成人综合在线观看| 欧美成人午夜激情视频| 亚洲精品久久久久久无码色欲四季| 亚洲一区二区在线播放相泽| 美女黄色一级视频| 国产精品最新自拍| 视频在线精品一区| 成人污污www网站免费丝瓜| 欧美精品在线观看91| 欧美性猛交 xxxx| 日韩欧中文字幕| 少妇人妻好深好紧精品无码| 九一九一国产精品| 一级性生活视频| 日韩在线麻豆| 国产欧美va欧美va香蕉在| 手机av免费在线| 亚洲国产精品久久久久| 无码人妻精品一区二| 日韩一区日韩二区| 性囗交免费视频观看| 石原莉奈在线亚洲三区| 男插女免费视频| 欧美交a欧美精品喷水| 国产精品永久在线| heyzo高清国产精品| 亚洲欧洲在线视频| a视频免费在线观看| 亚洲香蕉网站| 欧美日韩一区在线观看| 黄色片视频免费观看| 麻豆精品视频在线观看| 人妻av无码专区| 国产精品亚洲片在线播放| 91pron在线| 都市激情亚洲一区| 欧美日本啪啪无遮挡网站| 四虎电影院在线观看| 欧美一区二区三区视频在线观看 | 精品久久久久久亚洲精品| youjizz亚洲女人| 成人激情av网| 国产又大又黄又粗又爽| 在线观看一区视频| 亚欧精品在线| 欧美一区 二区| 亚洲www在线观看| 四虎成人在线| 午夜精品免费视频| 91高清在线观看视频| 亚洲天堂av在线免费| 亚洲精品一级片| 欧美另类高清zo欧美| 无码视频在线观看| 亚洲成人激情综合网| 精品国产视频一区二区三区| 国产日本欧美一区二区| 日本免费福利视频| 国产一区二区三区国产| 亚洲国产精品三区| 日本中文字幕伦在线观看| av不卡在线观看| 亚洲一区二区三区四区精品| 青青草精品视频| 色综合av综合无码综合网站| 欧美在线国产| 一级二级三级欧美| 欧美丝袜丝交足nylons172| 精品欧美日韩在线| **爰片久久毛片| 91入口在线观看| 先锋影音网一区二区| 国产精品九九久久久久久久| 日韩三级影视| 青青草精品毛片| 黄色软件视频在线观看| 国内精品久久久久久影视8| 美女免费久久| 久久精品国产69国产精品亚洲| 国产福利第一视频在线播放| 亚洲美女性生活视频| 亚洲av激情无码专区在线播放| 欧美精品一区二区高清在线观看| 99国产精品欲| 欧美美女喷水视频| ,亚洲人成毛片在线播放| 欧美无砖砖区免费| 国产精品高清无码| 欧美日韩一级视频| 91成人一区二区三区| 欧美日韩成人综合天天影院| 中文字幕自拍偷拍| 欧美片网站yy| 国产乱人乱偷精品视频a人人澡| 欧美精品少妇一区二区三区| 国产精品国产三级国产普通话对白| 欧美裸体一区二区三区| 久久免费视频网站| 欧美另类极品| 久久精品国产一区二区电影| 黄色网在线播放| 欧美精品亚州精品| 精精国产xxxx视频在线中文版| 欧美精品videossex88| 白浆视频在线观看| 国产91网红主播在线观看| 电影亚洲一区| 成人午夜高潮视频| 一区二区三区四区高清视频| 精品国产乱码久久久久久蜜柚| 日韩伦理一区二区三区| 欧美日韩精品久久| 欧美黄色大片在线观看| 台湾无码一区二区| 国产精品嫩草99av在线| 中文字幕欧美人妻精品一区| 久久66热re国产| 白嫩情侣偷拍呻吟刺激| 91在线视频免费观看| 国产又黄又粗视频| 一区二区三区中文字幕在线观看| 国产性xxxx高清| 欧美在线综合视频| 99久久精品国产一区色| 日韩av影院在线观看| 自拍视频在线| 欧美日韩国产二区| 久久久一本精品| 95av在线视频| 亚洲精品中文字幕99999| 亚洲在线视频一区二区| 一本久道久久久| 亚洲欧美国产中文| 不卡在线观看av| 永久av免费网站| 婷婷久久综合九色国产成人 | 大黄网站在线观看| 欧美亚洲视频一区二区| 亚洲精品三区| 欧美二区在线看| 伊人久久大香线蕉综合四虎小说 | 韩国成人免费视频| 国产精品久久久久久久久粉嫩av| 一区二区三区四区视频免费观看| 欧美日韩在线精品| 亚洲人成人一区二区三区| 狠狠躁狠狠躁视频专区| 成人av免费观看| 看免费黄色录像| 欧美三级电影网| 同心难改在线观看| 欧美大奶子在线| 91在线成人| 精品一区二区三区国产| 欧美99久久| 午夜一区二区视频| 国产欧美一区二区精品久导航 | 国产国语老龄妇女a片| 国产精品美女www爽爽爽| 欧美啪啪小视频| 欧美变态tickle挠乳网站| 国产在线激情| 国产精品久久久久久av福利| 美女久久久久| 免费在线观看亚洲视频| 国产精品88888| 国产男女猛烈无遮挡在线喷水| 91久久精品国产91性色tv| 日漫免费在线观看网站| 久久免费精品视频| 98视频精品全部国产| 亚洲五码在线观看视频| 精品中文字幕一区二区小辣椒| 国产黄色大片免费看| 日韩欧美中文在线| 日本五码在线| 欧美亚洲在线播放| 欧美自拍一区| 精品中文字幕av| 久久综合成人精品亚洲另类欧美| 特一级黄色大片| 亚洲国产精品yw在线观看| 国产丝袜视频在线播放| 成人av影视在线| 极品中文字幕一区| 国产日韩视频一区| 亚洲国产成人av网| 天堂在线观看免费视频| 97在线视频免费播放| 欧美午夜寂寞| 凹凸国产熟女精品视频| 91蜜桃视频在线| 人人草在线观看| 亚洲一级黄色av| 久久福利在线| 国产精品无码乱伦| 狠狠色2019综合网| 黄色一级视频在线观看| 精品国产一区二区三区不卡| 免费v片在线观看| 欧美精品七区| 蜜臀久久久久久久| 午夜国产小视频| 精品剧情v国产在线观看在线| 欧美精品videosex| 久久草.com| 日韩国产高清影视| 永久免费看片直接| 精品国产精品网麻豆系列| 欲香欲色天天天综合和网| 欧美一区少妇| 久久99国产精品免费网站| 久久国产精品波多野结衣av| 日韩精品一区二区视频| jizz欧美| 91精品一区二区三区四区| av在线播放一区二区三区| 欧美黄色一级大片| 久久av资源网站| 国内精品偷拍| 免费激情视频在线观看| 亚洲人亚洲人成电影网站色| 色网站免费观看| 国产精品私拍pans大尺度在线| 中文视频一区| 扒开jk护士狂揉免费| 欧美精品v国产精品v日韩精品 | 91国偷自产一区二区三区的观看方式| 综合国产视频| 久久精品无码一区二区三区毛片| 黑人极品videos精品欧美裸| 精品欧美色视频网站在线观看| 久久国产精品一区二区三区四区|