实验四

一,实验目的

 用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。

二,实验内容和要求

采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法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(">>空间申请失败! 
");
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("
>>抱歉,不存在作业%c! 
",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("
	标号	分区首地址	分区大小(KB)	
");
167     do
168     {
169         printf("
	 %c	 %.2f	 %.2f		 %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("
 分区分配算法:
	0 - 退出(Exit)
	1 - 首次适应算法(FF)
	2 - 循环首次适应算法
	
");
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("
 菜单:
	0 - 退出(Exit)
	1 - 申请空间(Allocation)
	2 - 回收空间(Reclaim) 
");
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! 
");
209         }
210     }
211 }

实验结果:

实验总结

 编程学不好,作业总是不能按时提交,自己觉得作业难度大,自己无从下手,感觉很憋屈。不过通过咨询同学,最终能顺利完成该实验。

原文地址:https://www.cnblogs.com/zhushengjie/p/4599122.html