【发布时间】:2013-06-28 06:29:19
【问题描述】:
我对理解 Linux 内核管理空闲块的方式存在概念上的疑问。这是我到目前为止通过阅读所解释的内容。
Buddy Allocator 实现是结合了正常的 2 次幂分配的分配方案。
有时,当我们需要一个大小不可用的块时,它会将大块分成两部分。这两个块是 Buddies,可能因此被称为 Buddy Allocator。
通过一个来源,我了解到为每个指向空闲页面块的链接列表的订单维护一个 free_area_t 结构数组。
我在<linux/mm.h>找到的
typedef struct free_area_struct {
struct list_head free_list;
unsigned long *map;
} free_area_t;
free_list 似乎是页面块的链接列表?我的问题是,它是免费页面列表还是已使用页面列表?
而map 似乎是代表一对好友状态的位图。
我的问题是,它怎么可能是一个单一的位来保存一对伙伴的状态位?因为如果,我使用 Buddy-pair 中的一个块来分配,而另一个保持空闲,那么状态会是什么,以及如何设法将其存储在一个位中?是不是代表整个2的幂大小的块,当我们需要一个不可用的块大小时可以分成两部分,所以分配的一半是另一半的Buddy一半是免费的?如果这是一半被分配而一半仍然空闲的情况,那么map 的状态是什么?如果两者都是免费的呢?如果两者都分配了怎么办?一个二进制值怎么能代表一个块的3种状态?
编辑:经过进一步阅读,第一个疑惑解开了。其中说:如果找不到请求订单的空闲块,则更高阶块 被分成了两个哥们。一个被分配,另一个被放在空闲列表中 较低的顺序。所以它是免费页面的链表。
【问题讨论】:
标签: memory-management linux-kernel