码迷,mamicode.com
首页 > 其他好文 > 详细

实验5

时间:2015-06-26 12:36:13      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

一,实验目的

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

 

二,实验内容和要求

采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。

(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

(2)或在程序运行过程,由用户指定申请与释放。

(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

 

三、主要程序及其解释

  1 #include"stdio.h"
  2 #include"stdlib.h"
  3 
  4 //已分配区
  5 struct{
  6     float address; //起始地址
  7     float length; //长度
  8     int flag; //表登记栏标志,用"0"表示空栏目
  9 }used_table[10];
 10 
 11 //空闲表
 12 struct{
 13     float address; //起始地址
 14     float length; //长度
 15     int flag; //用"0"表示空栏目,用"1"表示未分配
 16 }free_table[10];
 17 
 18 void input(); 
 19 int allocate1(char str,float leg,int pre);//分配主存空间函数循环适应
 20 void allocate2(char str,float leg);//分配主存空间函数首次适应
 21 void reclaim(char str);//回收主存函数
 22 
 23 int main()
 24 {  
 25     int i;
 26     float length;
 27     char name;/*空闲分区表初始化:*/
 28     int suanfa;
 29     int caozuo;
 30     int pre=0;//循环首次适应算法的前一次扫描空闲表处,初始为0
 31 
 32     free_table[0].address=10240;
 33     free_table[0].length=102400;
 34     free_table[0].flag=1;
 35 
 36     for(i=1;i<10;i++)
 37         free_table[i].flag=0;/*已分配表初始化:*/
 38     for(i=0;i<10;i++)
 39         used_table[i].flag=0;
 40     
 41     input();
 42     printf("please choose\n1.首次适应算法\n2.循环首次适应算法\n");
 43     scanf("%d",&suanfa);
 44     
 45     if(suanfa==1)
 46     {
 47         while(1)
 48         {
 49             printf("please choose\n1.分配\n2.回收\n");
 50             scanf("%d",&caozuo);
 51             if(caozuo==1)
 52             {
 53                 /*a=1分配主存空间*/
 54                 printf("input the name and length: ");
 55                 scanf("%*c%c%f",&name,&length);
 56                 allocate(name,length);/*分配主存空间*/
 57             }else{
 58                 /*a=2回收主存空间*/
 59                 printf("input the reclaim job:");
 60                 scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/
 61             }
 62             input();
 63         }
 64     }
 65     else{
 66         while(1)
 67         {
 68             printf("please choose\n1.分配\n2.回收\n");
 69             scanf("%d",&caozuo);
 70             if(caozuo==1)
 71             {
 72                 /*a=1分配主存空间*/
 73                 printf("input the name and length: ");
 74                 scanf("%*c%c%f",&name,&length);
 75                 pre=allocate1(name,length,pre);/*分配主存空间*/
 76             }else{
 77                 /*a=2回收主存空间*/
 78                 printf("input the reclaim job");
 79                 scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/              
 80             }
 81             input();
 82         }
 83     }
 84     return 0;
 85 }
 86 
 87 void input()
 88 {
 89     int i;   
 90     printf("free table:\n   add    length    sign\n");
 91    
 92     for(i=0;i<10;i++)
 93     {
 94         printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag);
 95     }
 96     printf(" enter any key and output used table\n");
 97     getchar();
 98     printf(" used table:\n   add    length    sign\n");
 99     
100     for(i=0;i<10;i++)
101     {
102         
103         if(used_table[i].flag!=0)
104             printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag);
105         else
106             printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag);
107         
108         
109     }
110 }
111 
112 int uflag;//分配表
113 int fflag;//空闲表
114 
115 int allocate1(char str,float leg,int pre)
116 {
117     
118     fflag=0;
119     int k,i;
120     
121     for(i=pre;i<10;i++)
122     {
123         if(free_table[i].flag==1 && free_table[i].length>=leg)
124         {
125             fflag=1;break;
126         }
127         
128     }
129     if(fflag==0)
130         printf("has no suitable table\n");
131     else
132     {
133         for(k=0;k<10;k++)
134         {
135             if(used_table[k].flag==0)
136             {                           
137                 used_table[k].length=leg;
138                 used_table[k].address=free_table[i].address;
139                 used_table[k].flag=str;
140                 free_table[i].address=free_table[i].address+leg;
141                 free_table[i].length=free_table[i].length-leg;
142                 free_table[i].flag=1;
143                 break;
144             }
145         }
146     }
147     return i;
148     
149 }
150 
151 void allocate2(char str,float leg)
152 {    
153     fflag=0;
154     int k,i;
155     
156     for(i=0;i<10;i++)
157     {
158         if(free_table[i].flag==1 && free_table[i].length>=leg)
159         {
160             fflag=1;break;
161         }
162         
163     }
164     if(fflag==0)
165         printf("has no suitable free table\n");
166     else
167     {
168         
169         for(k=0;k<10;k++)
170         {
171             if(used_table[k].flag==0)
172             {                           
173                 used_table[k].length=leg;
174                 used_table[k].address=free_table[i].address;
175                 used_table[k].flag=str;
176                 free_table[i].address=free_table[i].address+leg;
177                 free_table[i].length=free_table[i].length-leg;
178                 free_table[i].flag=1;
179                 break;
180             }
181         }
182     }  
183 }
184 
185 void reclaim(char str)
186 {
187     float uend_address;
188     float fend_address;
189     uflag=0;fflag=0;
190     int k,i;
191 
192     for(k=0;k<10;k++)
193     {
194         if(used_table[k].flag==str)
195         {
196             uflag=1;break;
197         }
198     }
199     if(uflag==0)
200         printf("\ncan not find!\n");
201     else
202     {
203         for(i=0;i<10;i++)
204         {
205             uend_address=used_table[k].address+used_table[k].length;
206             fend_address=free_table[i].address+free_table[i].length;
207             if(used_table[k].address==fend_address)//上邻
208             {
209                 fflag=1;
210                 free_table[i].length=free_table[i].length+used_table[k].length;
211                 free_table[i].flag=1;
212                 used_table[k].flag=0;
213                 used_table[k].length=0;
214                 used_table[k].address=0;
215                 printf("\nreclaimed!\n");
216                 break;
217             }
218             else
219             {
220                 if(free_table[i].address==uend_address)//下邻
221                 {
222                     fflag=1;
223                     free_table[i].address=used_table[k].address;
224                     free_table[i].length=free_table[i].length+used_table[k].length;
225                     free_table[i].flag=1;
226                     used_table[k].flag=0;
227                     used_table[k].length=0;
228                     used_table[k].address=0;
229                     printf("\nreclaimed!\n");
230                     break;
231                 }
232             }
233         }
234 
235         if(fflag==0)//上下邻都没有空闲
236         {
237             i=0;
238             for(i=0;i<10;i++)
239             {
240                 if(free_table[i].flag==0)
241                 {
242                     free_table[i].address=used_table[k].address;
243                     free_table[i].length=used_table[k].length;
244                     free_table[i].flag=1;
245                     used_table[k].length=0;
246                     used_table[k].flag=0;
247                     used_table[k].address=0;
248                     break;
249                 }
250             }
251             printf("\nreclaimed!\n");
252         }
253     }
254 }

技术分享技术分享技术分享

四,实验总结

这个实验的原理是书本上的知识,老师也在课堂上讲过,觉得理解并不难,但是不知道怎么觉得实验并不简单。参考了学霸的代码,也理解其中代码。也有看其他同学的代码,发觉各有各的特点,希望自己也有个人特点的代码。

实验5

标签:

原文地址:http://www.cnblogs.com/lsh43/p/4601729.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!