由于当一个系统很大时,系统内的内存分区可能会很多,相应的空闲分区链就可能很长,这时采用顺序搜索分区的方法可能会很慢。为了提高搜索空间的分区的速度,在中大型系统中往往会采用基于索引搜索的动态分区分配算法,比如我们所熟知的哈希算法、快速适应算法以及伙伴系统。
1)哈希算法
由于分类搜索算法和伙伴系统算法中,都是将空闲分区根据分区大小进行分类,对于每一类具有相同大小的空闲分区,单独设立一个空闲分区链表。在为进程分配空间时,需要在每一张管理索引表中查找到所需要的空间大小所对应的表项,从中得到对应的空间内分区链表表头指针,从而通过查找一个空闲分区。如果对空闲分区分类比较细,则相应索引表的表项也就较多,因此会显著的增加搜索索引表的表项的时间开销。
哈希算法就是利用哈希快速查找的优点,以及空闲分区在可利用空闲分区表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个表项记录了一个对应的空闲分区链表表头指针。
当进行空闲分区分配时,根据所需要的空闲 分区大小,通过哈希函数计算,即得到在哈希表中的位置,从中得到相应的空闲分区链表,实现最佳分配策略。
2)快速适应算法(分类搜索法)
该算法就是将空闲分区根据容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一个空闲分区链表,这样的系统中存在多个空闲分区链表。同时,在内存总设立一张管理索引表,其中的每一个索引表项对应了一种空闲分区类型,并记录了该类型空闲分区链表表头的指针。空闲分区的分类是根据进程常用的空间大小进行划分的。
该算法在搜索可分配的空闲分区时分为两步:第一步是根据进程的长度,从索引表中寻找到能容纳它的最小空闲区链表;第二步是从链表中取下第一块进行分配即可。另外,该算法在进行空闲分区分配时,不会对任何分区产生分割,所以能保留大的分区,满足对大空间的需求,也不会产生内存碎片。优点是查找效率高。缺点是在分区归还时的算法复杂,系统开销大。此外,该算法在分配空闲分区时,是以进程为单位的,一个分区只属于一个进程,因此在为进程所分配的一个分区中,或多或少的存在一定的浪费。这是典型的以空间换时间的做法。
3)伙伴系统
该算法规定,无论已分配分区或空闲分区