夥伴系統位址計算

2022-03-25 11:28:53 字數 690 閱讀 4301

首先看具體演算法,

unsigned long

page_idx, mask, order;

struct page * base

;struct page *buddy1, *buddy2;

order = 4

;mask (~0ul)

;buddy1 = base + (page_idx ^ -mask);

buddy2 = base + page_idx;

其中最重要的就是 buddy1 = base + (page_idx ^ -mask); 這一行,假設是在 32 位的機器上,mask 為 0xffff ffff ffff 0000ul,而 -mask 為 0x0000 0000 0001 0000ul,簡單點就是 1 << order。

既然是夥伴那麼肯定是兩個,左右兩個,有乙個特徵,左邊的夥伴起始索引值得 order 位(起始位為0位)是 0,而右夥伴這一位是 1(其實是偶數夥伴和奇數夥伴的問題),如果對這一位取異或的結果就左邊夥伴的索引值就可以得到右邊夥伴的索引值,反之亦然,其實將**稍微修改下更好理解,

buddy1 = base + (page_idx ^ (1

<< order));

按照上面的**可以順利地找出兩個夥伴的索引值,在適當的條件下就可以合併。

夥伴系統演算法

如有問題,歡迎一起討論 struct free area static struct page rmqueue struct zone zone,unsigned int order return null define mark used index,order,area change bit i...

Linux夥伴系統

夥伴系統的概述 linux核心記憶體管理的一項重要工作就是如何在頻繁申請釋放記憶體的情況下,避免碎片的產生。linux採用夥伴系統解決外部碎片的問題,採用slab解決內部碎片的問題,在這裡我們先討論外部碎片問題。避免外部碎片的方法有兩種 一種是之前介紹過的利用非連續記憶體的分配 另外一種則是用一種有...

夥伴系統演算法

1 原理 linux的夥伴演算法把所有的空閒頁面分為10個塊組,每組中塊的大小是2的冪次方個頁面,例如,第0組中塊的大小都為20 1個頁面 第1組中塊的大小為都為21 2個頁面 第9組中塊的大小都為29 512個頁面 也就是說,每一組中塊的大小是相同的,且這同樣大小的塊形成乙個鍊錶 我們通過乙個簡單...