伙伴系统算法:
该算法用于分配内存,一个合理的分配内存算法应当拥有这两部分:
- 分配内存
- 释放内存
符合以下三个要求的就算是伙伴:
- 两个块的大小相同
- 两个块的地址连续
- 两个块必须是从同一个大块分离出来的
原理:
linux把每个zone分成MAX_ORDER个free_area,每个free_are的大小是2的幂次方。MAX_ORDER的值为11,第0组大小为2^0个页,第1组大小为2^1个页,依次类推,最大的是2^10个页,即1024*4KB=4MB。同样大小的块形成一个链表。每个free_area都维护了一个位图,该位图表示所有的空闲块,有n个空闲块,则有n/2位,每位对应两个伙伴块,为0代表两块都空闲,为1表示其中一块忙。在每次分配或者释放时,都要进行异或运算,意思是,初始阶段两块都空闲,值为0;使用了其中一块之后,值异或为1;另外一块如果也使用了,值异或为0;其中一块释放两,值异或为1;两块都释放了,异或为0。
有关结构体:
struct free_area
{
struct list_head free_list; //每个free_area链表的头结点
unsigned long nr_free; //空闲链表的数量
};
struct zone
{
....
struct free_area free_area[MAX_ORDER];
....
}
分配内存:
先找到等于或者最接近2的幂次方的链表,查看对应的free_area的nr_free是否还有剩余,如果有的话,则直接分配;如果没有的话,则从更大一级的free_area中寻找,如果有空的,就将

伙伴系统算法是Linux内核中用于内存分配的一种高效策略。它通过将内存块分为2的幂次方大小,并确保满足特定条件的块成为伙伴来分配和释放内存。在分配时,算法会寻找最接近的2的幂次方大小的空闲块,并可能通过拆分或合并来满足请求。释放内存时,伙伴系统尝试合并相邻的空闲块以减少碎片。虽然该算法提高了空间利用率,但存在不能合并非伙伴块、浪费内存及较高算法开销等缺点。
最低0.47元/天 解锁文章
720

被折叠的 条评论
为什么被折叠?



