10.伙伴系统(伙伴系统的结构)

struct zone {
...
  /*
  * 不同长度的空闲区域
  */
  struct free_area free_area[MAX_ORDER];
...
};

 

free_area是一个辅助数据结构,我们此前尚未遇见。其定义如下:
<mmzone.h>
  struct free_area {
  struct list_head   free_list[MIGRATE_TYPES];
  unsigned long     nr_free;
};

 

nr_free指定了当前内存区中空闲页块的数目(对0阶内存区逐页计算,对1阶内存区计算页对的数目,对2阶内存区计算4页集合的数目,依次类推)。free_list是用于连接空闲页的链表。页链表包含大小相同的连续内存区。
free_area[]数组中各个元素的索引也解释为阶,用于指定对应链表中的连续内存区包含多少个页帧。第0个链表包含的内存区为单页(20 =1),第1个链表管理的内存区为两页(21 =2),第3个管理的内存区为4页,依次类推。
内存区是如何连接的?内存区中第1页内的链表元素,可用于将内存区维持在链表中。

 

 

伙伴不必是彼此连接的。如果一个内存区在分配其间分解为两半,内核会自动将未用的一半加入到对应的链表中。如果在未来的某个时刻,由于内存释放的缘故,两个内存区都处于空闲状态,可通过其地址判断其是否为伙伴。管理工作较少,是伙伴系统的一个主要优点。
基于伙伴系统的内存管理专注于某个结点的某个内存域,例如,DMA或高端内存域。但所有内存域和结点的伙伴系统都通过备用分配列表连接起来。图3-23说明了这种关系。

 

 

posted @ 2022-03-19 22:47  while(true);;  阅读(93)  评论(0)    收藏  举报