在多道程序的存储管理模式中,分区分配算法显得尤为重要。这里主要说一下动态分区分配算法。
主要有下面五种分配算法:
- 首次适应算法
- 循环首次适应算法
- 最佳适应算法
- 最坏适应算法
- 快速适应算法
对于这几种方式的算法,可以说各自有其优缺点,或许它的优点正好就是它的缺点呢!
首次适应算法
顾名思义,首次适应是从空闲链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止,然后按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍然留在空闲链中。若从头到尾都不能找到一个能满足空间要求的分区,则此次内存分配失败。该算法倾向优先使用内存中低地址部分的空闲分区,从而保留了高址部分的大空闲区,为后续到达的大作业分配大的内存空间创造了条件。那么相反,每次都从空闲链首开始查找,低地址部分不断的被划分就会导致产生许多难以利用的、很小的空闲分区,同时也会增加每次查找的开销。
循环首次适应算法
没错,比前一个多了循环两个字,即就是在前一个算法的基础上添加了循环的功能,使用该算法为进程分配内存空间时,不再从头开始,而是从上次分配的位置为起点的下一个分区为起点开始查找,其余与首次适应算法相同。这样就解决了每次从头开始查找开销大的问题,但是这样在多次分配之后也会导致缺乏大的空闲分区
最佳适应算法
最佳适应是在每次分配时将**能满足要求的最小的**空闲分区分配给作业,避免了大材小用。为了加速查找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链,这样,从该空闲分区链中查找到的第一块符合要求的空闲区必然是最佳的。但是最佳适应算法也是有缺点的,每次分配的是最佳,那么剩余的空闲将会是尽可能的小,就会导致小的空闲分区无法分配给作业,就会在存储器中留下许多难以利用的小空闲区。
最坏适应算法
与最佳适应算法正好相反,最坏适应算法是挑选一个最大的空闲分区给作业分配使用,其优点是可使剩余空间不至于太小,产生碎片的几率最小,对中、小作业有利。同时,该算法要求所有的空闲分区按其容量以从大到小的顺序形成空闲分区链,查找时只要看第一个分区能产生否满足要求即可。,那么它的缺点就对应是缺少大的空闲分区。
上述四种算法也称为顺序搜索法。
快速适应算法
又称为分类搜索法,是将空闲分区根据其容量按照大小进行分类,对每类相同容量的所有空闲分区,单独设立一个空闲分区链表,这样,就会在系统中存在多个空闲分区链表,同时会在内存中设立一张管理索引表,该表的每一个表项对应一中空闲分区类型,并记录该类型空闲分区链表表头的指针。空闲分区的分类是根据进程常用的空间大小进行划分,比如2k、4k、8k等,对于特殊大小的分区,如7k大小,即可放在特殊的分区中,也可放在8k分区的链表当中。
该算法的优点是查找效率高,仅需要根据进程的长度,寻找到能容纳它的最小空间区链表,并取第一块进行分割即可。另外该算法在进行空闲分区分配时不会对任何分区产生分割,所以能保留大的分区,也不会产生内存碎片。
缺点是在进行分区归还时算法复杂,系统开销大。
+++++++++++++++++++++++++++++++++++++
顺带看一下分区分配中的数据结构
常用的有下面的两个数据结构:
- 空闲分区表:在系统中设置一张空闲分区表,用于记录,每个空闲分区的情况,每个空闲分区占一个表目,表中包括分区序号,分区开始地址以及分区的大小等数据。
- 空闲分区链:这个数据结构是在每个分区的起始部分设置一些用于控制分区分配的信息,以及用于链接各个分区所用的前后指针,这样可以将所有的空闲分区链接成一个双向链,为了检索方便,在分区尾部重复设置状态伟和分区大小表目,当分区已分配,则将状态位由0该为1,此时前后向指针失去作用。