目录

简介

背景

内存管理机制

当前存在的问题

伙伴算法

算法原理

内存分配

内存回收

优缺点分析

参考


简介

在Linux系统中,内存的分配与回收速率直接影响系统的存取效率。当内核频繁请求和释放不同大小的一组连续页框时,会导致许多外部空闲碎片,造成空间的浪费。使用伙伴算法可以有效地缓解该问题。伙伴关系机制是操作系统中的一种动态存储管理算法。在进行内存分配时,该算法通过不断平分较大的空闲内存块来获得较小的空闲内存块,直到获得所需要的内存块;在进行内存回收时,该算法尽可能地合并空闲块。

背景

内存管理机制

内存管理是应用程序通过硬件和软件协作访问内存的一种方法,当进程请求内存使用时,它给进程分配可用的内存;当进程释放内存时,回收相应的内存,同时负责跟踪系统中内存的使用状态。

在Linux系统中,首先将内存分为若干个节点,然后每个节点又可以分为1-3个区,每个区下又有若干个页。页是内存管理的基本单元。

当前存在的问题

当系统工作时,CPU最先访问的地址不是物理内存中的实地址,而是虚拟地址空间的虚地址。当请求分页时,首先在虚拟地址空间中分配一个虚拟空间,然后根据需要为此区间分配相应的物理页面并建立映射。

在分配空间时,我们首先想到的便是malloc函数。由于在实际情况中,操作系统必须能够在任意时刻申请和释放任意大小的内存,该函数的实现并不容易,导致的主要问题有延时问题和碎片问题。

延时问题指的是系统查找到可分配单元的时间变长,例如程序请求分配一个64KB的内存空间,系统查看64KB空间发现不全是空余的,于是查看65KB的空间,发现仍不能满足需求,直到查看80KB空间时,才满足了需求,这种方式请求次数多达17次,频繁操作时,非常耗时。

若系统以较大的定长空间来分配内存,在一定程度上可以节省时间,但带来的是碎片过多问题,由于每次用较大的空间进行分配,系统中出现大量碎片,导致内存浪费。严重者会导致内存无法完成分配,虽然仍有许多碎片空间。

基于此,系统需要一种能够高效分配内存,同时又能减少产生碎片的算法,伙伴算法能有效地解决该问题,如今已成为操作系统中的一种基础算法。

伙伴算法

算法原理

伙伴算法是一种动态存储器管理算法。该算法通过不断地平分较大的空闲内存块来获得较小的空闲内存块,直到获得所需要的内存块,当内存释放时,该算法尽可能地合并空闲块。其中,在分配和合并内存块时都是以2的次幂为单位,即1,2,4,8,16,32,64,128等。所谓“伙伴”,就是指在空闲块被分裂时,由同一个大块内存分裂出来的两个小块内存就互称“伙伴”。“伙伴”应当满足以下三个条件:

  • 两个块大小相同
  • 两个块地址连续
  • 两个块必须是同一个大块中分离出来的

伙伴算法使用位图和空闲链表作为辅助工具,其中位图用于跟踪内存块的使用情况,空闲链表用来维护内存中还没有被分配的块。假设系统的全部可用空间为 ,则建立一个长度为max+1的链表,链表尾存放大小为 的块,如下图所示:

当请求大小为size的空间时,  < size < ,且k < max。于是系统在链表中寻找大小为  的块,发现该位置为空,于是继续向下搜寻大小为  的块,若还为空,则继续向下搜寻,直到找到不为空的块  。

该块不为空,于是该块进行分裂,变为两个大小为  的块。其中一块插入到链表中  的位置,另一块继续分裂。重复此过程,直到分裂产生大小为  大小的块为止,结果如图所示:

如图所示,最后一次分裂时,由一个大小为  的块分成两个大小均为  大小的块。将其中一块交给用户使用,另一块加入到空闲链表相应位置中。

由于进行了多次分裂,链表的同一位置可能会出现多个大小相等的块,此时选用时只需要在表头选取一个即可。当进行合并操作时,只需将大小相等的块合并,然后插入到链表中相应位置即可。

以下用具体实例说明伙伴算法在内存分配与回收中的应用。

内存分配

下面通过一个例子说明内存分配的过程:

现内存总容量为16KB,用户请求分配4KB大小的内存空间,且规定最小的内存分配单元是2KB。于是位图分为8个区域,用1表示已分配,用0表示未分配,则初始位图和空闲链表如图所示。从上到下依次是位图、内存块、空闲链表。

由于需要分配4KB内存,数显到链表中4KB位置进行查看,发现为空,于是继续向后查找8KB位置,发现仍为空,直到到达链表尾16KB位置不为空。16KB块分裂成两个8KB的块,其中一块插入到链表相应位置,另一块继续分裂成两个4KB的块,其中一个交付使用,另一个插入到链表中,结果如下图所示。

内存回收

内存回收是内存分配的逆过程,假设以上存储要释放4KB内存,首先到链表中4KB位置查看是否有它的“伙伴”,发现该位置不为空,于是合并成一个8KB的块,继续寻找它的“伙伴”,然后合并成一个16KB的块,插入链表中。

若在查找过程中没有发现“伙伴”,则直接插入到链表中,然后将位图中的标记清零,表示内存可用。

优缺点分析

  • 伙伴算法采用2的幂次方进行分配内存块,可以避免把大的内存块拆分的过小,更重要的是可以加快分配和释放速度,但如果所需要的空间不是2的整数次幂,则会产生许多内部碎片。
  • 分配和合并采用链表和位图操作,操作方便,但是开销比较大。
  • 一个很小的块往往会阻碍一个大块的合并,一个系统中,对内存块的分配,大小是随机的,一片内存中仅一个小的内存块没有释放,旁边两个大的内存块就不能合并。

参考

  1. 《Linux操作系统原理与应用》
  2. 《深入理解Linux内核》
  3. https://blog.csdn.net/lcl497049972/article/details/82954124
  4. https://www.cnblogs.com/alantu2018/p/8527821.html

Linux内存分配与回收——伙伴算法相关推荐

  1. linux内存分配与回收

    大神博客传送门:http://luodw.cc/2016/08/13/linux-cache/ 之前在实习时,听了OOM的分享之后,就对linux内核内存管理充满兴趣:但是这块知识非常庞大,没有一定积 ...

  2. Linux内存分配机制之伙伴系统和SLAB

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6539590.html  内核内存管理的一项重要工作就是如何在频繁申请释放内存的情况下,避免碎片的产生.这就要求 ...

  3. linux内存分配与回收及swap使用观察

    1) 系统刚刚启动的时候free会比较大 2) 运行一段时间之后,free会减小到很少,cache会增加到尽量大. 这会因为系统为了加速文件读写速度,减少磁盘使用次数尽量多的使用内存cache硬盘上的 ...

  4. linux为系统分配内存,Linux操作系统知识讲解:走进Linux 内存分配算法

    Linux 内存分配算法 内存管理算法--对讨厌自己管理内存的人来说是天赐的礼物 1.内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的 ...

  5. Java虚拟机学习(7):对象内存分配与回收

    对象优先在Eden上分配 大多数情况下,对象优先在新生代Eden区域中分配.当Eden内存区域没有足够的空间进行分配时,虚拟机将触发一次 Minor GC(新生代GC).Minor GC期间虚拟机将E ...

  6. JVM:内存分配与回收策略?Full GC 的触发条件?StopTheWorld ?

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行,执行的速度一般也会比较快. Full GC: ...

  7. 【拥抱大厂系列】百度面试官问过的 “JVM内存分配与回收策略原理”,我用这篇文章搞定了

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  8. Java 虚拟机内存分配与回收策略

    垃圾收集器与内存分配策略参考目录: 1.判断 Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9 中的 GC 调优 5.内存分配与回收策略 一.对象优先在 E ...

  9. Android的内存分配与回收

    想写一篇关于android的内存分配和回收文章的想法来源于追查一个魅族手机图片滑动卡顿问题,我们想了很多办法还是没有避免他不停的GC,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GC ...

最新文章

  1. 项目管理过程中,如何编制初步工作说明书
  2. FPGA SelectMap接口配置设计
  3. 使用OpenSSL实现证书操作
  4. hibernate实现增删改查的各种方法
  5. windows下CodeIgniter CLI Tool 指定host 和port无效问题
  6. js_jQuery【下拉菜单联动dom操作】
  7. xshell可以连接上linux,但是xftp却连不上问题
  8. 数据结构——图的C语言实现
  9. 9 WM层面 临时仓储类型的仓位 主数据不存在
  10. cocos studio 基本功能添加——场景(Scene)
  11. 【Python剧情版游戏】优美精致的画风甜甜的剧情、很难不让人上头啊?你get到了嘛
  12. SSM和SSH框架总结
  13. c语言关系运算符号比较大小,有哪些c语言关系运算符号
  14. 微博技术架构分析和设计
  15. 他发现了古老疟疾背后的元凶,也在质疑声中开创了致病生物的新时代
  16. Contect Me
  17. 商家门店会员管理,只要这五步,稳步提升销售额
  18. 第077封“情书”:弯弯绕<Entagma>Houdini 2018
  19. 关于PCB走线,铜厚与允许的最大电流之间的关系
  20. excel高级筛选怎么用_Excel中的【高级筛选】都不会使用,那就真的Out了!

热门文章

  1. 基于卷积神经网络的信用卡欺诈侦测
  2. 夏普/sharp+willcom+d4+刷linux,夏普手机怎么刷机
  3. 人工智能正处在一个转折点
  4. 【数值分析×机器学习】稀疏矩阵向量乘(SpMV)的运行时间预测(有点意思)
  5. 从键盘输入一个大写字母,转换成小写字母
  6. SMURF和D.R.DOS
  7. Freeswitch 录音配置
  8. 2021年上海教育行业发展现状分析:各阶段教育在校学生人数均保持增长趋势[图]
  9. CS224n NLP-Lecture 2: Word Vectors/第二讲-词向量表示: word2vec
  10. Redis 6.2 执行hset 操作(源码)