主要内容
- 连续内存分配
- 内存碎片问题
- 分区的动态分配
- 第一适配
- 最佳适配
- 最差适配
- 压缩式碎片整理
- 交换式碎片整理
内存碎片问题
内存碎片: 内存中无法进一步利用的内存空间。
碎片分类
- 外碎片:在分配单元之间未使用的内存
- 内碎片:在分配单元内部未使用的内存
我们想有一种比较简单有效的方法,尽量地减少内碎片和外碎片。
分区的动态分配
操作系统需要管理空闲的和非空闲的内存空间,为应用程序提供服务。在两种情况下,需要分配内存空间:
- 当一个程序准许运行在内存中时,分配一个连续的区间
- 分配一个连续的内存区间给运行的程序以访问数据
分配策略
操作系统需要通过一定的算法和数据结构,来对空闲的内存空间进行分配。这里介绍三种比较简单的分配策略:
- 首次适配:为了分配n字节,使用第一个可用空闲块以致块的尺寸比n大
- 最优适配:为了分配n字节使用最小的可用空闲块,以致块的尺寸比n大
- 最差适配:为了分配n字节.使用最大可用空闲块,以致块的尺寸比n大
三种分配策略的比较
特点 | 优势 | 劣势 | |
首次适配 |
按地址排序的空闲块列表 分配需要寻找一个合适的分区 重分配需要检查,看是否自由分区能合并于相邻的空闲分区(若有) |
简单,易于实现 易于产生更大的空间快,向着地址空间的结尾 |
容易产生外部碎片 不确定性强 |
最优适配 |
为了避免分割大空闲块 为了最小化外部碎片产生的尺寸 按尺寸排列的空闲块列表 分配需要寻找一个合适的分区 重分配需要搜索及合并于相邻的空闲分区(若有) |
当大部分分配是小尺寸时非常有效 比较简单 |
易产生外部碎片 重分配慢 易产生很多没用的微小碎片(不怎么好) |
最差适配 |
为了避免有太多微小的碎片 按尺寸排列的空闲块列表 分配很快(获得最大的分区) 重分配雷要合并于和邻的空闲分区,若有.然后调整空闲块列表 |
假如分配是中等尺寸效果最好 |
重分配慢 易产生外部碎片 易于破碎大的空闲块以致大分区无法被分配 |
注意,没有最好的分配算法一说,因为应用程序的请求是随机产生的。这三种算法没有一种能满足所有的需求,在实际管理过程中,还有更复杂的内存管理算法。
无论采用哪种内存管理算法,都有可能产生碎片。我们希望能对这些碎片进行进一步处理,甚至减少或者消失。常用的碎片处理方法包括压缩式碎片整理和交换式碎片整理两种。
压缩式碎片整理
- 重置程序以合并孔洞
如图所示,在内存中有四个程序,三段内存碎片共六个空闲的空间块,如果有第五个应用程序需要占有六个空间块,当前内存是不能满足请求的,因为虽然总的空间块足够,但并不连续。
一种解决的方法是,移动应用程序P1~P4的位置,让这六个空闲的空间块连到一起。
- 要求所有程序是动态可重置的
要实现程序的移动,需要保证程序是动态可重置的。这里面涉及两个问题:1. 何时重置 2. 重置的开销。
- 议题
- 何时重置?
重置程序时程序肯定不能处于运行状态,必须是静止的。
- 开销
要实现程序的重置需要对内存进行拷贝。内存拷贝的开销是很大的。
交换式碎片整理
另一种处理内存碎片的方法是交换式碎片处理,这种方法将硬盘作为内存的后备。如图所示:
有P1~P4四个程序,P3正在运行,其他三个正在等待。如果P3需要更多的内存,这时已经不能通过程序重置获得更多的空闲空间了。这时可以抢占等待的程序并回收它们的内存。例如将P4挪到硬盘上面去。
- 问题: 选择哪个程序换出?何时换入换出?
这些问题会在虚拟内存管理的课上做进一步讲解。