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

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;

 

第一步:(第13周完成)

完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。

源代码:

  1 #include <stdio.h> 
  2 #include <stdlib.h> 
  3 #include<string.h>
  4 #include <conio.h> 
  5 #define getpart(type) (type*)malloc(sizeof(type)) 
  6 #define MAX 24
  7 #define RAM 512
  8 #define SYSTEM 100
  9 struct partition { 
 10        char pn[10]; 
 11        char status; 
 12        int begin; 
 13        int size; 
 14        int end; 
 15 }; 
 16 
 17 typedef struct partition PART; 
 18 
 19 PART ram[MAX];
 20 menu2()
 21 {
 22     printf("\n\t\t**************************");
 23     printf("\n\t\t1.首次适应算法");                    
 24     printf("\n\t\t2.最佳适应算法");
 25     printf("\n\t\t3.最坏适应算法");
 26     printf("\n\t\t4.循环首次适应算法\n");
 27     printf("\n\t\t**************************\n");
 28 
 29 }
 30 void InputPart()
 31 {
 32     int flag ;
 33     char name[10];
 34     int size;
 35     int j = MAX-1;
 36     menu2();
 37 
 38     printf("请选择: ");
 39     scanf("%d",&flag);
 40     printf("\n\n请输入任务名:");
 41     scanf("%s",&name);
 42     printf("\n\n请输入需要空间:");
 43     scanf("%d",&size);
 44     if(flag == 1)//首次适应算法
 45     {
 46         int i=0;
 47         while(i<MAX)
 48         {
 49             if(ram[i].status == 'f' && ram[i].size >= size)
 50             {
 51                 
 52                 while(j>=i)
 53                 {
 54                     ram[j] = ram[j-1];
 55                     j--;
 56                 }
 57                 strcpy(ram[i].pn, name);
 58                 ram[i].begin = ram[i-1].end;
 59                 ram[i].size = size;
 60                 ram[i].end = ram[i].begin + ram[i].size;
 61                 ram[i].status = 'u';
 62 
 63                 ram[i+1].begin = ram[i].end;
 64                 ram[i+1].size = ram[i+1].size - ram[i].size;
 65                 break;
 66 
 67             }
 68             i++;
 69         }
 70     }
 71 
 72     else if(flag == 2)//最佳适应算法
 73     {
 74         j = MAX;
 75         int best = 512;
 76         int bi = 0;
 77         int i=0;
 78         while(i<MAX)
 79         {
 80             if(ram[i].status == 'f')
 81             {
 82                 if(best > ram[i].size)
 83                 {
 84                     best = ram[i].size;
 85                     bi = i;
 86                 }
 87             }
 88             i++;
 89         }
 90         if(ram[bi].status == 'f' && ram[bi].size >= size)
 91         {
 92             
 93             while(j>=bi)
 94             {
 95                 ram[j] = ram[j-1];
 96                 j--;
 97             }
 98             strcpy(ram[bi].pn, name);
 99             ram[bi].begin = ram[bi-1].end;
100             ram[bi].size = size;
101             ram[bi].end = ram[bi].begin + ram[bi].size;
102             ram[bi].status = 'u';
103 
104             ram[bi+1].begin = ram[bi].end;
105             ram[bi+1].size = ram[bi+1].size - ram[bi].size;
106         }
107 
108 
109 
110 
111     }
112     else if(flag==4)//循环首次适应算法
113     {
114         int bi;
115         int xh=0;
116         int p=xh;
117         int i=0;
118         printf("从第%d项开始查找",xh);
119         while(i<MAX)
120         {
121             if(ram[i].status == 'f' && ram[i].size >= size)
122             {
123                 //剩下公式!
124                 while(j>=i)
125                 {
126                     ram[j] = ram[j-1];
127                     j--;
128                 }
129                 strcpy(ram[i].pn, name);
130                 ram[i].begin = ram[i-1].end;
131                 ram[i].size = size;
132                 ram[i].end = ram[i].begin + ram[i].size;
133                 ram[i].status = 'u';
134 
135                 ram[i+1].begin = ram[i].end;
136                 ram[i+1].size = ram[i+1].size - ram[i].size;
137                 break;
138                 xh=i;
139                 printf("下次循环首次适应从第%d开始查找",xh);
140                 
141 
142             }
143             else
144             {
145                i++;
146                if(i>MAX)
147                {
148                    i=0;
149                }
150             }
151         }
152 
153 
154 
155     }
156     else if(flag == 3)//最坏适应算法
157     {
158         j = MAX;
159         int bad = 0;
160         int bi = 0;
161         int i=0;
162         while(i<MAX)
163         {
164             if(ram[i].status == 'f')
165             { 
166                 if(bad < ram[i].size)
167                 {
168                     bad = ram[i].size;
169                     bi = i;
170                 }
171             }
172             i++;
173         }
174         if(ram[bi].status == 'f' && ram[bi].size >= size)
175         {
176             //剩下公式!
177             while(j>=bi)
178             {
179                 ram[j] = ram[j-1];
180                 j--;
181             }
182             strcpy(ram[bi].pn, name);
183             ram[bi].begin = ram[bi-1].end;
184             ram[bi].size = size;
185             ram[bi].end = ram[bi].begin + ram[bi].size;
186             ram[bi].status = 'u';
187 
188             ram[bi+1].begin = ram[bi].end;
189             ram[bi+1].size = ram[bi+1].size - ram[bi].size;
190         }
191 
192 
193     
194 
195 
196     }
197 
198 
199 
200 
201 
202 
203 
204 }
205 
206 void OutputPart()
207 {
208     int i = 0;
209     printf("空闲区表FREE:\n");
210     while(i<MAX)
211     {
212         if(ram[i].status == 'f')
213         {
214             printf("No.%d\t%s\t%d\t%d\t%d\t%c\n",i+1,ram[i].pn,ram[i].begin,ram[i].size,ram[i].end,ram[i].status);
215         }
216         i++;
217 
218     }
219     i = 0;
220     printf("\n\n\n已分配区表USED:\n");
221     while(i<24)
222     {
223         if(ram[i].status == 'u')
224         {
225             printf("No.%d\t%s\t%d\t%d\t%d\t%c\n",i+1,ram[i].pn,ram[i].begin,ram[i].size,ram[i].end,ram[i].status);
226         }
227         i++;
228     }
229     printf("\n\n");
230 }
231 
232 
233 
234 void RecycleRAM()
235 {
236     //回收内存的时候要先判断在空间当中前后是否有空闲区间。
237     char name[10];
238     int i = 0;
239 
240     //当空闲表单中,作业前面有空闲区间时
241     printf("\n请输入要回收的作业的ID:");
242     scanf("%s",&name);
243     while(i < MAX)
244     {
245         if(strcmp(name,ram[i].pn)==0)
246         {
247             printf("找到任务%d!!!\n",i);
248             if(i != 0 && i<MAX)
249             {
250                 if(ram[i-1].status == 'f' && ram[i+1].status == 'f')
251                 {
252                                 printf("\n1!!!\n",i);
253                     
254                     //合并前后两个分区
255                     ram[i-1].end = ram[i+1].end;
256                     ram[i-1].size = ram[i-1].size + ram[i].size + ram[i+1].size;
257                     ram[i-1].status = 'f';
258                     for(int j = i ; j<MAX ; j++)   //
259                     {
260                         if(j+2 < MAX)
261                             ram[j] = ram[j+2];
262                     }
263                 }
264 
265             }
266             if(ram[i-1].status == 'f' && ram[i+1].status != 'f')
267             {
268                                                 printf("\n2!!!\n",i);
269                 ram[i-1].end = ram[i].end;
270                 ram[i-1].size = ram[i-1].size + ram[i].size;
271                 ram[i-1].status = 'f';
272                 for(int j = i ; j<MAX ; j++)
273                 {
274                     if(j+1 <MAX)
275                     {
276                         ram[j] = ram[j+1];
277                     }
278                 }
279             }
280             else if(ram[i-1].status != 'f' && ram[i+1].status == 'f')
281             {
282                                                 printf("\n!!!\n",i);
283                 ram[i].end = ram[i+1].end;
284                 ram[i].size = ram[i].size + ram[i+1].size;
285                 ram[i].status = 'f';
286                 for(int j = i+1 ; j<MAX ; j++)
287                 {
288                     if(j+1 < MAX)
289                     {
290                         ram[j] = ram[j+1];
291                     }
292                 }
293             }
294             else if(ram[i-1].status != 'f' && ram[i+1].status != 'f')
295             {
296                                                 printf("\n4!!!\n",i);
297                                                 
298                 strcpy(ram[1].pn, "------");
299                 ram[i].status = 'f';
300 
301             }
302         }
303         i++;
304     }
305 }
306 menu()
307 {
308     printf("\t\t****************************");
309     printf("\n\t\t1.添加任务");
310     printf("\n\t\t2.收回内存");
311     printf("\n\t\t3.显示任务\n");
312     printf("\t\t****************************\n");
313 
314 }
315 
316 
317 void main()
318 {
319     int flag;
320 
321     strcpy(ram[0].pn, "SYSTEM");
322     ram[0].begin = 0;
323     ram[0].size = SYSTEM;
324     ram[0].end = ram[0].begin + ram[0].size;
325     ram[0].status = 'u';
326 
327     strcpy(ram[1].pn, "-----");
328     ram[1].begin = ram[0].end;
329     ram[1].size = RAM - ram[0].size;
330     ram[1].end = RAM;
331     ram[1].status = 'f';
332 
333     printf("初始化,设内存总量为512K\n");
334     printf("系统从低地址部分开始使用,占用100K\n\n");
335 
336     OutputPart();
337     while(1)
338     {
339         menu();
340         scanf("%d",&flag);
341             if(flag == 1)
342                 InputPart();
343             else if(flag == 2)
344                 RecycleRAM();
345             else if(flag == 3)
346                 OutputPart();
347     }
348     
349 
350 
351 
352 
353 }

 

posted @ 2016-05-27 16:45  你若精彩,蝴蝶自来  阅读(279)  评论(0编辑  收藏  举报