实验四主存空间的分配和回收
1. 目的和要求
1.1. 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
1.2. 实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。
把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
2. 实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
3. 实验环境
可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。
4. 参考数据结构:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 24
struct partition{
char pn[10];
int begin;
int size;
int end; ////////
char status; //////////
};
typedef struct partition PART;
5、源代码
1 #include <stdio.h>
2 #include<conio.h>
3 #include<string.h>
4 #define MAX 100
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 p[MAX];
14 int n;
15
16 void init()
17 {
18 p[0].begin = 0;
19 p[0].end = 150;
20 strcpy(p[0].pn, "SYSTEM");
21 p[0].size = 100;
22 p[0].status = 'u';
23
24 p[1].begin = 150;
25 p[1].end = 1024;
26 strcpy(p[1].pn, "-----");
27 p[1].size = p[1].end - p[1].begin;
28 p[1].status = 'f';
29
30 n = 2;
31 }
32
33 void print()
34 {
35 int x = 1;
36
37 printf("空闲区表Free:\n");
38 printf("\tNo.\tproname\tbegin\tsize\tstatus\n");
39 for(int i = 0; i < n; i++)
40 {
41 if(p[i].status=='f')
42 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
43 }
44 printf("\n\n=========================================================\n");
45
46 printf("已分配分区表Used:\n");
47 printf("\tNo.\tproname\tbegin\tsize\tstatus\n");
48 for(i = 0, x = 1; i < n; i++)
49 {
50 if(p[i].status=='u')
51 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
52 }
53
54 printf("\n\n=========================================================\n");
55
56 printf("内存使用情况:\nprintf sorted by address:\n");
57 printf("\tNo.\tproname\tbegin\tsize\tstatus\n");
58 printf("\t--------------------------------------\n");
59 for(i = 0, x = 1; i < n; i++)
60 {
61 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status);
62 }
63 }
64
65 void input()
66 {
67 int x = 1;
68 while(x)
69 {
70 printf("\n\n请输入进程名称:");
71 scanf("%s", &p[n].pn);
72
73 for(int i = 0; i < n; i++)
74 {
75 x = 0;
76 if(strcmp(p[n].pn, p[i].pn) == 0)
77 {
78 x = 1;
79 printf("进程名称已存在,请重新输入!");
80 break;
81 }
82 }
83 }
84 x = 1;
85 while(x)
86 {
87 printf("\n请输入进程需要的空间大小:");
88 scanf("%d", &p[n].size);
89
90 for(int i = 0; i < n; i++)
91 {
92
93 if(p[i].size >=p[n].size)
94 {
95 x = 0;
96 break;
97 }
98 }
99 if(x)
100 printf("找不到适合的空间,请重新输入!");
101 }
102 }
103
104 void fenqu()
105 {
106 PART temp[MAX];
107 for(int i = 0;i < n; i++)
108 {
109 if(p[i].status=='f')
110 {
111 if(p[i].size >= p[n].size)
112 {
113 temp[0]=p[i];
114 p[i]=p[n];
115 p[n]=temp[0];
116
117 p[i].end=p[n].begin+p[i].size;
118 p[i].status='u';
119 p[i].begin=p[n].begin;
120 p[n].begin=p[i].end;
121 p[n].end=temp[0].end;
122 p[n].status='f';
123 p[n].size=p[n].size-p[i].size;
124 n++;
125 break;
126 }
127
128 }
129 }
130 }
131
132
133 void caculate(int i)
134 {
135 int x=0;
136 p[i].end = p[i].begin+p[i].size;
137 p[i-1].end=p[i-1].begin+p[i-1].size;
138 if(p[i+1].status=='f' && p[i].end==p[i+1].begin)
139 { x=1;
140 p[i+1].begin=p[i].begin;
141 p[i+1].size=p[i].size+p[i+1].size;
142 for(int j=i;j<n;j++)
143 {
144 p[j]=p[j+1];
145 }
146 n=n-1;
147 }
148 if(p[i-1].status=='f' && p[i-1].end==p[i].begin)
149 { x=1;
150 p[i].begin=p[i-1].begin;
151 p[i].size=p[i-1].size+p[i].size;
152 strcpy(p[i].pn, "-----");
153 p[i].status = 'f';
154 for(int k=i;k<n;k++)
155 {
156 p[k-1]=p[k];
157 }
158 n=n-1;
159 }
160 if(x==0)
161 {
162 strcpy(p[i].pn, "-----");
163 p[i].status = 'f';
164 }
165 }
166
167 void recycle()
168 {
169 char name[50];
170 int x = 1;
171 while(x)
172 {
173 printf("\n请输入进程名称:");
174 scanf("%s", &name);
175 for(int i = 0; i < n; i++)
176 {
177 if(strcmp(name, p[i].pn) == 0)
178 {
179 x = 0;
180 caculate(i);
181 break;
182 }
183 }
184 if(x==1)
185 {
186 printf("没找到请重新输入\n");
187 }
188
189 }
190 }
191 int main(void)
192 {
193 int choose1,choose2;
194 printf("初始化:设置内存总容量为 1024k\n系统从低地址部分开始占用 150k\n\n");
195
196 init();
197 print();
198
199 while(1)
200 {
201 printf("请选择:1.分配内存 2.回收内存 3.结束\n");
202 scanf("%d",&choose1);
203 if(choose1==1)
204 {
205 input();
206 fenqu();
207 print();
208 }
209 if(choose1==2)
210 {
211 recycle();
212 print();
213 }
214 if(choose1==3)
215 break;
216 }
217
218 return 0;
219 }
运行结果:

6、实验总结:
今次实验让我学会了首次适应算法、循环首次适应算法、和最坏适应算法3种算法,让我明白了学习编程必须要思路清晰。