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

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

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 <conio.h>
  3 #include <string.h>
  4 #define MAX 1024
  5 
  6 struct partition {
  7     char   pn[10];     //分区名称
  8     int    begin;      //起始地址
  9     int    size;       //长度
 10     int    end;        //结束地址
 11     char   status;     //占用标志
 12 };
 13 struct partition    part[MAX];
 14 
 15 int p = 0; /*上次扫描结束处 */
 16 
 17 void Init()
 18 {
 19     int i;
 20     for ( i = 0; i < MAX; i++ )
 21         part[i].status = '-';
 22     strcpy( part[0].pn, "SYSTEM" );
 23     part[0].begin    = 0;
 24     part[0].size    = 250;
 25     part[0].status    = 'u';
 26     strcpy( part[1].pn, "-----" );
 27     part[1].begin    = 250;
 28     part[1].size    = 300;
 29     part[1].status    = 'f';
 30     strcpy( part[2].pn, "a" );
 31     part[2].begin    = 550;
 32     part[2].size    = 150;
 33     part[2].status    = 'u';
 34     strcpy( part[3].pn, "-----" );
 35     part[3].begin    = 700;
 36     part[3].size    = 324;
 37     part[3].status    = 'f';
 38     for ( i = 0; i < MAX; i++ )
 39         part[i].end = part[i].begin + part[i].size;
 40 }
 41 
 42 
 43 void Output( int i ) /* 输出行 */
 44 {
 45     printf( "\t%s", part[i].pn );
 46     printf( "\t%d", part[i].begin );  
 47     printf( "\t%d", part[i].size );
 48     printf( "\t%d", part[i].end );
 49     printf( "\t%c", part[i].status );
 50 }
 51 
 52 
 53 void ShowData() /* 显示分区 */
 54 {
 55     int    i;
 56     int    n;
 57     
 58     printf( "\n              已分配分区表Used:" );
 59     printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" );
 60     printf("\n");
 61     
 62     n = 1;
 63     for ( i = 0; i < MAX; i++ )
 64     {
 65         if ( part[i].status == '-' )
 66             break;
 67         if ( part[i].status == 'u' )
 68         {
 69             printf( "\n\tNo.%d", n );
 70             Output( i );
 71             n++;
 72         }
 73     }
 74     printf( "\n" );
 75     
 76     printf( "\n               空闲分区表Free:" );
 77     printf( "\n|\tNo.\tproname\tbegin\tsize\tend\tstatus" );
 78     
 79     n = 1;
 80     for ( i = 0; i < MAX; i++ )
 81     {
 82         if ( part[i].status == '-' )
 83             break;
 84         if ( part[i].status == 'f' )
 85         {
 86             printf( "\n\tNo.%d", n );
 87             Output( i );
 88             n++;
 89         }
 90     }
 91     printf( "\n" );
 92     printf( "\n" );
 93     
 94     printf( "\n          内存使用情况,按起始址增长的排:" );
 95     //printf( "\n|printf sorted by address:" );
 96     printf( "\n|\tNo.\tproname\tbegin\tsize\tend\tstatus" );
 97     
 98     n = 1;
 99     for ( i = 0; i < MAX; i++ )
100     {
101         if ( part[i].status == '-' )
102             break;
103         printf( "\n\tNo.%d", n );
104         Output( i );
105         n++;
106     }
107     printf("\n回车继续");
108     getch();
109 }
110 
111 
112 void Fit( int a, char workName[], int workSize ) /* 分配成'u'+'f' */
113 {
114     int i;
115     for ( i = MAX; i > a + 1; i-- )
116     {
117         if ( part[i - 1].status == '-' )
118             continue;
119         strcpy( part[i].pn, part[i - 1].pn );
120         part[i].begin   = part[i - 1].begin;
121         part[i].size    = part[i - 1].size;
122         part[i].end     = part[i - 1].end;
123         part[i].status  = part[i - 1].status;
124     }
125     strcpy( part[a + 1].pn, "-----" );
126     part[a + 1].begin   = part[a].begin + workSize;
127     part[a + 1].size    = part[a].size - workSize;
128     part[a + 1].end     = part[a].end;
129     part[a + 1].status  = 'f';
130     strcpy( part[a].pn, workName );
131     part[a].size        = workSize;
132     part[a].end         = part[a].begin + part[a].size;
133     part[a].status      = 'u';
134 }
135 
136 
137 void Allocation() /* 分配 */
138 {
139     int    i;
140     int    a;
141     int    workSize;
142     char    workName[10];
143     int    pFree;
144     printf( "\n请输入作业名称:" );
145     scanf( "%s", &workName );
146     printf( "请输入作业大小(k):" );
147     scanf( "%d", &workSize );
148     for ( i = 0; i < MAX; i++ )
149     {
150         if ( part[i].status == 'f' && part[i].size >= workSize )
151         {
152             pFree = i;
153             break;
154         }
155     }
156     if ( i == MAX )
157     {
158         printf( "\n该作业大小超出最大可分配空间" );
159         getch();
160         return;
161     }
162     printf( "\n请选择分配算法:" );
163     printf( "\n1、首次适应" );
164     printf( "\n2、下次适应" );
165     printf( "\n3、最优适应" );
166     printf( "\n4、最坏适应" );
167     printf( "\n请输入选项:" );
168     while ( 1 )
169     {
170         scanf( "%d", &a );
171         if ( a == 1 || a == 2 || a == 3|| a == 4 )
172             break;
173         printf( "输入错误,请重新输入:" );
174     }
175     switch ( a )
176     {
177     case 1:
178         for ( i = 0; i < MAX; i++ )
179             if ( part[i].status == 'f' && part[i].size >= workSize )
180                 break;
181             Fit( i, workName, workSize );
182             break;
183     case 2:
184         for ( p; p < MAX; p++ )
185         {
186             if ( p == MAX )
187                 p = 0;
188             if ( part[p].status == 'f' && part[p].size >= workSize )
189                 break;
190         }
191         Fit( p, workName, workSize );
192         break;
193     case 3:
194         for ( i = 0; i < MAX; i++ )
195             if ( part[i].status == 'f' && part[i].size >= workSize )
196                 if ( part[pFree].size > part[i].size )
197                     pFree = i;
198                 Fit( pFree, workName, workSize );
199                 break;
200     case 4:
201         for ( i = 0; i < MAX; i++ )
202             if ( part[i].status == 'f' && part[i].size >= workSize )
203                 if ( part[pFree].size < part[i].size )
204                     pFree = i;
205                 Fit( pFree, workName, workSize );
206                 break;
207     default:
208         break;
209     }
210     printf( "\n分配成功!" );
211     getch();
212 }
213 
214 
215 void Merge() /* 合并连续的'f' */
216 {
217     int i = 0;
218     while ( i != MAX - 1 )
219     {
220         for ( i = 0; i < MAX - 1; i++ )
221         {
222             if ( part[i].status == 'f' )
223                 if ( part[i + 1].status == 'f' )
224                 {
225                     part[i].size    = part[i].size + part[i + 1].size;
226                     part[i].end    = part[i].begin + part[i].size;
227                     i++;
228                     for ( i; i < MAX - 1; i++ )
229                     {
230                         if ( part[i + 1].status == '-' )
231                         {
232                             part[i].status = '-';
233                             break;
234                         }
235                         strcpy( part[i].pn, part[i + 1].pn );
236                         part[i].begin    = part[i + 1].begin;
237                         part[i].size    = part[i + 1].size;
238                         part[i].end    = part[i + 1].end;
239                         part[i].status    = part[i + 1].status;
240                     }
241                     part[MAX - 1].status = '-';
242                     break;
243                 }
244         }
245     }
246 }
247 /*
248 void Recovery()
249 {
250     int i=0;
251     char name[10];
252     printf("输入回收分区的名称:");
253     scanf("%s",&name);
254     for(i=1;i<4;i++)
255     {
256     
257         if (strcmp(name,part[i].pn)==0)
258         {
259             strcpy( part[i].pn, "-----" );
260             part[i].begin=part[i-1].end;
261             part[i]
262 
263 
264         }
265             char   pn[10];     //分区名称
266     int    begin;      //起始地址
267     int    size;       //长度
268     int    end;        //结束地址
269     char   status;     //占用标志
270 
271 }*/
272 
273 
274 
275 void main()
276 {
277     int a;
278     Init();
279     printf( "\n初始化,设内存容量%dk", MAX );
280     printf( "\n系统从低地址部分开始使用,占用%dk", part[0].size );
281     printf( "\n" );
282     while ( 1 )
283     {
284         printf( "\n" );
285         printf("\n*******************");
286         printf( "\n1、显示分区" );
287         printf( "\n2、分配作业" );
288         printf( "\n3、回收分区" );
289         printf("\n*******************\n");
290         printf( "\n请输入选项:" );
291         while ( 1 )
292         {
293             scanf( "%d", &a );
294             if ( a == 1 || a == 2 || a == 3 )
295                 break;
296                 printf( "输入错误,请重新输入:" );
297         }
298         switch ( a )
299         {
300         case 1:
301             ShowData();
302             break;
303         case 2:
304             Allocation();
305             break;
306         case 3:
307             //Recovery();
308             break;
309         default:
310             break;
311         }
312     }
313 }

 

 

posted @ 2016-06-24 15:57  57张俊毅  阅读(225)  评论(0编辑  收藏  举报