Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园

Linux系统内存管理之伙伴系统分析

今天去面试,一位面试官提到了内存管理的伙伴系统,当时就懵了,因为根本就没有听说过。晚上回来在实验室查了一些资料,现总结如下:

1.伙伴系统概念

伙伴系统是一种经典的内存管理方法。Linux伙伴系统的引入为内核提供了一种用于分配一组连续的页而建立的一种高效的分配策略,并有效的解决了外碎片问题。

2.伙伴系统的组织结构

Linux中的内存管理的“页”大小为4KB。把所有的空闲页分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页块。最大可以申请1024个连续页,对应4MB大小的连续内存。每个页块的第一个页的物理地址是该块大小的整数倍。

  结构如图所示:第i个块链表中,num表示大小为(2^i)页块的数目,address表示大小为(2^i)页块的首地址。

3.伙伴系统的内存分配及释放

当向内核请求分配(2^(i-1),2^i]数目的页块时,按照2^i页块请求处理。如果对应的块链表中没有空闲页块,则在更大的页块链表中找。当分配的页块中有多余的页时,伙伴系统根据多余的页框大小插入到对应的空闲页块链表中。

释放单页的内存时,内核将其置于CPU高速缓存中,对很可能出现在cache的页,则放到“快表”的列表中。在此过程中,内核先判断CPU高速缓存中的页数是否超过一定“阈值”,如果是,则将一批内存页还给伙伴系统,然后将该页添加到CPU高速缓存中。

释放多页的块时,内核首先计算出该内存块的伙伴的地址。内核将满足以下条件的三个块称为伙伴:(1)两个块具有相同的大小,记作b。(2)它们的物理地址是连续的。(3)第一块的第一个页的物理地址是2*(2^b)的倍数。如果找到了该内存块的伙伴,确保该伙伴的所有页都是空闲的,以便进行合并。内存继续检查合并后页块的“伙伴”并检查是否可以合并,依次类推。

4.伙伴系统的反碎片机制

内核将已分配页分为以下三种不同的类型:

(1)不可移动页:这些页在内存中有固定的位置,不能够移动。

(2)可回收页:这些页不能移动,但可以删除。内核在回收页占据了太多的内存时或者内存短缺时进行页面回收。

(3)可移动页:这些页可以任意移动,用户空间应用程序使用的页都属于该类别。它们是通过页表映射的。当它们移动到新的位置,页表项也会相应的更新。

在内存子系统初始化期间,所有的页都被标记为可移动的。在启动期间,核心内核分配的内存是不可移动的。此时内核的策略是分配一个尽可能大的连续内存块,将其从可移动列表转换到不可移动列表。分配一个尽可能大的连续内存块而不是选择更小的满足要求的内存块的原因如下:

例如:现有一块可移动的具有16页的连续空闲内存块。当内核需要分配1页不可移动内存页时。分配器选择后8页(而不是一页)转移到不可移动列表,然后从不可移动列表中选择1页用于分配。如果内核又需要分配1页不可移动内存页则从不可移动列表中选择一页用于分配,下图显示了进行4次分配后内存的分布。

但如果内核只选择1页用于分配将其加入到不可移动列表,当下次需要分配时又选择一页加入到不可移动列表,下图显示了按照这种方式进行4次分配后内存的分布。

因此,当没有满足可用于分配的不可移动空闲块时,分配器会在可移动列表中迁移一个尽可能大的连续内存块给不可移动列表。这样避免了启动期间内核分配的内存散列到物理内存各处,从而使其他类型的内存分配免受碎片的干扰。

Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园相关推荐

  1. Linux系统内存管理实验报告,Linux 内存管理 综合实验报告.pdf

    Linux 内存管理 综合实验报告 计算机与通信学院 Linux 内存管理 综合实验报告 指导老师:孙建华 组员 :夏槟 20040810720 段翼真 20040810503 米晓亮 2004081 ...

  2. linux系统内存管理含义,Linux内存管理--基本概念及相关数据结构

    一.内存管理的基本概念 1.存储空间 在32位嵌入式系统中,存储空间的地址范围从0x00000000到0xFFFFFFFF.这4GB存储范围内可以包括以下几种存储空间: 设备空间(MT_DEVICE) ...

  3. Linux系统内存管理实验报告,linux内存管理实验报告

    <linux内存管理实验报告>由会员分享,可在线阅读,更多相关<linux内存管理实验报告(13页珍藏版)>请在人人文库网上搜索. 1.操作系统实验报告院别:XXXXXX班级: ...

  4. Linux 系统内存分析

    1. 内存基本介绍 1.计算机基本结构: 电脑之父--冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器 如图: 输入设备:键盘鼠标等 CPU:是计算机的运算核心和控制核心, ...

  5. 剖析linux的内存管理与分配

    文章目录 伙伴算法 **1.伙伴算法原理** **2.物理页的分配** **3. 物理页的释放 ** **总结** Slab分配机制 **1.Slab如何对内存进行管理?** **2.Slab中如何实 ...

  6. 【Linux 内核 内存管理】物理分配页 ⑦ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 判断页阶数 | 读取 mems_allowed | 分配标志位转换 )

    文章目录 一.__alloc_pages_slowpath 慢速路径调用函数 二.判断页阶数 三.读取进程 mems_allowed 成员 四.分配标志位转换 五.__alloc_pages_slow ...

  7. 【Linux 内核 内存管理】分区伙伴分配器 ② ( free_area 空闲区域结构体源码 | 分配标志位 | GFP_ZONE_TABLE 标志位区域类型映射表 |分配标志位对应的内存区域类型 )

    文章目录 一.free_area 空闲区域结构体源码分析 二.分配标志位 三.GFP_ZONE_TABLE 标志位区域类型映射表 四.分配标志位对应的内存区域类型 一.free_area 空闲区域结构 ...

  8. Linux系统内存知识总结

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:22j.co/dJ29 Linux 内存是后台开发人员,需要深入了解 ...

  9. linux 内核内存管理

    物理内存 相关数据结构 page(页) Linux 内核内存管理的实现以 page 数据结构为核心,其他的内存管理设施都基于 page 数据结构,如 VMA 管理.缺页中断.RMAP.页面分配与回收等 ...

最新文章

  1. android自定义进度条渐变色View,不使用任何图片资源
  2. 远程命令执行与代码执行(remote command/code execute)漏洞总结
  3. 经典C语言程序100例之八零
  4. 对vue虚拟dom的研究
  5. loadrunner11基础使用
  6. python nums函数获取结果记录集有多少行记录_Python数据分析——Pandas数据结构和操作...
  7. 【java集合框架源码剖析系列】java源码剖析之ArrayList
  8. 「一道面试题」ArrayList和LinkedList有什么区别及使用场景
  9. 插值和空间分析(二)_变异函数分析(R语言)
  10. 程序员为什么更容易脱发?
  11. Windows 禁用U盘
  12. UFS Write Booster Feature Overview
  13. 记录习惯【Unity 3D中3D场景下嵌套2D Canvas并实现窗口缩放】
  14. 光驱动器类有哪些最新发表的毕业论文呢?
  15. 优雅地使用 C++ 制作表格:tabulate
  16. 如何读取csv文件并将其转化为tsv文件
  17. DNSpod+安全宝+360网站卫士的双CDN加速服务
  18. 计算机回收站设置大小,win10系统修改回收站存储位置和大小的操作办法
  19. GDUT_排位赛题解报告_第5场_A. 唯一排列
  20. ios9打不开html,vue项目在iOS safari浏览器上打不开,显示为空白?

热门文章

  1. 凡夫怎么可能揣度圣者的境界
  2. 提升 composer 的执行速读
  3. Windows Server 2008组策略安全实践手册
  4. python 根据判断产生新列_pandas DataFrame 根据多列的值做判断,生成新的列值实例...
  5. SmartNIC/DPU — 技术方向
  6. 反向telnet连接
  7. 【牛客网】牛客练习赛19 F 算式子【数学--递推 、前缀、数字】
  8. 纤涂覆层材料的研究与总结
  9. POJ 1028: Web Navigation
  10. sqoop配置与使用