Linux内存管理(2) - buddy系统

本文目的在于分析Linux内存管理机制中的伙伴系统。内核版本为2.6.31。

1. 伙伴系统的概念

在系统运行过程中,经常需要分配一组连续的页,而频繁的申请和释放内存页会导致内存中散布着许多不连续的页,这样,当某一时刻要申请一块较大的连续内存时,虽然系统内存余量足够,即很多页是空闲的,但找不到一大块连续的内存供使用。

Linux内核中使用伙伴系统(buddy system)算法来管理内存页。它把所有的空闲页放到11个链表中,每个链表分别管理大小为1,2,4,8,16,32,64,128,256,512,1024个页的内存块。当系统需要分配内存时,就可以从buddy系统中获取。例如,要申请一块包含4个页的连续内存,就直接从buddy系统中管理4个页连续内存的链表中获取。当系统释放内存时,则将释放的内存放回buddy系统对应的链表中,如果释放内存后发现有两块相邻的内存又可以合并为一个更高阶的内存块,例如释放4个页,而恰好相邻的内存也为4个页的空闲内存,则合并这两块内存并放到buddy系统管理8个连续页的链表中。同样的,如果系统需要申请3个页的连续内存,则只能在4个页的链表中获取,剩下的一个页被放到buddy系统中管理1个页的链表中。

buddy分配器分配的最小单位是一个页。要分配小于一页的内存需要用到slab分配器,而slab是基于buddy分配器的。

struct zone {
   ......
   struct free_area   free_area[MAX_ORDER];
   ......
}____cacheline_internodealigned_in_smp;

struct zone的free_area[]数组成员存放了各阶的空闲内存列表,数组下标可取0~MAX_ORDER-1,(MAX_ORDER=11)。所以,每个阶(order)的内存链表使用struct free_area结构来记录。

struct free_area {
   struct list_head  free_list[MIGRATE_TYPES];
   unsigned long     nr_free;
};

struct free_area有两个成员,free_list[]是不同migrate type(迁移类型)页链表的数组(我们先不关注什么是迁移类型,后面会讲到),每种迁移类型都是一个struct page的链表,由每个struct page的page->lru连起来。nr_free表示这个order空闲页的数量,例如,阶为2的连续页块共有3个,则nr_free=3,实际上这个阶的空闲页数为(2^2)*3=12。

2. per-cpu的冷热页链表

 struct zone结构有一个pageset[]成员:

struct zone {
   ......
struct per_cpu_pageset  pageset[NR_CPUS];
......
}____cacheline_internodealigned_in_smp;
 
struct per_cpu_pageset {
   struct per_cpu_pages pcp;
} ____cacheline_aligned_in_smp;
 
struct per_cpu_pages {
   int count;    /* number ofpages in the list */
   int high;     /* highwatermark, emptying needed */
   int batch;    /* chunk sizefor buddy add/remove */
   struct list_head list;   /*the list of pages */
};

为了方便,我下文将per cpu pageset简称为pcp。

pageset[]数组用于存放per cpu的冷热页。当CPU释放一个页时,如果这个页仍在高速缓存中,就认为它是热的,之后很可能又很快被访问,于是将它放到pageset列表中,其他的认为是冷页。pageset中的冷热页链表元素数量是有限制的,由per_cpu_pages的high成员控制,毕竟如果热页太多,实际上最早加进来的页已经不热了。

在CPU释放一个页的时候,不会急着释放到buddy系统中,而是会先试图将页作为热页或冷页放到pcp链表中,直到超出数量限制。而释放多个页时则直接释放到buddy系统中。

per_cpu_pages的count成员表示链表中页的数量。batch表示有时需要从伙伴系统中拿一些页放到冷热页链表中时,一次拿多少个页。list成员是冷热页

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值