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

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

专业:商软2班   姓名:柯晓君  学号:201406114210

一、        实验目的

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

二、        实验内容和要求

1.  实验要求

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

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

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

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

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

2.  实验内容

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

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

1. 原理分析及流程图

2.主要程序段及其解释

  1 #include<stdio.h>
  2 #include<conio.h>
  3 #include<string.h>
  4 #define MAX 24
  5 struct partition{
  6     char pn[10];
  7     int begin;
  8     int size;
  9     int end;  
 10     char status;
 11     };
 12 typedef struct partition PART;
 13 PART pcb[MAX];
 14 int C=512;
 15 int k=0;
 16 void Init()
 17 {
 18     pcb[0].begin = 0;
 19     pcb[0].size = C;
 20     pcb[0].end = C;
 21     pcb[0].status = 'f';
 22 }
 23 
 24 void next(int i)
 25 {
 26     pcb[i+1].begin = pcb[i].end;
 27     pcb[i+1].size = C-pcb[i].size;
 28     C=C-pcb[i].size;
 29     pcb[i+1].end=512;
 30     pcb[i+1].status='f';
 31 }
 32 void Output()
 33 {
 34     int i;
 35      printf("空闲区表Free:
");
 36     printf("No.	proname	begin	end	size	status
");
 37     for(i=0;i<=k;i++)
 38     {
 39         if(pcb[i].status=='f')
 40             printf("No.%d 	 %s 	 %d 	 %d 	 %d 	 %c 
",i+1,pcb[i].pn,pcb[i].begin,pcb[i].end,pcb[i].size,pcb[i].status);
 41     }
 42 
 43     printf("

==================================================
");
 44     printf("已分配分区表Used:
");
 45     printf("No.	proname	begin	end	size	status
");
 46     for(i = 0;i<=k;i++)
 47     {
 48         if(pcb[i].status=='u')
 49             printf("No.%d 	 %s 	 %d 	 %d 	 %d 	 %c 
",i+1,pcb[i].pn,pcb[i].begin,pcb[i].end,pcb[i].size,pcb[i].status);
 50     }
 51     printf("
内存使用情况,按起始址增长的排::
");
 52     printf("printf sorted by address::
");
 53     printf("No.	proname	begin	size	status
");
 54     printf("
================================================
");
 55     for(i=0;i<=k;i++)
 56     {
 57     printf("No.%d	%s	%d	%d	%c
",i,pcb[i].pn,pcb[i].begin,pcb[i].size,pcb[i].status);
 58     }
 59 }
 60 void First(int i)
 61 {
 62     strcpy(pcb[i].pn,"");
 63     if(pcb[i-1].status=='f' && pcb[i+1].status=='f')
 64     {
 65         pcb[i-1].size = pcb[i-1].size+pcb[i].size+pcb[i+1].size;
 66         pcb[i-1].end = pcb[i+1].end;
 67         for(i=i;i<k;i++)
 68         {
 69             strcpy(pcb[i].pn,pcb[i+1].pn);
 70             pcb[i].begin = pcb[i+1].begin;
 71             pcb[i].end = pcb[i+1].end;
 72             pcb[i].size = pcb[i+1].size;
 73             pcb[i].status = pcb[i+1].status;
 74         }
 75     }
 76     else if(pcb[i+1].status == 'f')
 77     {
 78         pcb[i].size = pcb[i].size+pcb[i+1].size;
 79         pcb[i].end = pcb[i+1].end;
 80         for(i=i+1;i<k;i++)
 81         {
 82             strcpy(pcb[i].pn,pcb[i+1].pn);
 83             pcb[i].begin = pcb[i+1].begin;
 84             pcb[i].end = pcb[i+1].end;
 85             pcb[i].size = pcb[i+1].size;
 86             pcb[i].status = pcb[i+1].status;
 87         }
 88     }
 89     else if(pcb[i-1].status=='f')
 90     {
 91         pcb[i-1].size = pcb[i-1].size+pcb[i].size;
 92         pcb[i-1].end = pcb[i].end;
 93         for(i=i;i<k;i++)
 94         {
 95             strcpy(pcb[i].pn,pcb[i+1].pn);
 96             pcb[i].begin = pcb[i+1].begin;
 97             pcb[i].end = pcb[i+1].end;
 98             pcb[i].size = pcb[i+1].size;
 99             pcb[i].status = pcb[i+1].status;
100         }
101     }
102     
103     if(pcb[i+1].status == 'f' && pcb[i-1].status=='f')
104     {
105         k=k-2;
106     }
107     else if(pcb[i+1].status != 'f' && pcb[i-1].status!='f')
108     {
109     }
110     else
111     {
112         k--;
113     }
114 }
115 void Retreat()
116 {
117     int i=0;
118     char pname[10];
119     printf("

");
120     printf("请输入要回收的作业名称:");
121     scanf("%s",&pname);   
122     for(i=0;i<k;i++)
123     {
124         if(strcmp(pcb[i].pn, pname) == 0)
125         {
126             pcb[i].status = 'f';
127             First(i);
128             Output();
129             break;
130         }
131     }
132     
133 }
134 
135 void Inputname()
136 {                                                                                     
137     int i;
138     printf("请输入要分配的作业名称: ");
139     scanf("%s",&pcb[k].pn);
140     for(i=0;i<k;i++)
141     {
142         if(strcmp(pcb[i].pn, pcb[k].pn) == 0)
143         {
144             printf("该作业名已存在!请重新输入: ");
145             Inputname();
146         }
147     }
148 }
149 void Inputsize()
150 {
151     printf("
输入作业所占空间大小: ");
152     scanf("%d",&pcb[k].size);
153     pcb[k].status = 'u';
154     pcb[k].end = pcb[k].begin + pcb[k].size;
155     if(pcb[k].end>=C)
156     {
157         printf("内存空间不足!
");
158         Inputsize();
159     }
160     else{
161         next(k);
162         k++;
163     }
164 }
165 
166 void choice()
167 {
168     int c;
169     printf("

");
170     printf("	=======================
");
171     printf("	|   1.分配内存空间    |
");
172     printf("	|   2.回收内存空间    |
");
173     printf("	=======================
");
174     printf("请输入您的选择(1或2):");
175     scanf("%d",&c);
176     switch(c)
177     {
178     case 1:
179         Inputname();
180         Inputsize();
181         Output();
182         break;
183     case 2:
184         Retreat();
185         break;
186     default:
187         printf("

输入有误,请重新输入
");
188         choice();
189         break;
190     }
191 }
192     
193 void main()
194 {
195     Init();
196     printf("
请输入操作系统占用的分区大小: ");
197     scanf("%d",&pcb[k].size);
198     printf("
请输入操作系统的名称: ");
199     scanf("%s",&pcb[k].pn);
200     pcb[k].begin=0;
201     pcb[k].end=pcb[k].begin+pcb[k].size;
202     pcb[k].status='u';
203     next(k);
204     k++;
205     printf("初始化,设内存总容量%d k
",C);
206     printf("系统从低地址部分开始使用,占用%d k
",pcb[0].size);
207     Output();
208     while(pcb[k].end>=C)
209     {
210         choice();
211     }
212 }

3.运行结果及分析 

四、实验总结

       加深了对操作系统主存空间的分配和回收程序以及动态分区分配方式的理解。

原文地址:https://www.cnblogs.com/950525kxj/p/5615296.html