标签:
一,实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
二,实验内容和要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、主要程序及其解释
1 #include<stdio.h> 2 #include <stdlib.h> 3 #include <conio.h> 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<maxisize) 39 { 40 tb=getspace(FRtable); 41 free_table->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<maxisize) tb->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 do 113 { 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 do 168 { 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<choice); 187 while(1) 188 { 189 printf("\n 菜单:\n\t0 - 退出(Exit)\n\t1 - 申请空间(Allocation)\n\t2 - 回收空间(Reclaim) \n"); 190 printf(">>请选择你的操作(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 }
四,实验总结
这个实验的原理是书本上的知识,老师也在课堂上讲过,觉得理解并不难,但是不知道怎么觉得实验并不简单。参考了学霸的代码,也理解其中代码。也有看其他同学的代码,发觉各有各的特点,希望自己也有个人特点的代码。
标签:
原文地址:http://www.cnblogs.com/lsh43/p/4601715.html