实验四主存空间的分配和回收
专业:商软一班 姓名:黄敏鹏 学号:201406114116
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周完成)
完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。
第二步:(第14周完成)
完成为某作业分配内存空间。
- 用户输入作业名称;
- 判断作业名称是否已经存在,如果存在则要求用户重新输入;
- 用户输入作业所占空间大小;
- 判断是否能够在剩余的空闲区域中找到一块放置该作业,如果不行则要求用户重新输入;
- 显示菜单,由用户选择使用哪一种分配算法:
1) 首次适应算法
2) 循环首次适应算法
3) 最佳适应算法
4) 最坏适应算法
6.为该作业分配内存空间,分配处理流程图如下(size的值设定为1K):
7.屏幕显示分配后的内存分区情况。
第三步:(第15周完成)
完成内存空间回收;
- 由用户输入作业的ID,决定所要终止的作业;
- 判断是否存在用户所输入的ID,如果存在则进行终止,否则提示作业不存在;
- 判断即将终止的作业前后是否有空闲区域,如果没有则作业所占的空间独立成为一个空闲块,在未分配区表中增加一项;
程序中表示内存区块的结构体如下:
struct partition {
char pn[10];
int begin;
int size;
int end;
char status;
};
所以,判断某个即将被终止的作业所占空间前面是否有空闲块的方法是:作业空间的起始地址A.begin是否等于某个空闲块的结束地址B.end,若相等,则前面有空闲块,则需要合并;若不相等则再判断后面是否有空闲块。
回答:如何判断?
进行四种情况的判断,然后分别做出相应的区块回收操作。
回答:如何处理回收?
显示回收后的内存使用情况。
运行截图:
源代码:
1 #include2 //#include 3 #include 4 #include 5 #define MAX 24 //内存允许同时存在的空间数 6 #define max_size 512 //内存空间的大小 7 struct partition{ 8 9 char pn[10]; //空间名称 10 int begin; //空间的相对起始位置 11 int size; //空间的大小 12 int end; //空间的相对结束位置 13 char status; //通过该属性判断空间状态 : u 为已使用 ; f 为未分配作业 ; 0 为未初始化 14 }; 15 typedef struct partition PART; 16 17 char jobName[20]; //暂时保存用户输入的作业名 18 int jobSize; //暂时保存用户输入的作业所需空间大小 19 20 int lastPost=0; //保存循环首次适应算法的上次搜索的位置 21 22 //初始化内存分配 23 void newMemory(PART memory[MAX]); 24 //输出内存分配情况 25 void putoutMemory(PART memory[MAX]); 26 //输入作业 27 void inputJob(PART memory[MAX]); 28 //回收指定作业 29 void removeJob(PART memory[MAX]); 30 //首次适应算法查找目标分区 31 void findByFirstFit(PART memory[MAX],int jobSize,char jobName[20]); 32 //循环首次适应算法查找目标分区 33 void findByNestFit(PART memory[MAX],int jobSize,char jobName[20]); 34 //最坏适应分配查找目标分区 35 void findByWorstFit(PART memory[MAX],int jobSize,char jobName[20]); 36 //最优适应分配查找目标分区 37 void findByGoodFit(PART memory[MAX],int jobSize,char jobName[20]); 38 39 /* 40 主函数 41 */ 42 void main(){ 43 PART memory[MAX]; 44 newMemory(memory); 45 46 while(1){ 47 system("title 201402114116-黄敏鹏"); 48 system("mode con cols=80 lines=30"); 49 system("cls"); 50 int choose; 51 printf("0.退出 1.回收内存 2.查看内存分配情况 3.回收指定作业 \n"); 52 printf("4.首次适应分配 5.循环首次适应分配 6.最坏适应分配 7.最优适应分配\n"); 53 printf("\n请输入 : "); 54 scanf("%d",&choose); 55 switch( choose ){ 56 case 0: 57 printf("\n\n程序已停止运行,按任意键关闭窗口\n\n\n"); 58 exit(1); 59 break; 60 case 1: 61 newMemory(memory); 62 printf("\n\n还原内存分配成功\n\n\n\n"); 63 break; 64 case 2: 65 putoutMemory(memory); 66 break; 67 case 3: 68 removeJob(memory); 69 break; 70 case 4: 71 inputJob(memory); 72 findByFirstFit(memory,jobSize,jobName); 73 break; 74 case 5: 75 inputJob(memory); 76 findByNestFit(memory,jobSize,jobName); 77 break; 78 case 6: 79 inputJob(memory); 80 findByWorstFit(memory,jobSize,jobName); 81 break; 82 case 7: 83 inputJob(memory); 84 findByGoodFit(memory,jobSize,jobName); 85 break; 86 default: 87 printf("\n\n输入错误,请重新输入!\n\n\n"); 88 } 89 system("pause"); 90 } 91 } 92 93 //初始化内存空间 94 void newMemory(PART memory[MAX]){ 95 for(int i=0;i max_size){152 printf("\n\n作业所需空间过大,系统无法满足您的需求\n\n");153 return ;154 }155 int i=0;156 for(i=0;i =jobSize && memory[i].status == 'f'){158 post=i;159 break;160 }161 }162 for(int j = 0; j =24 ){169 printf("\n所需空间太大,系统无法满足您的需求\n\n");170 return ;171 }172 if(post2>=24){173 printf("\n已有的作业数太多,系统无法满足您的需求\n\n");174 return ;175 }176 177 int memorySize=memory[post].size;178 strcpy(memory[post].pn,jobName);179 memory[post].size = jobSize;180 memory[post].end = memory[post].begin + memory[post].size;181 memory[post].status = 'u';182 183 memory[post2].begin = memory[post].end;184 memory[post2].size = memorySize - jobSize;185 memory[post2].end = memory[post2].begin + memory[post2].size;186 memory[post2].status = 'f';187 strcpy(memory[post2].pn,"SYSTEM");188 189 printf("\n\n添加作业成功\n\n\n\n");190 191 }192 193 //循环首次适应算法查找目标分区194 void findByNestFit(PART memory[MAX],int jobSize,char jobName[20]){195 int post=0,post2;196 int i,j;197 198 if(lastPost<=24){ 199 post = lastPost;200 }else{201 lastPost = 0;202 }203 204 if( jobSize > max_size){205 printf("\n\n作业所需空间过大,系统无法满足您的需求\n\n");206 return ;207 }208 for(i=post;i =jobSize && memory[i].status == 'f'){210 post=i;211 break;212 }213 if(i==MAX){214 for(j=post;j =jobSize && memory[j].status == 'f'){216 post=j;217 break;218 }219 }220 }221 }222 for(j = 0; j =24 || memory[post].size < jobSize){230 printf("\n\n没有可以放置的空间\n\n");231 return;232 }233 if(post2>=24){234 printf("\n\n已有的作业数太多,系统无法满足您的需求\n\n");235 return;236 }237 238 lastPost = post;239 240 int memorySize=memory[post].size;241 strcpy(memory[post].pn,jobName);242 memory[post].size = jobSize;243 memory[post].end = memory[post].begin + memory[post].size;244 memory[post].status = 'u';245 246 memory[post2].begin = memory[post].end;247 memory[post2].size = memorySize - jobSize;248 memory[post2].end = memory[post2].begin + memory[post2].size;249 memory[post2].status = 'f';250 strcpy(memory[post2].pn,"SYSTEM");251 252 printf("\n\n添加作业成功\n\n\n\n");253 }254 255 //最坏适应分配查找目标分区256 void findByWorstFit(PART memory[MAX],int jobSize,char jobName[20]){257 int post=-1,post2;258 if( jobSize > max_size){259 printf("\n\n作业所需空间过大,系统无法满足您的需求\n\n");260 return ;261 }262 int i=0;263 for(i=0;i jobSize && memory[i].status == 'f'){265 if( post == -1){266 post=i;267 }else if(memory[i].size>memory[post].size){268 post=i;269 }270 }271 }272 for(int j = 0; j =24){279 printf("\n\n已有的作业数太多,系统无法满足您的需求\n");280 return ;281 }282 if(post>=24 || post ==-1){283 printf("\n\n所需空间太大,系统无法满足您的需求\n");284 return ;285 }286 287 int memorySize=memory[post].size;288 strcpy(memory[post].pn,jobName);289 memory[post].size = jobSize;290 memory[post].end = memory[post].begin + memory[post].size;291 memory[post].status = 'u';292 293 memory[post2].begin = memory[post].end;294 memory[post2].size = memorySize - jobSize;295 memory[post2].end = memory[post2].begin + memory[post2].size;296 memory[post2].status = 'f';297 strcpy(memory[post2].pn,"SYSTEM");298 299 printf("\n\n添加作业成功\n\n\n\n");300 }301 302 //最优适应分配查找目标分区303 void findByGoodFit(PART memory[MAX],int jobSize,char jobName[20]){304 int post=-1,post2;305 if( jobSize > max_size){306 printf("\n\n作业所需空间过大,系统无法满足您的需求\n\n");307 return ;308 }309 int i=0;310 for(i=0;i jobSize && memory[i].status == 'f' ){312 if( post >= 0 ){313 if( memory[i].size < memory[post].size ){314 post=i;315 printf("%d----",i);316 }317 }else if( post == -1 ){318 post=i;319 }320 }321 }322 for(int j = 0; j =24){329 printf("\n\n已有的作业数太多,系统无法满足您的需求\n\n");330 return ;331 }332 if(post>=24 || post == -1){333 printf("\n\n所需空间太大,系统无法满足您的需求\n\n");334 return ;335 }336 337 int memorySize=memory[post].size;338 strcpy(memory[post].pn,jobName);339 memory[post].size = jobSize;340 memory[post].end = memory[post].begin + memory[post].size;341 memory[post].status = 'u';342 343 memory[post2].begin = memory[post].end;344 memory[post2].size = memorySize - jobSize;345 memory[post2].end = memory[post2].begin + memory[post2].size;346 memory[post2].status = 'f';347 strcpy(memory[post2].pn,"SYSTEM");348 349 printf("\n\n添加作业成功\n\n\n\n");350 }