实验二:循环首次适应法
(一)需求分析
该算法是首次适应算法的变种。在分配内存空间时,不再每次从表头(链首)开始查找,而是从上次找到空闲区的下一个空闲开始查找,直到找到第一个能满足要求的的空闲区为止,并从中划出一块与请求大小相等的内存空间分配给作业。该算法能使内存中的空闲区分布得较均匀。
(二)概要设计
循环首次适应主要由以下几个函数构成:
分配函数feipei()、释放函数shifang()、调整的函数tiaozheng()、打印输出函数print()、循环首次适应函数xunhuan()。
其中fenpei函数检查空闲区说明表是否有满足要求的空闲区;shifang函数用于;tiaozheng函数使空闲区按始地址从小到大排列,空表目放在最后面;Print函数用于输出打印。
(三)详细设计
1、设计结构体如下
struct area
{ int startaddr; int size; int state;
}freeN]={{10,30,1},{50,70,1},{150,90,1},{300,200,0},{630,20,1}};
表示空白的内存区,int startaddr表示首地址,int size;表示大小,int state;表示状态(空白或被占用)。
2、fenpei()函数:检查空闲区说明表是否有满足要求的空闲区,从上次找到的空闲去的下一个空闲分区开始找。有则为作业分配内存,没有则返回-1。
3、shifang()函数:从键盘输入释放区的开始地址及大小,从第一个空闲区开始找是否分别有与高地址、低地址、高地地址都相邻。有则合并相邻区域,否则自己单独成为一个空白区
4、tiaozheng()函数:利用for循环对空闲区表中的空闲区调整。 5、Printf()函数:输出打印数据。
6、xunhuan()函数:在循环首次函数中获取作业所需内存的大小,调用fenpei()函数为作业分配空间,start为返回的始地址。非配成功则打印空白区。调用shifang()主存回收函数。
(四)测试结果
(五)附录
#include \#define N 5 int start;
struct area
{
int startaddr;/*空闲区始址*/ int size;/*空闲区大小*/
int state;/*空闲区状态:0为空表目,1为可用空闲块*/
}free[N]={{20,20,1},{80,50,1},{150,30,1},{300,30,0},{600,10,1}}; main() {
xunhuan(); }
void xunhuan() {
int zone,i=0,j; char end;
printf(\ while((end=getchar())=='y') {
printf(\
tiaozheng(); /*对空闲区表中的空闲区调整的函数*/ print(); /*打印空闲区表的初始状态*/ printf(\ scanf(\输入作业的申请量*/ if(i==N-1) {
i=feipei(zone,i); if(i==-1)i=0; }
else if(i i=feipei(zone,i); /*调用alloc2()函数为作业分配空间,start为返回的始地址*/ if(i==-1) /*分配不成功时,返回-1*/ printf(\ else { tiaozheng(); printf(\ print(); /*打印空闲区表*/ printf(\ printf(\ printf(\ printf(\ }