实验四 主存空间的分配和回收

一、        实验目的

 

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

二、        实验内容和要求

1.  实验要求

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

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

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

(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。

把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

2.  实验内容

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

三、        实验方法、步骤及结果测试

1. 原理分析及流程图

2.主要程序段及其解释

  1 #include <stdio.h>
  2 #include <conio.h>
  3 #include <string.h>
  4 #define MAX 512  //设置总内存大小为512k
  5 
  6 struct partition {
  7     char pn[10];//分区名字
  8     int begin;//起始地址
  9     int size;//分区大小 
 10     int end;//结束地址
 11     char status;//分区状态
 12 };
 13 struct partition part[MAX];
 14 int p=0; //标记上次扫描结束处 
 15 
 16 void Init()//初始化分区地址、大小以及状态
 17 {
 18     int i;
 19     for (i=0;i<MAX;i++)
 20         part[i].status='-';
 21     strcpy(part[0].pn, "SYSTEM");
 22     part[0].begin=0;
 23     part[0].size=100;
 24     part[0].status='u';
 25     strcpy(part[1].pn, "-----");
 26     part[1].begin=100;
 27     part[1].size=412;
 28     part[1].status='f';
 29     for (i=0;i<MAX;i++)
 30         part[i].end = part[i].begin + part[i].size;
 31 }
 32 
 33 
 34 void Output(int i) 
 35 {
 36     printf("\t%s\t%d\t%d\t%d\t%c", part[i].pn, part[i].begin, part[i].size, part[i].end, part[i].status);
 37 
 38 }
 39 
 40 
 41 void Show() //显示分区 0
 42 {
 43     int i;
 44     int n; //用n来记录分区的个数
 45     printf("\n已分配分区表:");
 46     printf("\n\t------------------------------------------------");
 47     printf("\n\tNo.\tproname\tbegin\tsize\tend\tstatus");
 48     printf("\n\t------------------------------------------------");
 49     n=1;
 50     for (i=0;i<MAX;i++)
 51     {
 52         if (part[i].status=='-')
 53             break;
 54         if (part[i].status=='u')
 55         {
 56             printf("\n\tNo.%d", n);
 57             Output(i);
 58             n++;// 记录已分配使用的分区个数
 59         }
 60     }
 61     printf("\n\t------------------------------------------------");
 62     printf("\n");
 63     printf("\n空闲分区表:" );
 64     printf("\n\t------------------------------------------------");
 65     printf("\n\tNo.\tproname\tbegin\tsize\tend\tstatus");
 66     printf("\n\t------------------------------------------------");
 67     n=1;
 68     for (i=0;i<MAX;i++)
 69     {
 70         if (part[i].status=='-')
 71             break;
 72         if (part[i].status=='f')
 73         {
 74             printf("\n\tNo.%d", n);
 75             Output(i);
 76             n++;  //记录空闲分区的个数
 77         }
 78     }
 79     printf("\n\t------------------------------------------------");
 80     printf("\n");
 81     printf("\n");
 82 }
 83 
 84 void Fit(int a,char workName[],int workSize) //新作业把一个分区分配成两个分区:已使用分区和空闲分区 
 85 {
 86     int i;
 87     for (i=MAX;i>a+1;i--)
 88     {
 89         //把在a地址后的所有分区往后退一个分区,相当于增加一个分区
 90         if (part[i-1].status=='-')
 91             continue;
 92         part[i]=part[i-1];
 93     }
 94     strcpy(part[a+1].pn,"-----");
 95     part[a+1].begin=part[a].begin+workSize;
 96     part[a+1].size=part[a].size-workSize;
 97     part[a+1].end=part[a].end;
 98     part[a+1].status='f';
 99     strcpy(part[a].pn, workName);
100     part[a].size=workSize;
101     part[a].end=part[a].begin+part[a].size;
102     part[a].status='u';
103 }
104 
105 
106 void Allocation() // 分配 
107 {
108     int i;
109     int a;
110     int workSize;
111     char workName[10];
112     int pFree;
113     printf("\n请输入作业名称:");
114     scanf("%s", &workName);
115     for(i=0;i<MAX;i++)
116     {
117         if(!strcmp(part[i].pn,workName))
118         {
119             printf("\n作业已经存在,不必再次分配!\n");
120             return;
121         }
122     }
123     printf("请输入作业大小(k):");
124     scanf("%d", &workSize);
125     for (i=0;i<MAX;i++)
126     {
127         if (part[i].status=='f'&&part[i].size>=workSize)
128         {
129             pFree = i;//pFree指向第一个可以分配的区域
130             break;
131         }
132     }
133     if (i==MAX)
134     {
135         printf("\n该作业大小超出最大可分配空间");
136         getch();
137         return;
138     }
139     printf("\n请选择分配算法:");
140     printf("\n1、最佳适应算法");
141     printf("\n2、最坏适应算法");
142     printf("\n请选择<1~2>:");
143     while (1)
144     {
145         scanf("%d", &a);
146         if (a==1||a==2)
147         {
148             if(a==1)
149             {
150                 for (i=0;i<MAX;i++)//最佳适应算法(找最小)
151                     if (part[i].status == 'f' && part[i].size >= workSize)
152                         if (part[pFree].size > part[i].size)
153                     pFree = i;
154                 Fit(pFree, workName, workSize);
155             }
156             else
157             {
158                 for (i=0; i<MAX;i++)//最坏适应算法
159                     if (part[i].status == 'f' && part[i].size >= workSize)
160                         if (part[pFree].size < part[i].size)
161                             pFree = i;
162             Fit(pFree, workName, workSize);
163             }
164             break;
165         }
166         printf("输入错误,请重新输入:");
167     }
168     printf("\n分配成功!");
169 }
170 
171 
172 void Merge()//合并
173 {
174     int i = 0;
175     while (i!=MAX-1)
176     {
177         for (i=0;i<MAX-1;i++)
178         {
179             if (part[i].status == 'f')
180                 if (part[i+1].status == 'f')//判断是否有两个相连的空闲区
181                 {
182                     part[i].size=part[i].size+part[i+1].size;
183                     part[i].end=part[i].begin+part[i].size;
184                     i++;
185                     for(i;i<MAX-1;i++)//i后的区域往前移一位
186                     {
187                         if (part[i+1].status == '-')
188                         {
189                             part[i].status='-';
190                             break;
191                         }                       
192                         part[i]=part[i+1];
193                     }
194                     part[MAX-1].status='-';
195                     break;
196                 }
197         }
198     }
199 }
200 
201 
202 void Recovery() // 回收分区 
203 {
204     int i;
205     int number;
206     int n=0;
207     printf("\n请输入回收的分区号:");
208     scanf("%d", &number);
209     if (number==1)
210     {
211         printf("\n系统分区无法回收");
212         return;
213     }    
214     for (i=0;i<MAX;i++)//通过循环查找要回收的已使用分区区号
215     {
216         if (part[i].status == 'u')
217         {
218             n++;//分区号
219             if (n==number)
220             {
221                 strcpy(part[i].pn, "-----");
222                 part[i].status='f';
223             }
224         }
225     }
226     if (i==MAX-1)
227     {
228         printf( "\n找不到分区" );
229         return;
230     }
231     Merge();
232     printf( "\n回收成功!" );
233 }
234 
235 
236 void main()
237 {
238     int s;
239     Init();
240     printf("初始化,设内存容量%dk", MAX);
241     printf("\n系统从低地址部分开始使用,占用%dk", part[0].size);
242     while (1)
243     {
244         printf("\n\n");
245         printf("\t\t|---------------------------------|\n");
246         printf("\t\t|       内存的分配及回收          |\n");
247         printf("\t\t|---------------------------------|\n");
248         printf("\t\t|       0:退出                    |\n");
249         printf("\t\t|       1:显示分区                |\n");
250         printf("\t\t|       2:分配作业                |\n");
251         printf("\t\t|       3:回收分区                |\n");
252         printf("\t\t|---------------------------------|\n");
253         printf("请选择<0~3>:");
254         while (1)
255         {
256             scanf("%d", &s);
257             if (s>=0||s<=3)
258                 break;
259             printf("输入错误,请重新输入:");
260         }
261         switch (s)
262         {
263         case 0:
264             exit(0);
265             break;
266         case 1:
267             Show();
268             break;
269         case 2:
270             Allocation();
271             break;
272         case 3:
273             Recovery();
274             break;
275         default:
276             break;
277         }
278     }
279 }

3.运行结果及分析 

四、实验总结

通过这次实验,更进一步了解主空间回收和分配,不过这次并没有完全能掌握,仍有不懂的地方,编写过程中遇到很多问题,会继续努力。

posted @ 2016-06-24 17:27  12许佳仪  阅读(178)  评论(0编辑  收藏  举报