Linux下的内存分配方式简述

来源:互联网 发布:淘宝网对联宣纸 编辑:程序博客网 时间:2024/04/29 13:11

1.Buddy System

内存的最小单位为页(4KB),在此基础上使用“伙伴系统算法”协助管理不同连续长度的内存段,将1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块分类管理。

2.slab

在伙伴系统上还有slab协助内存管理,其原理大致为,先统一获取大内存段并且切割分配,当用户需要特定大小内存的时候,从其中取出初始化好的内存返回。

3.各种api函数:

3.1 alloc_pages, 是最原始的内存分配方式,直接从伙伴系统中获取原始页框,通过FORCE_MAX_ZONEORDER对最大获取页数进行限制,一般最大为10,即返回的内存最大为4M。
3.2__get_free_pages,仅是对alloc_pages进行封装,因此最大限制也是4M。
3.3 dma_alloc_coherent 也是通过alloc_pages实现,因此最大限制为4M。
3.4 kmem_cache_alloc ,是基于slab的一种分配方式,适用于反复分配释放同一大小内存块的场合,先通过kmem_cache_create创建一个高速缓存区域,然后用kmem_cache_alloc从 该高速缓存区域中获取新的内存块,kmem_cache_alloc一次能分配的最大内存由mm/slab.c文件中的MAX_OBJ_ORDER宏 定义,在默认的2.6.18内核版本中,该宏定义为5, 于是一次最多能申请1<<5 * 4KB也就是128KB的连续物理内存。
3.5 kmalloc,通过kmem_cache_alloc实现,因此最大只能申请128KB。
3.6 vmalloc前面的内存分配方式都是物理连续,vmalloc没有大小限制,但是仅逻辑地址连续。

这里写图片描述

4.内存分配中的flags:

GFP_KERNEL表示内存分配(最终总是调用get_free_pages来实现实际的分配;这就是GFP前缀的由来)是代表运行在内核空间的进程执行的。使用GFP_KERNEL容许kmalloc在分配空闲内存时候如果内存不足容许把当前进程睡眠以等待。因此这时分配函数必须是可重入的。如果在进程上下文之外如:中断处理程序、tasklet以及内核定时器中这种情况下current进程不该睡眠,驱动程序该使用GFP_ATOMIC.

0 0
原创粉丝点击