linux伙伴系统

本文主要介绍了在Linux 2.6.24内核中伙伴系统的工作原理,包括内存块的分配与合并策略。在找不到合适内存块时,通过对半分离策略寻找并尝试合并相邻释放块,以满足内存申请需求。
摘要由CSDN通过智能技术生成

前段时间由于实验室相关项目的需要+OS课的presentation,看了linux2.6.24内核伙伴系统的源码。写一下总结。

引言
    伙伴系统作为一种古老而历经检验的系统,也被Linux内核所采用。伙伴系统的提出是为了管理和记录内存的分配和使用。在X86架构的Linux内核版本 2.6.24及之后,Linux对原本的伙伴系统做了改进,在原来的基础上加入了反碎片机制,使得内核能够更好的管理内存的外部碎片。
    本文的分析针对X86架构。首先介绍了什么是伙伴系统,以及伙伴系统的相关数据结构。然后分析了X86架构上Linux 2.6.24这个版本对伙伴系统做的改进(加入了反碎片机制)。最后从源代码出发,深入揭示了伙伴系统的内核工作流程。

什么是伙伴系统
    伙伴系统的宗旨就是用最小的内存块来满足内核对于内存的请求。在最初,只有一个块,也就是整个内存,假如为1M大小,而允许的最小块为64K,那么当我们申请一块200K大小的内存时,就要先将1M的块分裂成两等分,各为512K, 这两份之间的关系就称为伙伴,然后再将第一个512K的内存块分裂成两等分,各为256K,将第一个256K的内存块分配给内存,这样就是一个分配的过程。下面我们结合示意图来了解伙伴系统分配和回收内存块的过程。
图1 伙伴系统示意图
1. 初始化时,系统拥有1M的连续内存,允许的最小的内存块为64K,图中白色的部分为空闲的内存块,着色的代表分配出去了的内存块。
2. 程序A申请一块大小为34K的内存,对应的order为0,即2^0=1个最小内存块
   2.1 系统中不存在order 0(64K)的内存块,因此order 4(1M)的内存块分裂成两个order 3的内存块(512K)
   2.2 仍然没有order 0的内存块,因此order 3的内存块分裂成两个order 2的内存块(256K)
   2.3 仍然没有order 0的内存块,因此order 2的内存块分裂成两个order 1的内存块(128K)
   2.4 仍然没有order 0的内存块,因此order 1的内存块分裂成两个order 0的内存块(64K)
   2.5 找到了order 0的内存块,将其中的一个分配给程序A,现在伙伴系统的内存为一个order 0的内存块,一个order 1的内存块,一个order 2的内存块以及一个order 3的内存块
3.程序B申请一块大小为66K的内存,对应的order为1,即2^1=2个最小内存块,由于系统中正好存在一个order 1的内存块,所以直接用来分配
4 程序C申请一块大小为35K的内存,对应的order为0,同样由于系统中正好存在一个order 0的内存块,直接用来分配
5 程序D申请一块大小为67K的内存,对应的order为1
   5.1 系统中不存在order 1的内存块,于是将order 2的内存块分裂成两块order 1的内存块
   5.2 找到order 1的内存块,进行分配
<
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值