主要内容

  • 连续内存分配
  • 内存碎片问题
  • 分区的动态分配
    • 第一适配
    • 最佳适配
    • 最差适配
  • 压缩式碎片整理
  • 交换式碎片整理

 

内存碎片问题

内存碎片: 内存中无法进一步利用的内存空间。

 

碎片分类

  • 外碎片:在分配单元之间未使用的内存
  • 内碎片:在分配单元内部未使用的内存

我们想有一种比较简单有效的方法,尽量地减少内碎片和外碎片。

分区的动态分配

  操作系统需要管理空闲的和非空闲的内存空间,为应用程序提供服务。在两种情况下,需要分配内存空间:

  1. 当一个程序准许运行在内存中时,分配一个连续的区间
  2. 分配一个连续的内存区间给运行的程序以访问数据

分配策略

  操作系统需要通过一定的算法和数据结构,来对空闲的内存空间进行分配。这里介绍三种比较简单的分配策略:

  • 首次适配:为了分配n字节,使用第一个可用空闲块以致块的尺寸比n大

 

 

  • 最优适配:为了分配n字节使用最小的可用空闲块,以致块的尺寸比n大

 

 

  • 最差适配:为了分配n字节.使用最大可用空闲块,以致块的尺寸比n大

 

 

三种分配策略的比较

  特点 优势 劣势
首次适配

按地址排序的空闲块列表

分配需要寻找一个合适的分区

重分配需要检查,看是否自由分区能合并于相邻的空闲分区(若有)

简单,易于实现

易于产生更大的空间快,向着地址空间的结尾

容易产生外部碎片

不确定性强

最优适配

为了避免分割大空闲块

为了最小化外部碎片产生的尺寸

按尺寸排列的空闲块列表

分配需要寻找一个合适的分区

重分配需要搜索及合并于相邻的空闲分区(若有)

当大部分分配是小尺寸时非常有效

比较简单

易产生外部碎片

重分配慢

易产生很多没用的微小碎片(不怎么好)

最差适配

为了避免有太多微小的碎片

按尺寸排列的空闲块列表

分配很快(获得最大的分区)

重分配雷要合并于和邻的空闲分区,若有.然后调整空闲块列表

假如分配是中等尺寸效果最好

重分配慢

易产生外部碎片

易于破碎大的空闲块以致大分区无法被分配

 

注意,没有最好的分配算法一说,因为应用程序的请求是随机产生的。这三种算法没有一种能满足所有的需求,在实际管理过程中,还有更复杂的内存管理算法。 

无论采用哪种内存管理算法,都有可能产生碎片。我们希望能对这些碎片进行进一步处理,甚至减少或者消失。常用的碎片处理方法包括压缩式碎片整理和交换式碎片整理两种。

压缩式碎片整理

 

  • 重置程序以合并孔洞

  如图所示,在内存中有四个程序,三段内存碎片共六个空闲的空间块,如果有第五个应用程序需要占有六个空间块,当前内存是不能满足请求的,因为虽然总的空间块足够,但并不连续。

 

一种解决的方法是,移动应用程序P1~P4的位置,让这六个空闲的空间块连到一起。

 

  • 要求所有程序是动态可重置的

    要实现程序的移动,需要保证程序是动态可重置的。这里面涉及两个问题:1. 何时重置 2. 重置的开销。

  • 议题
    • 何时重置?

      重置程序时程序肯定不能处于运行状态,必须是静止的。

    • 开销

      要实现程序的重置需要对内存进行拷贝。内存拷贝的开销是很大的。

交换式碎片整理

  另一种处理内存碎片的方法是交换式碎片处理,这种方法将硬盘作为内存的后备。如图所示:

    有P1~P4四个程序,P3正在运行,其他三个正在等待。如果P3需要更多的内存,这时已经不能通过程序重置获得更多的空闲空间了。这时可以抢占等待的程序并回收它们的内存。例如将P4挪到硬盘上面去。

  • 问题: 选择哪个程序换出?何时换入换出?

    这些问题会在虚拟内存管理的课上做进一步讲解。