操作系统--主存空间的分配和回收

Posted 03丘惠敏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统--主存空间的分配和回收相关的知识,希望对你有一定的参考价值。

1.    目的和要求

1.1.           实验目的

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

1.2.           实验要求

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

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

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

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

 

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

2.    实验内容

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

3.    实验环境

可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。

  1 #include<stdio.h>
  2 #include<conio.h>
  3 #include<malloc.h>
  4 #include<string.h>
  5 #define MAX 24
  6 struct partition{
  7     char pn[10];  //作业名
  8     int begin;     //开始时间
  9     int size;     //内存大小
 10     int end;      //结束时间
 11     char status;   //状态
 12     struct partition *next;
 13     };
 14 typedef struct partition PART;
 15 PART *head;
 16 //初始化used表
 17 PART *InitListu()
 18 {
 19     PART *k;
 20  k= (PART *)malloc(sizeof(PART));
 21  strcpy(k->pn,"SYSTEM");
 22  k->begin=0;
 23  k->size=100;
 24  k->end=100;
 25  k->status=\'u\';
 26  k->next=NULL;
 27  return k;
 28 }
 29 //初始化free表
 30 PART *InitListf()
 31 {
 32  PART *k;
 33  k= (PART *)malloc(sizeof(PART));
 34  strcpy(k->pn,"------");
 35  k->begin=100;
 36  k->size=412;
 37  k->status=\'f\';
 38  k->end=512;
 39  k->next=NULL;
 40  return k;
 41 }
 42 //输出空闲区表Free
 43 void Printfree()
 44 {
 45     printf("空闲区表Free:\\n");
 46         printf("No.    proname  begin   size    status\\n");
 47     PART *free=head->next;
 48     int i=1;
 49     while(free!=NULL)
 50     {
 51         if(free->status==\'f\')
 52         {
 53              printf("No.%d\\t%s\\t%d\\t%d\\t%c",i,free->pn,free->begin,free->size,free->status);
 54             i++;
 55             printf("\\n");
 56         }
 57         free=free->next;
 58     }
 59 }
 60 //输出已分配分区表Used
 61 void Printused()
 62 {
 63     printf("已分配分区表Used:\\n");
 64         printf("No.    proname  begin   size    status\\n");
 65     PART *used=head->next;
 66     int i=1;
 67     while(used!=NULL)
 68     {
 69         if(used->status==\'u\')
 70         {
 71              printf("No.%d\\t%s\\t%d\\t%d\\t%c",i,used->pn,used->begin,used->size,used->status);
 72             i++;
 73             printf("\\n");
 74         }
 75         used=used->next;
 76     }
 77 }
 78 //输出所以作业
 79 void Print()
 80 {
 81     printf("内存使用情况,按起始地址增长的排:\\n");
 82     printf("printf sorted by address:\\n");
 83         printf("No.    proname  begin   size    status\\n");
 84     PART *total=head->next;
 85     int i=1;
 86     while(total!=NULL)
 87     {
 88              printf("No.%d\\t%s\\t%d\\t%d\\t%c",i,total->pn,total->begin,total->size,total->status);
 89             i++;
 90             printf("\\n");
 91         total=total->next;
 92     }
 93 }
 94 //算法菜单
 95 void menu()
 96 {
 97 
 98     printf("1)    首次适应算法\\n");
 99     printf("2)    循环首次适应算法\\n");
100     printf("3)    最佳适应算法\\n");
101     printf("4)    最坏适应算法:\\n");
102 
103 }
104 //查找是否已存在作业名
105 PART *searchname(char name[10])
106 {
107     PART *rear;
108     rear=head->next;
109     while((rear!=NULL)&&(strcmp(rear->pn,name)!=0))
110         rear=rear->next;
111     return rear;
112 }
113 //查找是否有足够大的空闲内存
114 PART *searchsize(int size,PART *temp)
115 {
116     PART *rear;
117     rear=head->next;
118     while(rear!=NULL)
119     {
120         if(rear->status==\'f\')
121         {
122             if(rear->size>=size)
123             {
124                 return rear;
125             }
126             else
127                 rear=rear->next;
128         }
129         else
130             rear=rear->next;
131     }
132      return rear;
133 }
134 //    首次适应算法
135 void FF(PART *p)
136 {
137     PART *q,*rear;
138     rear=q=head->next;
139     while(rear!=NULL)
140     {
141         if(rear->status==\'f\')//判断空闲区
142         {
143             if(rear->size>=p->size)//判断空闲区的大小
144             {
145                 //添加结点(新作业)
146                 p->status=\'u\';
147                 p->begin=rear->begin;
148                 p->end=p->begin+p->size;
149                 p->next=NULL;
150                 q->next=p;
151                 rear->begin=p->end;
152                 if(rear->size==p->size)
153                     p->next=rear->next;
154                 else
155                 {
156                 rear->size=rear->size-p->size;
157                 p->next=rear;
158                 }
159                 //打印输出
160                 Printfree();
161                 Printused();
162                 Print();
163                 return;    
164             }
165             else
166             {  //遍历结点
167                 q=rear;
168                 rear=q->next;
169             }
170                 
171         }
172         else
173         {    //遍历结点
174             q=rear;
175             rear=q->next;    
176         }
177 
178     }
179 
180 }
181 //查找满足新作业的最大或最小空闲区
182 void sear(PART *p,PART *temp,int n)
183 {
184     PART *rear=head->next;
185     while(rear!=NULL)
186     {
187         if(rear->status==\'f\')
188         {
189             if(rear->size>=p->size)
190             {
191                 if(n==3)
192                 {
193                 if(rear->size<temp->size) //最小(最优)
194                     temp=rear;
195                 else
196                     rear=rear->next;
197                 }
198                 if(n==4)
199                 {
200                 if(rear->size>temp->size) //最大(最坏)
201                     temp=rear;
202                 else
203                     rear=rear->next;
204                 }
205             }
206             else
207                 rear=rear->next;            
208         }
209         else
210             rear=rear->next;
211     }
212 }
213 //    最佳适应算法 和    最坏适应算法
214 void BF_WF(PART *p,PART *temp,int n)
215 {    
216     PART *q,*rear;
217     sear(p,temp,n);
218     rear=head->next;
219     while((rear!=NULL)&&(rear!=temp)) //查找前一结点和当前结点
220     {
221         q=rear;
222         rear=q->next;
223     }
224     //添加新作业
225     p->status=\'u\';
226     p->begin=rear->begin;
227     p->end=p->begin+p->size;
228     p->next=NULL;
229     q->next=p;
230     rear->begin=p->end;
231     if(rear->size==p->size)
232         p->next=rear->next;
233     else
234     {
235         rear->size=rear->size-p->size;
236         p->next=rear;
237     }
238     Printfree();
239        Printused();
240        Print();
241 }
242 //分配输入
243 void input()
244 {
245     PART *p,*temp;
246     char name[10];
247     int size;
248     int n;
249     temp = (PART *)malloc(sizeof(PART));
250 lab1:    printf("输入作业名称:");
251     scanf("%s",name);
252     if(searchname(name)==NULL)  //判断作业是否已经存在
253     {
254         p = (PART *)malloc(sizeof(PART));
255         strcpy(p->pn,name);
256     }
257     else
258     {
259         printf("作业已经存在,请重新输入:\\n");
260         goto lab1;
261     }
262 lab2:    printf("请输入作业所占空间大小:");  //判断是否有足够大的空闲区
263     scanf("%d",&size);
264     temp=searchsize(size,temp);
265     if(temp!=NULL)
266     {
267         p->size=size;
268     }
269     else
270     {
271         printf("没有剩余的空闲区域中,请重新输入:\\n");
272         goto lab2;
273     }
274     //选择算法
275     menu();
276     printf("请选择算法:");
277     scanf("%d",&n);
278     switch (n)
279     {
280     case 1:
281         FF(p);
282         break;
283 /*    case 2:
284         CF(p);
285         break;*/
286     case 3:
287         BF_WF(p,temp,n);
288         break;
289     case 4:
290         BF_WF(p,temp,n);
291         break;
292     }
293 }
294 //回收
295 void recycle()
296 {
297     PART *q,*rear,*temp;
298     char pname[10];
299     temp = (PART *)malloc(sizeof(PART));
300 lab3:    printf("请输入要终止的作业名:");
301     scanf("%s",pname);
302     if(searchname(pname)==NULL)  //判断是否存在该作业
303     {
304         printf("作业不存在,请重新输入:\\n");
305         goto lab3;
306     }
307     else
308     {
309         rear=head->next;
310         temp=searchname(pname);
311         while((rear!=NULL)&&(rear!=temp))//查找前一节点和当前节点
312         {
313              q=rear;
314             rear=q->next;
315         }
316         if(q->status==\'u\'&&rear->next->status==\'u\')//前后被分配
317         {
318             strcpy(rear->pn,"------");
319             rear->status=\'f\';
320         }
321         else if(q->status==\'u\'&&rear->next->status==\'f\')//前者分配后者空闲
322         {
323             strcpy(rear->pn,"------");
324             rear->status=\'f\';
325             rear->size=rear->size+rear->next->size;
326             rear->end=rear->next->end;
327             rear->next=rear->next->next;
328         }
329         else if(q->status==\'f\'&&rear->next->status==\'u\')//前者空闲后者分配
330         {
331             q->end=rear->end;
332             q->size=rear->size+q->size;
333             q->next=rear->next;
334         }
335         else if(q->status==\'f\'&&rear->next->status==\'f\')//前后空闲
336         {
337             q->end=rear->next->end;
338             q->size=rear->size+q->size+rear->next->size;
339             q->next=rear->next->next;
340         }
341         Printfree();
342         Printused();
343         Print();
344     }
345 }
346 //主函数
347 void main()
348 {
349     int cho;
350     printf("初始化,设内存总容量512k\\n");
351     printf("系统从低地址部分开始使用,占用100k\\n");
352     head = (PART *)malloc(sizeof(PART));
353     head->next=InitListu();
354     head->next->next=InitListf();
355     Printfree();
356     Printused();
357     Print();
358     while(1)
359     {
360 lab4:        printf("1 分配   2 回收   3 退出\\n");
361         printf("请选择:");
362         scanf("%d",&cho);
363         if(cho==1)
364             input();
365         else if(cho==2)
366             recycle();
367         else if(cho==3)
368             return;
369         else 
370         {
371             printf("输入错误,请重新输入:\\n");
372             goto lab4;
373         }
374     }
375         printf("\\n");
376 }

运行结果:

分配:

回收:

以上是关于操作系统--主存空间的分配和回收的主要内容,如果未能解决你的问题,请参考以下文章

操作系统实验四 主存空间的分配和回收

操作系统实验四 主存空间的分配和回收

操作系统——实验四:主存空间的分配和回收

操作系统实验四 主存空间的分配和回收

操作系统--主存空间的分配和回收

操作系统实验四 主存空间的分配和回收