45马文其  

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

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;

 
1 #include<stdio.h>
  2 #include<conio.h>
  3 #include<string.h>
  4 #define MAX 24
  5 #define Memory 512
  6 struct partition{
  7 
  8     char pn[10];
  9     int begin;
 10     int size;
 11     int end;
 12     char status;
 13 };
 14 typedef struct partition PART;
 15 PART Free[MAX],User[MAX],addresses[MAX];
 16 int sumFree,sumUsed,sumaddresses;
 17 
 18 void addFree(int i,int j)
 19 {
 20     strcpy(addresses[i].pn,Free[j].pn);
 21     addresses[i].begin=Free[j].begin;
 22     addresses[i].size=Free[j].size;
 23     addresses[i].status=Free[j].status;
 24 }
 25 void addUsed(int i,int j)
 26 {
 27     strcpy(addresses[i].pn,Used[j].pn);
 28     addresses[i].begin=Used[j].begin;
 29     addresses[i].size=Used[j].size;
 30 
 31     addresses[i].status=Used[j].status;
 32 }
 33 void init()
 34 {
 35     sumFree=0,sumUsed=0,sumaddresses=0;
 36     strcpy(Used[1].pn,"SYSTEM");
 37     Used[1].begin=0;
 38     Used[1].size=100;
 39     Used[1].status='u';
 40     sumUsed++;
 41 
 42     sumaddresses++;
 43     addUsed(sumaddresses,sumUsed);
 44     printf("初始化,设内存总容量为512k\n");
 45     printf("系统从低地址部分开始使用,占用100k\n\n");
 46 
 47     strcpy(Free[1].pn,"----");
 48     Free[1].begin=100;
 49     Free[1].size=Memory-Free[1].begin;
 50     Free[1].status='f';
 51     sumFree++;
 52 
 53     sumaddresses++;
 54     addFree(sumaddresses,sumFree);
 55 }
 56 
 57 void PT()
 58 {
 59     int i;
 60     printf("空闲区表Free\n");
 61     printf("\t\t\tNo.\trproname\tbegin\tsize\tstatus\n");
 62     for(i=1;i<=sumFree;i++)
 63     printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);
 64 
 65 
 66     printf("已分配分区表Used\n");
 67     printf("\t\t\tNo.\trproname\tbegin\tsize\tstatus\n");
 68     for(i=1;i<=sumUsed;i++)
 69     printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,Used[i].pn,Used[i].begin,Used[i].size,Used[i].status);
 70 
 71     printf("内存使用情况,按起始址增长的排:\n");
 72     printf("\t\t\tNo.\trproname\tbegin\tsize\tstatus\n");
 73     for(i=1;i<=sumaddresses;i++)
 74     printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,addresses[i].pn,addresses[i].begin,addresses[i].size,addresses[i].status);
 75 
 76 }
 77 int main()
 78 {
 79     init();
 80     PT();
 81     return 0;
 82 }
 83 
 84 
 85 
 86 
 87 
 88 
 89 #include "string.h"
 90 #include "iostream"
 91 using namespace std;
 92 #define FALSE 0
 93 #define TRUE 1
 94 #define W 10
 95 #define R 20
 96 int M=100;//进程的最大数为100
 97 int N=100;//资源的最大数为100
 98 int ALL_RESOURCE[W];//各种资源的数目总和
 99 int MAX[W][R]; //M个进程对N类资源最大资源需求量
100 int AVAILABLE[R]; //系统可用资源数
101 int ALLOCATION[W][R]; //M个进程已经得到N类资源的资源量
102 int NEED[W][R]; //M个进程还需要N类资源的资源量
103 int Request[R]; //请求资源个数
104 
105 
106 void showdata() //函数showdata,输出资源分配情况
107 {
108    int i,j;
109    cout<<"各种资源的总数量(all):"<<endl;
110    cout<<" ";
111    for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];
112    cout<<endl<<endl;
113    cout<<"系统目前各种资源可用的数为(available):"<<endl;
114    cout<<" ";
115    for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];
116    cout<<endl<<endl;
117    cout<<" 各进程还需要的资源量(need):"<<endl<<endl;
118    cout<<"       资源0"<<"     资源1"<<"    资源2"<<endl;
119    for (i=0;i<M;i++)
120    for (i=0;i<M;i++)
121    {
122      cout<<"进程p"<<i<<":   ";
123      for (j=0;j<N;j++)cout<<NEED[i][j]<<"        ";;
124      cout<<endl;
125    }
126    cout<<endl;
127    cout<<" 各进程已经得到的资源量(allocation): "<<endl<<endl;
128    cout<<"       资源0"<<"     资源1"<<"     资源2"<<endl;
129    for (i=0;i<M;i++)
130    {
131      cout<<"进程p"<<i<<":    ";
132      for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<"       ";
133      cout<<endl;
134    }
135    cout<<endl;
136 }
137 void changdata(int k) //函数changdata,改变可用资源和已经拿到资源和还需要的资源的值
138 {
139    int j;
140    for (j=0;j<N;j++)
141    {
142      AVAILABLE[j]=AVAILABLE[j]-Request[j];
143      ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
144      NEED[k][j]=NEED[k][j]-Request[j];}}
145 void rstordata(int k) //函数rstordata,恢复可用资源和已经拿到资源和还需要的资源的值
146 {int j;
147    for (j=0;j<N;j++)
148    { AVAILABLE[j]=AVAILABLE[j]+Request[j];
149      ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
150      NEED[k][j]=NEED[k][j]+Request[j];}}
151 int chkerr(int s) //函数chkerr,检查是否安全
152 { int WORK,FINISH[W];
153     int i,j,k=0;
154     for(i=0;i<M;i++)FINISH[i]=FALSE;
155     for(j=0;j<N;j++)
156      {
157             WORK=AVAILABLE[j];
158         i=s;
159         do
160             {
161           if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)
162             {
163                    WORK=WORK+ALLOCATION[i][j];
164               FINISH[i]=TRUE;
165               i=0;
166             }
167           else
168             { i++;
169             }
170             }while(i<M);
171         for(i=0;i<M;i++)
172         if(FINISH[i]==FALSE)
173             {
174             cout<<endl;
175            cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
176            cout<<endl;
177            return 1;
178             }
179      }
180     cout<<endl;
181     cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
182     cout<<endl;
183     return 0;
184 }
185 void bank()   //银行家算法
186 {
187      int i=0,j=0;
188      char flag='Y';
189     
190      while(flag=='Y'||flag=='y')
191      {
192        i=-1;
193        while(i<0||i>=M)
194         {
195          cout<<" 请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重输入!):";
196          cout<<"p";cin>>i;
197          if(i<0||i>=M)cout<<" 输入的进程号不存在,重新输入!"<<endl;
198         }
199       cout<<" 请输入进程P"<<i<<"申请的资源数:"<<endl;
200      for (j=0;j<N;j++)
201      {
202         cout<<" 资源"<<j<<": ";
203         cin>>Request[j];
204       if(Request[j]>NEED[i][j]) //若请求的资源数大于进程还需要i类资源的资源量j
205      {
206          cout<<" 进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";
207          cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
208          flag='N';
209          break;
210      }
211     else
212      {
213      if(Request[j]>AVAILABLE[j]) //若请求的资源数大于可用资源数
214      {
215       cout<<" 进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
216       cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
217      flag='N';
218       break;
219             }
220      }
221      }
222      if(flag=='Y'||flag=='y')
223      {
224       changdata(i); //调用changdata(i)函数,改变资源数
225       if(chkerr(i)) //若系统安全
226      {
227          rstordata(i); //调用rstordata(i)函数,恢复资源数
228          showdata();   //输出资源分配情况
229      }
230       else       //若系统不安全
231       showdata(); //输出资源分配情况
232      }
233       else      //若flag=N||flag=n
234       showdata();
235       cout<<endl;
236       cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
237       cin>>flag;
238      }
239 }
240 void main() //主函数
241 {
242    int i=0,j=0,p;
243    cout<<"请输入总进程数:"<<endl;
244    cin>>M;
245    cout<<"请输入总资源种类:"<<endl;
246    cin>>N;
247    cout<<"请输入总资源数:"<<endl;
248    for(i=0;i<N;i++)
249    cin>>ALL_RESOURCE[i];
250    cout<<"依次输入各进程所需要的最大资源数量:"<<endl;
251    for (i=0;i<M;i++)
252    {
253       for (j=0;j<N;j++)
254      {
255         do
256          {
257           cin>>MAX[i][j];
258           if (MAX[i][j]>ALL_RESOURCE[j])
259           cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
260           }while (MAX[i][j]>ALL_RESOURCE[j]);
261       }
262 }
263 cout<<"依次输入各进程已经占据的资源数量(allocation):"<<endl;
264 for (i=0;i<M;i++)
265 {
266     for (j=0;j<N;j++)
267      {
268        do
269          {
270           cin>>ALLOCATION[i][j];
271           if (ALLOCATION[i][j]>MAX[i][j])
272           cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
273           }while (ALLOCATION[i][j]>MAX[i][j]);
274          }
275      }
276      //初始化资源数量
277       for (j=0;j<N;j++)
278       { p=ALL_RESOURCE[j];
279          for (i=0;i<M;i++)
280           {
281            p=p-ALLOCATION[i][j];//减去已经被占据的资源
282            AVAILABLE[j]=p;
283            if(AVAILABLE[j]<0)
284            AVAILABLE[j]=0;
285            }
286      }
287       for (i=0;i<M;i++)
288       for(j=0;j<N;j++)
289          NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
290       showdata();
291       bank();
292 }

  实验结果与预期相符

 

 

 

posted on 2016-06-29 21:09  QIMark  阅读(249)  评论(0编辑  收藏  举报