Linux操作系统内存管理(一)

✅ 空闲页面的管理

空闲内存管理的基本单位是页面。Linux内核管理的每个内存空闲块都是2的幂次方个页面,大小为order。

存放:一个空闲页面的放在一起,2个空闲页面的放在一起,4个空闲页面的放在一起......(物理地址连续)一直到MAX_ORDER-1。(定义MAX_ORDER=11)最大连续空闲物理内存大小是4MB。

区域(zone)数据结free_area[MAX_ORDER]构中数组保存每个空闲内存块链表。

Struct free_area{

Struct list_head free_list[];//空闲页面的双链表

Int *map;

}

list_head是一个双向链表结构,链表中元素的类型将为struct page结构。

Map域指向一个位图,其大小取决于现有的页面数。free_area第k项位图的每一位,描述的就是大小为2k个页面的两个伙伴块的状态。如果位图的某位为0,表示一对兄弟块中或者两个都空闲,或者两个都被分配,如果为1,肯定有一块已被分配。当兄弟块都空闲时,内核把它们当作一个大小为2k+1的单独快来处理。

Linux内核物理内存三个层次:节点,区域,页面。节点下的每个区域都管理着自己的空闲物理页面。

 

·伙伴算法(内存分配算法)

减少外部碎片,允许快速分配与回收物理页面。

情景:当需求一个4个连续页面的时候,检查是否又大小为2^3-1个页面的空闲块满足,如果链表上又,就分配给用户,否则向下一个级别(order)的链表中查找。

可以借助二叉树的数据结构来实现伙伴算法的仿真模拟(具体待议)

·页面分配过程

在4K页面大小的系统中,每次最多分配4MB的连续物理内存。如果内核需要的内存大于4MB,只能连续多次申请4MB内存拼成大块内存,并且必须保证物理地址连续。

·页面回收过程

标记页面块空闲;查看相邻物理页面是否空闲,如果空闲合并成更大的的物理页面块;有合并要更新freearea[]中链表元素;更新统计信息。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值