博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【操作系统】主存空间的分配和回收
阅读量:4949 次
发布时间:2019-06-11

本文共 8208 字,大约阅读时间需要 27 分钟。

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

专业:商软一班   姓名:黄敏鹏 学号: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. 判断是否能够在剩余的空闲区域中找到一块放置该作业,如果不行则要求用户重新输入;
  5. 显示菜单,由用户选择使用哪一种分配算法:

1) 首次适应算法

2) 循环首次适应算法

3) 最佳适应算法

4) 最坏适应算法

    6.为该作业分配内存空间,分配处理流程图如下(size的值设定为1K):

    7.屏幕显示分配后的内存分区情况。

第三步:(第15周完成)

完成内存空间回收;

  1. 由用户输入作业的ID,决定所要终止的作业;
  2. 判断是否存在用户所输入的ID,如果存在则进行终止,否则提示作业不存在;
  3. 判断即将终止的作业前后是否有空闲区域,如果没有则作业所占的空间独立成为一个空闲块,在未分配区表中增加一项;

 

程序中表示内存区块的结构体如下:

struct partition {

    char    pn[10];

    int    begin;

    int    size;

    int    end;

    char    status;

};

         所以,判断某个即将被终止的作业所占空间前面是否有空闲块的方法是:作业空间的起始地址A.begin是否等于某个空闲块的结束地址B.end,若相等,则前面有空闲块,则需要合并;若不相等则再判断后面是否有空闲块。

回答:如何判断?

         进行四种情况的判断,然后分别做出相应的区块回收操作。

回答:如何处理回收?

         显示回收后的内存使用情况。

 

运行截图:

 

源代码:

1 #include
2 //#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 }

 

转载于:https://www.cnblogs.com/huangmp1024/p/5594300.html

你可能感兴趣的文章
luogu P1525 关押罪犯
查看>>
string interpolation in sql server
查看>>
TeeChart的最小步长和最大步长
查看>>
6翻了
查看>>
Qt 定时器处理函数导致屏幕刷屏
查看>>
Java201521123071《Java程序设计》第八周学习总结
查看>>
2721: [Violet 5]樱花|约数个数
查看>>
SharePoint项目实践中如何实现非打破继承看上去很美的权限控制
查看>>
python中map()函数的用法讲解
查看>>
PPM解码器
查看>>
分享一下今天的面试题
查看>>
Bootstrap框架
查看>>
Java笔记:内部类
查看>>
关于flash上传出现IO Error #2038的错误
查看>>
字符串方法
查看>>
治五气,艺五种,抚万民,度四方
查看>>
openfire连接登陆优化方案
查看>>
教你用笔记本破解无线路由器password
查看>>
Opencv学习笔记(六)SURF学习笔记
查看>>
在Linux系统下运行微信Web开发者工具
查看>>