外碎片与内碎片

内部碎片
是处于操作系统分配的用于装载某一进程的内存区域内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
外部碎片
外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是处于任何两个已分配区域或页面之间的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。

内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片。

外部碎片的产生: 频繁的分配与回收物理页面会导致大量的、连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片。假设有一块一共有100个单位的连续空闲内存空间,范围是099。如果你从中申请一块内存,如10个单位,那么申请出来的内存块就为09区间。这时候你继续申请一块内存,比如说5个单位大,第二块得到的内存块就应该为1014区间。如果你把第一块内存块释放,然后再申请一块大于10个单位的内存块,比如说20个单位。因为刚被释放的内存块不能满足新的请求,所以只能从15开始分配出20个单位的内存块。现在整个内存空间的状态是09空闲,1014被占用,1524被占用,2599空闲。其中09就是一个内存碎片了。如果1014一直被占用,而以后申请的空间都大于10个单位,那么09就永远用不上了,变成外部碎片。

伙伴算法(buddy)用来解决外碎片
slab算法用来解决内碎片

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文:Linux内存管理 说明:本文在原文基础上稍加改动以便阅读理解。 摘要 本章首先以应用程序开发者的角度审视L...
    wingjay阅读 9,748评论 2 18
  • Linux内存管理涉及的面比较广泛而且比较复杂,这里只抽取部分知识来讲解 一 早期的内存分配机制 在早期的计算机中...
    cj3479阅读 6,089评论 0 0
  • 在linux下我们经常会使用到top,vmstat,free等命令查看系统或者进程的内存使用情况,经常会看到buf...
    tracy_668阅读 8,543评论 1 1
  • 在linux下,使用top,free等命令查看系统或者进程的内存使用情况时,经常看到buff/cache meme...
    analanxingde阅读 3,950评论 0 2
  • 昨天和亲人一起往周边城市走了一趟,很难得起了个早床。 不愉快的是司机走错了道,运气很好的是在车没油时刚好附近有...
    废材o_o阅读 3,106评论 0 0