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

Posted

tags:

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

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;

 

  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 int msize = 7;
 17 
 18 void init()
 19 {
 20     p[0].begin = 0;
 21     p[0].end = 200;
 22     strcpy(p[0].pn, "SYSTEM");
 23     p[0].size = 200;
 24     p[0].status = u;
 25 
 26     p[1].begin = 200;
 27     p[1].end = 1024;
 28     strcpy(p[1].pn, "-----");
 29     p[1].size = p[1].end - p[1].begin;
 30     p[1].status = f;
 31 
 32     n = 2;
 33 }
 34 
 35 void show()
 36 {
 37     int x = 1;
 38 
 39     printf("空闲区表Free:\n");
 40     printf("\tNo.\tproname\tbegin\tsize\tstatus\n");
 41     for(int i = 0; i < n; i++)
 42     {
 43         if(p[i].status == f)
 44             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);
 45     }
 46     printf("\n\n=========================================================\n");
 47 
 48     printf("已分配分区表Used:\n");
 49     printf("\tNo.\tproname\tbegin\tsize\tstatus\n");
 50     for(i = 0, x = 1; i < n; i++)
 51     {
 52         if(p[i].status == u)
 53             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);
 54     }
 55 
 56     printf("\n\n=========================================================\n");
 57 
 58     printf("内存使用情况:\nprintf sorted by address:\n");
 59     printf("\tNo.\tproname\tbegin\tsize\tstatus\n");
 60     printf("\t--------------------------------------\n");
 61     for(i = 0, x = 1; i < n; i++)
 62     {
 63             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);
 64     }
 65 }
 66 
 67 void input(char name[], int * size)
 68 {    
 69     int x = 1;
 70 
 71     while(x)
 72     {
 73         printf("\n\n请输入进程名称:");
 74         scanf("%s", name);
 75 
 76         for(int i = 0; i < n; i++)
 77         {    
 78             x = 0;
 79             if(strcmp(name, p[i].pn) == 0)
 80             {
 81                 x = 1;
 82                 printf("进程名称已存在,请重新输入!");                
 83                 break;
 84             }
 85         }
 86         
 87     }
 88     
 89     x = 1;
 90     scanf("!!!\n");
 91     while(x)
 92     {
 93         printf("\n请输入进程需要的空间大小:");
 94         scanf("%d", size);
 95 
 96         for(int i = 0; i < n; i++)
 97         {
 98             
 99             if(p[i].size >= *size)
100             {
101                 x = 0;    
102                 break;
103             }
104         }
105         if(x)
106             printf("找不到适合的空间,请重新输入!");
107     }
108 
109 }
110 
111 int show_menu()
112 {
113     int x;
114     
115     printf("\n(1)首次适应算法");
116     printf("\n(2)循环首次适应算法");
117     printf("\n(3)最佳适应算法");
118     printf("\n(4)最坏适应算法");
119     printf("\n请选择一种分配方式:");
120     scanf("%d", &x);
121     while(x < 1 || x > 4)
122     {
123         printf("\n输入错误!");
124         printf("\n请选择一种分配方式:");
125         scanf("%d", &x);
126     }
127 
128     return x;
129 }
130 
131 void first_fit(char name[], int size)
132 {
133     for(int i = 0; i < n; i++)
134     {
135         if(p[i].status == f)
136         {    
137             if(p[i].size - size < msize)
138             {
139                 strcpy(p[i].pn, name);
140                 p[i].status = u;
141                 break;
142             }
143             else
144             {
145                 strcpy(p[n].pn, p[i].pn);
146                 p[n].begin = p[i].begin + size;
147                 p[n].end = p[i].end;
148                 p[n].size = p[n].end - p[n].begin;
149                 p[n].status = f;
150                 strcpy(p[i].pn, name);
151                 p[i].end = p[i].begin + size;
152                 p[i].size = size;
153                 p[i].status = u;
154                 n++;
155                 break;
156             }
157         }
158     }
159     
160 }
161 
162 void next_fit()
163 {
164     
165 }
166 
167 void best_fit()
168 {
169 
170 }
171 
172 void worst_fit()
173 {
174 
175 }
176 
177 void allocation()
178 {
179     char name[10];
180     int size;
181 
182     input(name, &size);
183     int x = show_menu();
184     
185     switch(x)
186     {
187     case 1:
188         first_fit(name, size);
189         break;
190     case 2:
191         next_fit();
192         break;
193     case 3:
194         best_fit();
195         break;
196     case 4:
197         worst_fit();
198         break;
199     }
200 
201     show();
202 }
203 
204 void move(int i, int o)
205 {
206     while(i != 0 && i < n)
207     {
208         strcpy(p[i-1].pn, p[i].pn);
209         p[i-1].begin = p[i].begin;
210         p[i-1].end = p[i].end;
211         p[i-1].size = p[i].size;
212         p[i-1].status = p[i].status;
213     }
214     n--;
215 }
216 
217 void recycle()
218 {
219     char name[10];
220     int x = 0;
221 
222     printf("\n\n请输入进程名称:");
223     scanf("%s", name);
224 
225     for(int i = 0; i < n; i++)
226     {    
227         if(strcmp(name, p[i].pn) == 0)
228         {
229             x = 1;    
230             break;
231         }
232     }
233     if(x == 0)
234         printf("\n\n进程不存在。\n");
235     else if(x == 1)
236     {
237         if(p[i-1].status == u && p[i+1].status == u)
238         {
239             strcpy(p[i].pn, "-----");
240             p[i].status = f;
241         }
242         else if(p[i+1].status == f)
243         {
244             printf("\n!!!\n");
245             strcpy(p[i].pn, "-----");
246             p[i].status = f;
247             p[i].end = p[i+1].end;
248             p[i].size += p[i+1].size; 
249             move(i+2, 1);
250         }
251         else if(p[i-1].status == f)
252         {
253             p[i-1].end = p[i].end;
254             p[i-1].size += p[i].size;
255             move(i+1, 1);
256         }
257         else if(p[i-1].status == f && p[i+1].status == f)
258         {
259             p[i-1].end = p[i+1].end;
260             p[i-1].size = p[i-1].size + p[i].size + p[i+1].size;    
261             move(i+1, 2);
262         }
263     }
264 
265     show();    
266 }
267 
268 int main(void)
269 {
270     int x = 0;
271 
272     printf("初始化:设置内存总容量为 1024k\n系统从低地址部分开始占用 200k\n\n");
273 
274     init();
275     show();
276     
277     printf("\n1. 输入进程     2. 回收进程\n");
278     scanf("%d", &x);
279     while(1)
280     {
281         if(x == 1)
282             allocation();
283         else if(x == 2)
284             recycle();
285 
286         printf("\n1. 输入进程     2. 回收进程\n");
287         scanf("%d", &x);
288     }
289     
290     
291 
292     return 0;
293 }

 

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

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

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

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

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

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

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