[linux内存]伙伴系统学习笔记(一)——概念

1,伙伴系统的作用:
 伙伴系统主要是为了高效使用物理内存,尽量减少内存碎片的产生
 
2,伙伴系统的概念:
 系统中的内存总是两两分组,每组中的两个内存块称为伙伴
 
3,伙伴系统的原理:
  伙伴系统是相对于struct zone而言,将每个zone的空闲内存分为最多11个数组,比如第一个数组里管理着2^0页的内存,所有这些2^0的页以struct page的lru域的双向链表相连接,第二个数组管理着2^1页的内存,所有这些2^0的页以struct page的lru域的双向链表相连接,以此类推,。。。。。当要申请一个4k(即2^0页)的内存时,则直接从第一个数组申请,如果第一个数组没有空闲内存,则将第二个数组的2^1的页分解为两个2^0的页以供申请。
 
4,伙伴系统的相关数据结构
  伙伴系统是相对于struct zone而言的,struct zone中的struct free_area是用来描述该管理区伙伴系统的空闲内存块的,

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

  struct free_area {  
    struct list_head    free_list[MIGRATE_TYPES];  
    unsigned long       nr_free;   //该free_area中总共的空闲内存块的数量,单位为页大小
}; 
#define MAX_ORDER 11
#define MIGRATE_TYPES 5


 

5,防止内存碎片相关:
用户空间的程序不会碰到内存碎片的问题,因为其内存是通过页表映射的,无论空闲页在物理内存的分配如何,应用程序看到的内存总是连续的。但是对于内核来说,会经常碰到内存碎片的问题,因为大部分物理内存是线性映射到内核空间的。内核将页分为以下几种类型。

MIGRATE_TYPES是作为反碎片的一种机制
MIGRATE_UNMOVABLE:不可移动页,在内存中有固定位置,不能移动。核心内核分配的大部分内存属于此类。
MIGRATE_RECLAIMABLE:可回收页,不能移动,但能删除。Kswapd内核线程会操作次区域。
MIGRATE_MOVABLE:可移动又可回收页,用户空间程序使用此类,通过页表映射实现,如果应用程序虚拟地址空间有变化,只要变化页表就可以了。
MIGRATE_RESERVE: 当系统内存相当少而且比较紧急时,才用到此区域。
MIGRATE_CMA:这个是为了避免预留大块内存实现的,当需要大块内存的时候如audio/camera等,它可以被使用;当小内存申请需要时,它也可以被使用,避免了pmem/ion的弊端,不过似乎要基于DMA。
MIGRATE_ISOLATE: NUMA系统上使用,我们用UMA,不管它。

#define MIGRATE_UNMOVABLE     0  
#define MIGRATE_RECLAIMABLE   1  
#define MIGRATE_MOVABLE       2  
#define MIGRATE_PCPTYPES      3 /* the number of types on the pcp lists */  
#define MIGRATE_RESERVE       3  
#define MIGRATE_ISOLATE       4 /* can't allocate from here */  
#define MIGRATE_TYPES         5  

MIGRATE_PCPTYPES是per_cpu_pageset,即用来表示每CPU页框高速缓存的数据结构中的链表的迁移类型数目
MIGRATE_RESERVE是在前三种的列表中都没用可满足分配的内存块时,就可以从MIGRATE_RESERVE分配
MIGRATE_ISOLATE用于跨越NUMA节点移动物理内存页,在大型系统上,它有益于将物理内存页移动到接近于是用该页最频繁地CPU
MIGRATE_TYPES表示迁移类型的数目

当一个指定的迁移类型所对应的链表中没有空闲块时,将会按以下定义的顺序到其他迁移类型的链表中寻找

static int fallbacks[MIGRATE_TYPES][MIGRATE_TYPES-1] = {  
    [MIGRATE_UNMOVABLE]   = { MIGRATE_RECLAIMABLE, MIGRATE_MOVABLE,   MIGRATE_RESERVE },  
    [MIGRATE_RECLAIMABLE] = { MIGRATE_UNMOVABLE,   MIGRATE_MOVABLE,   MIGRATE_RESERVE },  
    [MIGRATE_MOVABLE]     = { MIGRATE_RECLAIMABLE, MIGRATE_UNMOVABLE, MIGRATE_RESERVE },  
    [MIGRATE_RESERVE]     = { MIGRATE_RESERVE,     MIGRATE_RESERVE,   MIGRATE_RESERVE }, /* Never used */  
}; 


 

6,debug相关:
 有关伙伴系统的当前状态信息可以在/proc/buddyinfo中获取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值