一,实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
二,实验内容和要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
1 #include2 #include 3 #include 4 #define nil -1 5 #define NULL 0 6 #define maxisize 600 //用户的空闲区空间最大值 7 #define minisize 4 8 #define getspace(type) (type*)malloc(sizeof(type)) //分配空间 9 struct table{ 10 char job; //作业标号 11 float address; //分区起始地址 12 float length; //分区长度,单位为字节 13 int flag; //分区表的状态位 14 struct table *FRlink; //前向指针 15 struct table *RElink; //后向指针 16 }*free_table=NULL,*place; //已分配分区表,空闲分区表 17 typedef struct table FRtable; 18 19 FRtable *init(FRtable *tb) 20 { 21 tb->FRlink=NULL; 22 tb->job=nil; 23 tb->address=0; 24 tb->length=2048; 25 tb->flag=0; 26 tb->RElink=NULL; 27 return tb; 28 } 29 void allocate(char job,float xk,int choice) 30 { 31 FRtable *tb,*link; 32 int k=0;float temp=600; 33 if (free_table->FRlink==NULL&&free_table->RElink==NULL) 34 { 35 free_table->job=job; 36 free_table->length=xk; 37 free_table->flag=1; 38 if (xk RElink=tb; 42 tb->FRlink=free_table; 43 tb->job=nil; 44 tb->address=0+xk; 45 tb->length=maxisize-xk; 46 tb->flag=0; 47 } 48 if (choice==2) 49 { 50 free_table->FRlink=tb; 51 tb->RElink=free_table; 52 place=tb; 53 } 54 else 55 { 56 free_table->FRlink=NULL; 57 if (xk RElink=NULL; 58 } 59 k=1; 60 } 61 else 62 { 63 if (2==choice) tb=place;//采用CFF时将ta定位到上次找到的合适空间分区的下个空间分区 64 else tb=free_table; 65 while(tb!=NULL) 66 { 67 if (tb->length>=xk&&tb->flag==0) 68 if (tb->length-xk<=minisize) 69 { //当搜索到的空间大小<=xk+minisize时,将空间全部分配给作业 70 tb->job=job; 71 tb->flag=1; 72 place=tb->RElink; 73 k=1; 74 break; 75 } 76 else 77 { //当搜索到的空间大小>xk+minisize时,将空间划分,再分配给作业 78 link=getspace(FRtable); 79 link->length=tb->length-xk; 80 tb->job=job; 81 tb->length=xk; 82 tb->flag=1; 83 link->RElink=tb->RElink; 84 if (NULL!=tb->RElink) tb->RElink->FRlink=link; 85 tb->RElink=link; 86 link->FRlink=tb; 87 link->job=nil; 88 link->address=tb->address+xk; 89 link->flag=0; 90 place=link; 91 k=1; 92 break; 93 } 94 tb=tb->RElink; 95 } 96 } 97 if (0==k) 98 { 99 printf(">>空间申请失败! \n");100 return;101 }102 }103 104 //主存回收函数,回收作业job所占用的分区空间105 void reclaim(char job,int choice)106 {107 int bool1=0,bool2=0;108 FRtable *tb,*link;109 tb=free_table;110 if (2==choice) link=tb;111 else link=NULL;112 do113 {114 if (job==tb->job&&1==tb->flag) break;115 tb=tb->RElink;116 if (tb==link)117 {118 printf("\n>>抱歉,不存在作业%c! \n",job);119 return;120 }121 }while(tb!=link);122 bool1=(NULL==tb->FRlink||tb->FRlink==tb->RElink)? 1:tb->FRlink->flag;123 bool2=(NULL==tb->RElink||tb->FRlink==tb->RElink)? 1:tb->RElink->flag;124 if (bool1&&bool2)125 {126 tb->job=nil;127 tb->flag=0;128 }129 else if ((NULL==tb->FRlink||1==tb->FRlink->flag)&&0==tb->RElink->flag)130 {131 link=tb->RElink;132 tb->job=nil;133 tb->length+=link->length;134 tb->flag=0;135 tb->RElink=link->RElink;136 if (NULL!=link->RElink) link->RElink->FRlink=tb;137 free(link);138 }139 else if (0==tb->FRlink->flag&&1==tb->RElink->flag)140 {141 link=tb->FRlink;142 link->length+=tb->length;143 link->RElink=tb->RElink;144 tb->RElink->FRlink=link;145 if (free_table==tb) free_table=link;146 free(tb);147 }148 else if (0==tb->FRlink->flag&&0==tb->RElink->flag)149 {150 link=tb->FRlink;151 link->length=link->length+tb->length+tb->RElink->length;152 link->RElink=tb->RElink->RElink;153 if (NULL!=tb->RElink->RElink) tb->RElink->RElink->FRlink=link;154 if (free_table==tb) free_table=link;155 free(tb);156 free(tb->RElink);157 }158 }159 //显示空间分区链表160 void display(FRtable *tb,int choice)161 {162 // clrscr();163 FRtable *temp;164 if (2==choice) temp=tb;165 else temp=NULL;166 printf("\n\t标号\t分区首地址\t分区大小(KB)\t\n");167 do168 {169 printf("\n\t %c\t %.2f\t %.2f\t\t %d",tb->job,tb->address,tb->length,tb->flag);170 tb=tb->RElink;171 }while(temp!=tb);172 }173 //主函数174 int main()175 {176 int i,a,choice;177 float xk;178 char job;179 FRtable *ta=getspace(FRtable);180 free_table=init(ta);181 do{182 printf("\n 分区分配算法:\n\t0 - 退出(Exit)\n\t1 - 首次适应算法(FF)\n\t2 - 循环首次适应算法\n\t\n");183 printf(">>请选择相应的算法(0-2):");184 scanf("%d",&choice);185 if (0==choice) exit(0);186 }while(0>choice&&2 >请选择你的操作(0-2):");191 scanf("%d",&a);192 switch(a)193 {194 //a=0,程序结束195 case 0:exit(0);196 //a=1,分配主存空间197 case 1:printf(">>请输入作业标号和所需要申请的空间:");198 scanf("%*c%c%f",&job,&xk);199 allocate(job,xk,choice);200 display(free_table,choice);201 break;202 //a=2,回收主存空间203 case 2:printf(">>请输入你想回收的作业的相应标号:");204 scanf("%*c%c",&job);205 reclaim(job,choice);206 display(free_table,choice);207 break;208 default:printf(">>ERROR:No thie choose! \n");209 }210 }211 }
实验结果:
实验总结
编程学不好,作业总是不能按时提交,自己觉得作业难度大,自己无从下手,感觉很憋屈。不过通过咨询同学,最终能顺利完成该实验。