操作系统学习笔记(七):连续内存分配——内存碎片、动态分配

在没有其他方式辅助的情况下,我们分配给一个进程的内存是连续的。在分配时候我们需要有动态分配与碎片处理。如何理解呢?就是每个进程需要一块内存,我们要选取合适的位置的内存分配给它。当有的进程先结束了内存还给操作系统,此时可能就会产生内存碎片,要对碎片进行处理。首先对一些概念进行解释。

  • 连续内存分配:给进程分配一块不小于指定大小的连续的物理内存区域。
  • 内存碎片:不能被利用的空闲内存,内存碎片又分为外部碎片和内部碎片。
  • 外部碎片:分配单元之间的未被利用的内存,比如两个进程之间的进程结束后的空间,如果后续请求的大小都大于这一部分空间,这部分空间就不能被利用,也就形成了外部碎片。
  • 内部碎片:分配单元内部的未被使用的内存,这是由于分配时可能只能分配2的幂次方大小内存比如512字节,而实际使用了510字节,那么就有2字节的内部碎片。

动态分配:

当程序加载执行时,需要分配给进程一个指定大小可变的分区,分区的地址是连续的。如图中右侧分给进程1到6内存空间。当进程3和进程5结束后它们所占有的位置重新变为空闲。操作系统要维护的数据结构就包含了内存中已分配区域与未分配区域。当有新的进程请求一定的内存空间时,则根据未分配空间进行一个动态分区分配。分配的策略是多种多样的。比如:

  • 最先分配,空闲分区列表按照地址顺序排序,遍历空闲分区,遇到的第一个大小满足需求的区域分配给进程。释放内存使,查看附近是否有临近的空闲区,有的话进行合并。优点是找和合并开销较小,算法简单,并且由于每次从小地址开始查找,可以在大地址处留有大块的空闲分区,可以分配给需要大内存的进程。缺点是会有外部碎片,因为切完剩下的可能有很多小块内存,也因此分配大内存时需要遍历到最后时间较长。
  • 最佳匹配,空闲分区列表按照大小排序,寻找空闲区域中大小大于需求大小中最小的分配给进程,具体实现时可以对空闲分区按大小排序从最小开始寻找第一个大于需求的内存区即可,如果不排序则需要整个遍历一遍。释放时,也是与邻近空闲区域合并。而合并时我们要找的是地址邻近的而不是大小邻近的,所以合并的开销会大一些。优点大部分分配的内存尺寸较小时效果很好,因为可以避免较大的内存被拆分,同时减小外部碎片的大小,同时相对来说比较简单。缺点是外部碎片还是较多,并且越小越无法被利用,容易产生很多无用的小碎片,此外如前所述释放分区较慢,合并时算法复杂。
  • 最差匹配,空闲分区列表按照大小排序,寻找空闲去榆中大小最大的区域从中划分出需要大小的内存分配给进程。释放时寻找邻近空闲分区合并。因此也存在最佳匹配的问题,释放内存时合并算法开销较大。优点是中等尺度内存分配较多时效果最好,可以避免产生太多小碎片。缺点是释放较慢,也会有外部碎片,容易破坏大的内存区域,因此后续无法分配大内存。

 

你可能感兴趣的:(操作系统学习:清华大学学堂在线)