精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

不卡视频观看| 久久久成人免费视频| 色综合一区二区日本韩国亚洲| 欧美国产国产综合| 亚洲自拍av在线| 中文字幕在线观看免费视频| 国产一区三区在线播放| 91麻豆精品91久久久久同性| 丰满的少妇愉情hd高清果冻传媒| 欧洲天堂在线观看| 激情五月婷婷综合| 91av视频在线播放| 国产日产精品一区二区三区的介绍| 伊人久久大香线蕉av超碰| 一本色道久久加勒比精品| 在线免费观看一区二区三区| 国产 日韩 欧美 精品| 三级成人在线视频| 日韩精品免费专区| 色狠狠色噜噜噜综合网| 中日韩在线视频| 香蕉视频黄在线观看| 精品无人码麻豆乱码1区2区 | 五月天一区二区| 一区二区三区av| 日韩av地址| 国产成人自拍在线| 国产精品亚洲一区二区三区| 日韩三级视频在线| 欧美一区免费| 日韩亚洲精品视频| 极品人妻videosss人妻| 精品国产一区二区三区不卡蜜臂| 欧美日本在线播放| 日韩一级片播放| 国产精品一区二区日韩| 亚洲欧美一区二区三区久本道91 | 亚洲av片一区二区三区| 国产精品一区二区免费不卡 | 亚洲欧洲美洲av| 国产精品福利一区二区三区| 久久伦理网站| 理论片中文字幕| 国产精品99久久久久久久vr| 国产欧美精品一区二区三区-老狼| 黄色免费av网站| 99国产精品| 欧美极品少妇与黑人| 国产三级精品三级观看| 视频一区中文| 亚洲天堂av在线免费| 91丨porny丨对白| 亚洲1区在线观看| 69p69国产精品| 亚洲这里只有精品| 影视一区二区三区| 欧美性欧美巨大黑白大战| 日韩黄色片视频| 在线观看爽视频| 色视频欧美一区二区三区| 日韩精品一区二区三区久久| 少妇淫片在线影院| 欧美日韩一区免费| 女人和拘做爰正片视频| 午夜伦理福利在线| 红杏一区二区三区| 亚洲欧美日韩久久| 亚洲小视频在线播放| 精品国产丝袜高跟鞋| 中文字幕日韩精品一区| 大桥未久一区二区三区| av在线看片| 亚洲图片欧美视频| 欧美国产日韩激情| 精品91久久| 欧美性色aⅴ视频一区日韩精品| 亚洲 欧美 日韩系列| 性欧美video另类hd尤物| 欧美一区二区在线视频| 逼特逼视频在线观看| 青青久久av| 国产亚洲精品高潮| 中文字幕美女视频| 欧美日韩亚洲一区在线观看| 国内精品模特av私拍在线观看| 青青草成人av| 日韩电影免费一区| 成人久久18免费网站图片| www.超碰在线.com| 26uuu色噜噜精品一区二区| 日本日本精品二区免费| 男人天堂手机在线| 亚洲va天堂va国产va久| 人妻无码视频一区二区三区| 亚洲精品第一| 精品国产伦一区二区三区免费| ass精品国模裸体欣赏pics| 成人免费在线播放| 欧美激情极品视频| 极品国产91在线网站| 亚洲少妇视频| 国产在线精品视频| 麻豆久久久av免费| 18在线观看的| 色999日韩国产欧美一区二区| 五月天av在线播放| 久久365资源| 日韩色av导航| 成人午夜视频在线播放| 韩国一区二区在线观看| 久久一区二区三区av| 日本三级视频在线观看| 五月婷婷色综合| 国产精品自在自线| 天堂成人娱乐在线视频免费播放网站 | 国产精东传媒成人av电影| 一区二区三区国产在线观看| 国产在线拍揄自揄拍无码视频| 日韩av二区在线播放| 国产精品久久久久久久天堂第1集| 福利小视频在线观看| 亚洲成人动漫一区| 中文字幕色网站| japanese国产精品| 青青a在线精品免费观看| 国产激情视频在线播放| 国产欧美1区2区3区| 男女猛烈激情xx00免费视频| 99久久久成人国产精品| 亚洲视频在线视频| 亚洲欧美精品一区二区三区| 成人永久看片免费视频天堂| 欧美日韩视频免费在线观看| 亚洲成人一区在线观看| 亚洲精品中文字幕女同| 国产一级淫片a| 国产成人午夜电影网| 综合视频免费看| 成人国产精品入口免费视频| 亚洲男女性事视频| 日本一区二区三区免费视频| 国产福利一区二区三区视频在线| 一区不卡字幕| av成人亚洲| 在线观看免费高清视频97| 四虎成人永久免费视频| 北条麻妃一区二区三区| h无码动漫在线观看| 中国毛片在线观看| 日韩高清二区| 美女久久久久久久| 国产色在线视频| 亚洲欧美日韩国产综合| 久久精品亚洲天堂| 天天综合网网欲色| 91香蕉亚洲精品| 黄色动漫在线| 欧美成人欧美edvon| 久久黄色小视频| 成人免费毛片app| 免费观看国产精品视频| 欧美调教视频| 国产成人精品av| 91看片在线观看| 欧美一区二区三区喷汁尤物| 91在线播放观看| 国产91精品入口| 波多野结衣之无限发射| 欧美丝袜美腿| 国产精品久久久久久久久久久久| 成人高清免费在线播放| 777色狠狠一区二区三区| 免费三级在线观看| 国产成+人+日韩+欧美+亚洲| 成年人看的毛片| 在线日本制服中文欧美| 国产精品国产亚洲伊人久久| 午夜在线播放| 精品国产免费久久| 成年人av网站| 亚洲欧美激情在线| 亚洲一级Av无码毛片久久精品| 亚洲一区激情| 亚洲巨乳在线观看| 亚洲经典视频| 国产精品9999| 香蕉成人app免费看片| 日韩精品一二三四区| 中文字幕有码视频| 亚洲网友自拍偷拍| 天天摸日日摸狠狠添| 国产99免费视频| 成人一级视频在线观看| 黄色动漫在线免费看| 91久久夜色精品国产按摩| caoporen国产精品| 少妇一区视频| 欧美激情中文网| 成人在线免费观看| 精品国内二区三区| 中文字幕一区二区三区四区免费看| 一区二区在线观看免费| 日本一级免费视频| 高清国产一区二区| 日本在线观看免费视频| 亚洲一级特黄| 色综合久久88色综合天天提莫| 亚洲精品a区| 国产日本欧美一区二区三区在线| av小说在线播放| www国产精品视频| 天天摸天天碰天天爽天天弄| 欧美精品xxxxbbbb| 国产精品suv一区| 亚洲精品免费一二三区| 无码少妇一区二区| www.日韩av| 色婷婷综合在线观看| 日本不卡视频在线观看| 成人一区二区免费视频| 91精品秘密在线观看| 狼狼综合久久久久综合网| 视频成人永久免费视频| 国产精选久久久久久| 三级在线观看视频| 欧美第一黄网免费网站| 97视频精彩视频在线观看| 亚洲精品国产精品久久清纯直播| 国产又粗又长又大视频| 91电影在线观看| 91video| 亚洲成人7777| 久久人人爽人人爽人人| 亚洲欧美另类在线| 国产午夜精品理论片| 欧美激情一二三区| 美女100%无挡| 久久久综合精品| www.色天使| 久久丝袜美腿综合| 五十路六十路七十路熟婆| 高清国产一区二区| 中国老熟女重囗味hdxx| 国产中文一区二区三区| 日韩av卡一卡二| 蜜桃在线一区二区三区| 国产三级日本三级在线播放| 欧美亚洲网站| 欧美视频第三页| 丝袜亚洲另类欧美| 久草在在线视频| 精品久久国产视频| 久久夜色精品国产噜噜av| 亚洲中文字幕无码一区| 成人av网址在线| 久久人妻少妇嫩草av无码专区| 成人深夜在线观看| 国产激情第一页| 久久综合网色—综合色88| 毛片网站免费观看| 国产亚洲综合在线| 丁香六月激情综合| 国产精品成人免费精品自在线观看| 乱老熟女一区二区三区| 日韩毛片在线免费观看| 天天干中文字幕| 亚洲高清不卡在线观看| 永久免费看片在线播放| 色综合久久综合| 中文字幕一区二区三区人妻四季 | 一级黄色小视频| 3d动漫精品啪啪一区二区竹菊| 国产视频www| 欧美精品一区二区精品网| 偷拍精品一区二区三区| 亚洲色图50p| 欧美成人三区| 国产综合在线视频| 免费观看一级欧美片| 国产精品久久久久久搜索| 久久er热在这里只有精品66| 91美女片黄在线观| jizz18欧美18| 欧美日韩喷水| 亚洲精品国产偷自在线观看| 国产乱淫av片杨贵妃| 欧美亚洲自偷自偷| 天堂av在线网站| 国产激情视频一区二区三区欧美 | 国产日韩高清在线| 国产精品国产三级国产传播| 亚洲一区影音先锋| 天天干天天操天天操| 91精品婷婷国产综合久久| 天堂v在线观看| 最新日韩中文字幕| 俺来也官网欧美久久精品| 国产精品99蜜臀久久不卡二区| 国产一区二区三区| 久久一区二区三区欧美亚洲| 91偷拍一区二区三区精品| 日本a在线免费观看| 美女在线观看视频一区二区| av漫画在线观看| 国产精品不卡一区| 精品国产乱码一区二区| 欧美一区二区三区四区高清| 三级做a全过程在线观看| 久久国产精品99国产精| 日日夜夜天天综合| 国产日本一区二区三区| 国产精品毛片久久| 日韩一级免费在线观看| 不卡高清视频专区| 亚洲一级生活片| 亚洲第一在线| 欧美中文字幕视频| 亚州精品国产| 日本一区二区三区免费看| 激情欧美日韩| www.久久com| 国产精品私人自拍| 午夜精品久久久久久久蜜桃| 精品国产凹凸成av人导航| 国产在线高清理伦片a| 国产精品久久久久久五月尺| 欧美日韩麻豆| 免费不卡av在线| 国产成人午夜精品5599 | 一区二区三区日韩欧美精品| 特级西西444www高清大视频| 精品调教chinesegay| 久久香蕉av| 99re在线观看| 亚洲色图插插| 亚洲欧美天堂在线| 国产精品久久看| 正在播放亚洲精品| 在线视频免费一区二区| 极品美女一区| 日本欧美精品久久久| 久久午夜影视| 亚洲精品午夜视频| 日本韩国视频一区二区| 亚洲日本香蕉视频| 欧洲午夜精品久久久| 欧洲亚洲一区二区三区| 亚洲 高清 成人 动漫| 9人人澡人人爽人人精品| 亚洲激情视频一区| 亚洲国产免费av| 电影一区二区三| 日韩欧美视频第二区| 日韩电影在线免费| 2017亚洲天堂| 717成人午夜免费福利电影| 国产丝袜在线| 超碰在线97av| 99精品视频免费| 公侵犯人妻一区二区三区| 色偷偷久久人人79超碰人人澡| 九九热视频在线观看| 国产精彩精品视频| 四季av在线一区二区三区| 污网站在线免费| 一区二区三区国产精品| 特黄aaaaaaaaa真人毛片| 久久九九久久九九| 精品国产大片大片大片| 宅男在线国产精品| 色综合999| 久久影院理伦片| 美女在线视频一区| 91久久国产综合| 亚洲成人av片在线观看| 韩国美女久久| 国产三级中文字幕| 成人网页在线观看| 99久久精品国产亚洲| 中文字幕免费精品一区| 精品中文在线| 日韩精品xxxx| 中文字幕av一区二区三区高| 国产伦精品一区二区三区免.费| 欧美俄罗斯乱妇| 台湾佬综合网| 亚洲自拍第三页| 同产精品九九九| 午夜在线观看视频| 国产在线一区二区三区四区| 老牛嫩草一区二区三区日本| 黄色a级片在线观看| 亚洲精品国产美女| 小说区图片区亚洲| 国产h视频在线播放| 国产精品三级电影| 色呦呦中文字幕| 成人做爽爽免费视频| 久久xxxx| 久久丫精品久久丫|