内存碎片的处理

(摘抄自https://www.zhihu.com/question/51836333性能

处理内存碎片的方法:使用基于页面的内存管理方式。优化

内存碎片是如何出现的?操作系统

  当使用最原始的标记分配方法分配内存时,系统须要维护一个简单的内存信息表:翻译

  

  当程序申请一个长度为3的内存空间后:3d

  当程序再申请一个长度为2,以及长度为4的内存空间后:blog

  此时,只剩1个可用空间。若是这时程序再来申请长度大于1的空间,就申请不了,也就是内存不够。ip

  如今,释放掉ID=2的空间:内存

  咱们发现,如今可用内存空间为3,可是,这3个空闲空间,并非连续的。因此,若是程序如今申请长度为3的内存空间,一样会申请不了,会出现内存不够。业界把这种状况,称之为【内存碎片】get

基于页面的内存管理方式:内存管理

  首先,把物理内存,按照某种尺寸,进行平均分割。好比我如今以2个内存单位,来分割内存,也就是每两个连续的内存空间,组成一个内存页:

 

  接着,系统一样须要维护一个内存信息表:

  如今,程序申请长度为3的内存空间,不过因为如今申请的最小单位为页面,而一个页面的长度为2,所以如今须要申请2个页面,也就是4个内存空间。你看,这就浪费了1个内存空间。

  

  

  接着,程序再申请长度为1,长度为2的空间:
  
  释放掉ID=2,内存页ID为3的那条内存空间信息:
  
  如今,就出现了以前的状况:目前一共有4个内存空间,可是不连续。不过,由于如今是分页管理机制,所以,如今仍然能够继续申请长度为4的内存空间:
两种方式对比:
  原始的内存分配方式,虽然容易出现碎片,而且内存空间的利用率低,可是使用性能高,程序能直接从内存信息表获取内存地址,接着就能够直接按照地址来使用内存空间了。
  基于页面的内存管理方式,没有内存碎片,可以尽可能地所有用完空间,可是程序须要记录的是内存页ID,每次使用时,须要从内存页ID翻译成实际内存地址,多了一次转换。并且这种模式,会浪费一些内存,好比上面申请3个内存空间,实际分配了2个页面共4个内存空间,浪费了1个内存空间。

  以上就是基本原理,实际系统中会作很是多的优化。目前各类主流操做系统都是分页的方式,所以你不须要太关心碎片。

  这个话题再延伸下去,就是一个程序内部的局部内存池了。不过这是另外一个问题,喜欢的话能够深究一下。 做者:匿名用户 连接:https://www.zhihu.com/question/51836333/answer/145693402 来源:知乎 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
相关文章
相关标签/搜索