1、内存碎片问题
空闲内存不能被使用,这些内存就称为内存碎片。内存碎片又可以分为外部碎片和内部碎片两种。其中,当给多个应用程序分配内存空间之后,在不同应用程序之间残留小块的内存空间,无法被利用,这些残留的内存空间就叫外部内存碎片。在已经分配给应用程序的空间中,无法被应用程序使用的内存空间称为内部内存碎片。
2、分区的动态分配
当一个程序被准许在内存中运行时,OS会为其分配一个连续的区间;当应用程序需要访问某些数据时,OS会分配一个连续的内存区间以供应用程序来访问数据。下面介绍3个简单的内存分配算法:首次适配;最优适配和最差适配。
2.1 首次适配算法-first fit
从低位地址开始寻找空闲的地址空间,若寻找到满足要求的空闲地址空间,则将需求直接分配给首次遇到的空闲地址空间。如下图所示,采用first fit分配算法时,将使用1K bytes的空间作为目标空间进行分配。
在进行重分配的时候还需要进行内存回收的检查,检查是否自由分区能和相邻的空闲分区进行合并。
first fit方法操作简单,易于产生更大的空闲块,但容易产生外部碎片,同时空间分配具有不确定性。
2.2 最优适配算法-best fit
从低位地址开始寻找空闲的地址空间,若寻找到满足要求的空闲地址空间,则记录空闲地址空间和所需空间大小之间的差值,最终选择差值最小的空闲空间作为目标地址空间分配给需求空间。如上图所示,采用best fit分配算法时,将选取500 bytes的地址空间进行分配。
best fit避免了分割大空闲块,同时最小化了外部碎片产生的尺寸,对于小尺寸的内存分配时非常有效,操作简单。但best fit使得外部碎片比较小,更难以利用。
2.3 最差适配算法-worst fit
从低位地址开始寻找空闲的地址空间,若寻找到满足要求的空闲地址空间,则记录空闲地址空间和所需空间大小之间的差值,最终选择差值最大的空闲空间作为目标地址空间分配给需求空间。如上图所示,采用worst fit分配算法时,将选取2K bytes的地址空间进行分配。
worst fit避免了太多微小的碎片,对于分配中尺寸效果最好,但其易于破碎大的空闲块使得大分区无法被分配。
3、压缩式碎片处理-compaction
将已经在内存中的程序进行位置的挪动,从而使得某些细小的外部内存碎片进行合并成为连续的内存空间。但这种方法需要将程序的地址空间进行拷贝和复制,会造成较大的开销。
4、交换式碎片处理-swapping
利用硬盘作为内存的备份,将硬盘利用起来。将某些暂时不执行的程序放到硬盘进行暂时的储存,给需要的程序腾出更多的内存空间。
swapping后续还需要考虑到选择哪个程序进行转移?在何时进行换入和换出的操作?在虚存管理中会优化换入和换出操作。