Linux内核:内存管理(2)——内存管理

1 页框管理

内核把物理页(4kb)作为内存管理的基本单位。每个页放置在页框中,内核记录页框的状态信息保存在page页描述符中,page放置在mem_map数组中。每个page长度为32字节,故mem_map占RAM不到1%(32/4k = 1/128).

由于有些页位于内存中特定的物理地址上,不能进行一些特定的任务(DMA只能对前16MB寻址,32位计算机只能访问部分内存等)。内核将特定性质的页划分成区(zone)

  • ZONE_DMA :低于16mb的内存页框 ,DMA使用的页
  • ZONE_NORMAL:低于896mb的内存页框 ,正常寻址的页
  • ZONE_HIGHMEM:高于896mb的内存页框 ,高端内存,动态映射的页

Linux把系统的页划分成为区(zone),形成不同的内存池。当内核调用一个内存分配函数时,必须指明请求页框所在管理区。

进行内存分配请求时有两种方法:首先当有足够的空闲内存时,请求会被立刻满足;否则,必须回收一些内存并将发出请求的内核控制路径阻塞,直到有内存被释放原子内存请求则直接失败)。
为了减少失败的情况,内核位原子内存请求保留了一个页框池,仅仅在内存不足时才使用。

1.1 分区内框分配器

分区页框分配器处理对连续页框组的内存分配请求,主要组成如下图所示:
在这里插入图片描述
管理区分配器接受动态内存分配与释放的请求,它首先从每CPU页框高速缓存 (很小) 中请求页框,若无法满足才从伙伴系统中请求分配。

1.2 伙伴算法(解决外碎片问题)

在实际应用中,经常需要分配一组连续的页框,而频繁地申请和释放不同大小的连续页框,必然导致在已分配页框的内存块中分散了许多小块的空闲页框。这样,即使有足够的页框是空闲的,其他需要分配连续页框的应用也很难得到满足。(外碎片问题)

为了避免出现这种情况,Linux内核中引入了伙伴系统算法(buddy system)。把所有的空闲页框分组为11个块链表 存于数组free_area,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值