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

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

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 typedef struct process
  5 {
  6     int number;
  7     char name[20];
  8     int begin;
  9     int size;
 10     char status;
 11 
 12 }Pro ;
 13 
 14 
 15 
 16 int main()
 17 
 18 {
 19 
 20    int sys=1024;
 21     char s;
 22     int x=0;  
 23     int c1=0;        //开始
 24     int c2=0;         //大小
 25     int number=1;
 26     char j[10];   //进程名
 27     Pro part[10];
 28 
 29     strcpy(part[0].name,"system");    //初始的数据
 30     part[0].begin=0;
 31     part[0].size=100;
 32     part[0].status='f';
 33     printf("初始化,设内存总容量为%dK\n",sys);
 34     printf("系统从低地址部分开始使用,占用%dK\n\n",part[0].size);
 35     
 36 
 37     printf("空闲区表:\n");
 38     printf("\tNO.0\t proname\tbegin\t size\t status\n");
 39     printf("\tNO.1\t ------\t\t %d\t %d\t  f\n\n",part[0].size,sys-part[0].size);
 40     printf("-------------------------------------------------------\n");
 41 
 42     printf("已分配分区表:\n");
 43     printf("\tNO.0\t proname\tbegin\t size\t status\n");
 44     printf("\tNO.1\t %s\t\t %d\t %d\t  %c\n",part[0].name,part[0].begin,part[0].size,part[0].status);
 45 
 46     printf("\n\n");
 47 
 48  
 49 
 50     printf("内存使用情况,按起始增长的排序:\n");
 51     printf("printf sorted by address:\n");
 52     printf("\tNO.\t proname\tbegin\t size\t status\n");
 53     printf("\t-----------------------------------------------\n");
 54     printf("\tNO.1\t %s\t\t %d\t %d\t  u\n",part[0].name,part[0].begin,part[0].size);
 55     printf("\tNO.2\t ------\t\t %d\t %d\t  f\n\n",part[0].size,sys-part[0].size);
 56 
 57  
 58 
 59     printf("\n\n");
 60     
 61 
 62     x=1;
 63 
 64     while (1) 
 65 
 66     {
 67 
 68         printf("请选择:\n1.添加\n2.回收\n0.退出\n");
 69 
 70         scanf("%s",&s);
 71 
 72         switch (s)
 73 
 74         {
 75 
 76         case '1':             //添加
 77 
 78             printf("请输入进程名:");
 79             scanf("%s",&part[x].name);
 80             printf("请输入进程大小:");
 81             scanf("%d",&part[x].size);
 82             part[1].begin=100;    //开始
 83             part[x].status='u';
 84             number++;   //进程数
 85 
 86  
 87 
 88             printf("完成添加!\n");
 89             printf("空闲区表:\n");
 90             printf("\tNO.0\t proname\tbegin\t size\t status\n");
 91             for (x=0;x<number;x++)
 92             { 
 93 
 94                 part[x+1].begin=part[x].begin+part[x].size;
 95                 c1=part[x+1].begin;   //开始位置
 96                 c2=sys-c1;           //剩余空间大小
 97 
 98             }
 99 
100                 printf("\tNO.1\t ------\t\t %d\t %d\t  f\n\n",c1,c2);
101 
102                     part[0].status='u';
103                 printf("-------------------------------------------------------\n");
104                 printf("已分配分区表:\n");
105                     printf("\tNO.0\t proname\tbegin\t size\t status\n");
106                 for(x=0;x<number;x++)
107                 {
108                     part[x+1].begin=part[x].begin+part[x].size;
109                     printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",x+1,part[x].name,part[x].begin,part[x].size,part[x].status);
110                 }
111 
112                 printf("\n\n");
113                 printf("内存使用情况,按起始增长的排序:\n");
114                 printf("printf sorted by address:\n");
115                 printf("\tNO.0\t proname\tbegin\t size\t status\n");
116                 printf("\t-----------------------------------------------\n");
117                 for (x=0;x<number;x++)
118                 {
119                 printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",x+1,part[x].name,part[x].begin,part[x].size,part[x].status);
120                 }
121                 printf("\tNO.%d\t ------\t\t %d\t %d\t  f\n\n",number+1,c1,c2);
122                 break;
123 
124                 case '2':                     //回收
125 
126                printf("输入进程名:");
127                 scanf("%s",&j);
128                 printf("回收成功!\n");
129                 for (x=0;x<number;x++)
130                 {
131                     if (strcmp(j,part[x].name)==0)    //当为----为空闲
132                     {
133                         strcpy(part[x].name,"------");
134                         part[x].status='f';
135                     }
136                 }
137                 
138                 printf("空闲区表:\n");
139                 printf("\tNO.0\t proname\tbegin\t size\t status\n");
140                 for (x=0;x<number;x++)
141                 {
142                     if (part[x].status=='f')
143                     {
144                         printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",x,part[x].name,part[x].begin,part[x].size,part[x].status);}
145                     }
146                 printf("\tNO.%d\t ------\t\t %d\t %d\t  f\n\n",number-1,c1,c2);       //当前进程数减一
147                 printf("-------------------------------------------------------\n");
148         
149             printf("已分配分区表:\n");
150             printf("\tNO.0\t proname\tbegin\t size\t status\n");
151             for(x=0;x<number;x++)
152             {
153                 if (part[x].status=='u')
154                 {
155                     printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",x,part[x].name,part[x].begin,part[x].size,part[x].status);}
156                 }
157             printf("\n\n");
158             printf("内存使用情况,按起始增长的排序:\n");
159             printf("printf sorted by address:\n");
160             printf("\tNO.0\t proname\tbegin\t size\t status\n");
161             printf("\t-----------------------------------------------\n");
162             for (x=0;x<number;x++)
163 
164                 {
165                     printf("\tNO.%d\t %s\t\t %d\t %d\t  %c\n",x+1,part[x].name,part[x].begin,part[x].size,part[x].status);
166                 }
167                 printf("\tNO.%d\t ------\t\t %d\t %d\t  f\n\n",number+1,c1,c2);
168 
169             break;
170 
171             case '0':
172             exit(0);
173             break;
174 
175         }
176 
177     }
178     return 0;
179 
180 }

 

posted @ 2016-06-24 16:53  J航  阅读(174)  评论(0编辑  收藏  举报