一/ linux内存管理的框架
1/ linux把整个物理内存分成若干个内存节点,每个内存节点由节点描述符描述。节点描述符中的
struct zone[] node_zones 字段表示该内存节点内的内存管理区描述符数组,所有的内存节点有节点描述符中的
字段pg_data_t* pgdat_next 连成一个链表。每个内存节点由字段int node_id 标志。
2/ 我们再来看一看内存管理区的组织,每个内存管理器由管理区描述符描述。管理器描述符的struct zone_pgdat
字段表示它属于那个内存节点。管理器描述符中的char* name字段表示管理区的名字,有三种ZONE_DMA
ZONE_NORMAL ZONE_HEGHMEM。分别对应的物理内存范围ZONE_DMA<=16Mb,
16Mb<=ZONE_NORMAL<=896Mb,ZONE_HIGHMEN>=896Mb。
3/ 内存管理区由管理区分配器分配,每个内存管理区为内存管理的独立单位,并由伙伴系统进行内存管理。为了
提高管理的效率,伙伴系统会预先分配一下页框用于满足内核经常请求和释放的单个页框,这些预先分配的
页框叫做每CPU页框高速缓存,由内存管理区描述符中的字段struct pageset中的per_cpu_pages进行描述并
由伙伴系统进行管理。即,页框不够时分配一些给它,充足时从每CPU页框高速缓存中回收一些页框。
4/ 为了解决伙伴系统的缺点,即伙伴系统只能解决外碎片问题,对于由于请求内存的大小与分配给它的大小
不匹配产生的内碎片问题,linux引入了slab分配器,它建立在伙伴系统对页框的管理之上。
阅读(2133) | 评论(0) | 转发(1) |