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

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

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种算法,让我明白了学习编程必须要思路清晰。

posted @ 2016-05-27 15:40  34黄冠锋  阅读(213)  评论(0编辑  收藏  举报