操作系统-存储器的分配与回收算法实现(共20页).doc
-
资源ID:6612804
资源大小:286.50KB
全文页数:20页
- 资源格式: DOC
下载积分:20金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
操作系统-存储器的分配与回收算法实现(共20页).doc
精选优质文档-倾情为你奉上操作系统实验报告存储器的分配与回收算法实现姓 名: 学 号: 班 级: 09计算机1 一、实验名称及要求1、实验名称:存储器的分配与回收算法实现2、实验要求: 学生应正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确。3、实验方式: 学生通过实验室的微机上机,实际调试程序。4、实验环境: Windows操作系统环境下的个人微机 或程序设计语言二、实验内容1 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。2 采用最先适应法、最佳适应法、最坏适应法分配主存空间。3 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。5 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。三、实验程序#include <iostream.h>#include <malloc.h>#include <stdlib.h>typedef struct FreeLink/定义自由链struct FreeLink *prior;char name;int start;int size;bool flag;struct FreeLink *next;* ptr,*head;head top;ptr p;void print()/将内存分配情况打印到屏幕上p=top;cout<<"*内存分配情况表*"<<endl;cout<<"区号tt"<<"起始位置t"<<"区间长度t"<<"区间状态t"<<endl;docout<<p->name<<"tt"<<p->start<<"tt"<<p->size<<"tt"if(p->flag=false)cout<<"空闲"<<endl;elsecout<<"已占用"<<endl;p=p->next;while(p!=NULL);void clear()/结束操作时清空“内存”以备其他操作dop=top;top=top->next;free(p);while(top!=NULL);void asc(ptr &p)/最佳适应法的内存分配函数int min;ptr op;FreeLink *fl=(FreeLink *)malloc(sizeof(FreeLink);cout<<"请输入要分配内存的进程名"<<endl;cin>>fl->name;cout<<"请输入要分配内存的大小"<<endl;cin>>fl->size;min=256;fl->flag=true;doif(p->flag=false&&p->size<=min&&p->size>=fl->size)min=p->size;op=p;p=p->next;while(p!=NULL);if(op->size>fl->size) fl->start=op->start; op->start=fl->start+fl->size; op->size=op->size-fl->size; fl->next=op; fl->prior=op->prior; op->prior->next=fl; op->prior=fl; goto flag1;if(op->size=fl->size) op->flag=fl->flag; op->name=fl->name; free(fl); goto flag1;cout<<"内存过小,分配失败!"<<endl;goto flag2;flag1: cout<<"分配成功!"<<endl;flag2: ;void dec(ptr &p)/最坏适应法的内存分配函数int max;ptr op;FreeLink *fl=(FreeLink *)malloc(sizeof(FreeLink);cout<<"请输入要分配内存的进程名"<<endl;cin>>fl->name;cout<<"请输入要分配内存的大小"<<endl;cin>>fl->size;max=fl->size;fl->flag=true;doif(p->flag=false&&p->size>=max)max=p->size;op=p;p=p->next;while(p!=NULL);if(op->size>fl->size) fl->start=op->start; op->start=fl->start+fl->size; op->size=op->size-fl->size; fl->next=op; fl->prior=op->prior; op->prior->next=fl; op->prior=fl; goto flag3;if(op->size=fl->size) op->flag=fl->flag; op->name=fl->name; free(fl); goto flag3;cout<<"内存过小,分配失败!"<<endl;goto flag4;flag3: cout<<"分配成功!"<<endl;flag4: ;void splice(ptr &p)/若被操作的内存有相邻空闲区则将空闲区拼接合并int x;if(p->prior->flag=false&&p->next->flag=false)x=1;if(p->prior->flag=false&&p->next->flag=true)|(p->prior->flag=false&&p->next=NULL)x=2;if(p->prior->flag=true&&p->next->flag=false)|(p->prior=NULL&&p->next->flag=false)x=3;if(p->prior->flag=true&&p->next->flag=true)|(p->prior=NULL&&p->next->flag=true)|(p->prior->flag=true&&p->next=NULL)x=4; switch(x)case 1:p->next->prior=p->prior; p->prior->next=p->next; p->prior->size=p->prior->size+p->size+p->next->size; p->prior->next=p->next->next; if(p->next->next!=NULL)p->next->next->prior=p->next->prior; free(p->next); free(p); break; case 2:if(p->next=NULL) p->prior->next=p->next; else p->next->prior=p->prior; p->prior->next=p->next; p->prior->size=p->prior->size+p->size; free(p); break;case 3:if(p->prior=NULL) top=p->next; p->next->prior=NULL; p->next->start=p->start; p->next->size=p->next->size+p->size; else p->next->prior=p->prior; p->prior->next=p->next;p->next->start=p->start; p->next->size=p->next->size+p->size; free(p); break;case 4:p->name='' p->flag=false; break;void allocate(ptr &p)/最先适应法的内存分配函数FreeLink *fl=(FreeLink *)malloc(sizeof(FreeLink);cout<<"请输入要分配内存的进程名"<<endl;cin>>fl->name;cout<<"请输入要分配内存的大小"<<endl;cin>>fl->size;fl->flag=true;doif(p->flag=false&&p->size>fl->size) fl->start=p->start; p->start=fl->start+fl->size; p->size=p->size-fl->size; fl->next=p; fl->prior=p->prior; p->prior->next=fl; p->prior=fl; goto a;if(p->flag=false&&p->size=fl->size) p->flag=fl->flag; p->name=fl->name; free(fl); goto a;p=p->next;while(p!=NULL);cout<<"内存过小,分配失败!"<<endl;goto b;a: cout<<"分配成功!"<<endl;b: ;void recover(ptr &p)/内存回收函数char n = ' 'cout<<"请输入要回收的内存对应的进程名"cin>>n;do if(p->flag=true&&p->name=n)splice(p); goto c; p=p->next;while(p!=NULL);cout<<"内存并未分配给对应进程,回收失败!"<<endl;goto d;c: cout<<"内存回收成功!"<<endl;d: ;int ffa()/最先适应法char choice=' 'print();ptr pcb=(FreeLink *)malloc(sizeof(FreeLink);pcb->next=top;pcb->prior=top->prior; top->prior=pcb;pcb->start=top->start;cout<<"请输入要为系统分配的内存块名"<<endl;cin>>pcb->name;cout<<"请输入要分配内存的大小"<<endl; goto f;e:cout<<"超过内存最大容量请重新输入要分配内存的大小"<<endl;f:cin>>pcb->size;if(pcb->size>256) goto e;top->size=top->size-pcb->size;top=pcb;top->flag=true;top->next->start+=top->size;print();while(true)dop=top->next;cout<<"请从下列选项中进行选择"<<endl;cout<<"1.分配内存"<<endl;cout<<"2.回收内存"<<endl;cout<<"3.结束操作"<<endl;cout<<"请输入你的选择"cin>>choice;while(choice!='1'&&choice!='2'&&choice!='3');switch(choice)case '1':allocate(p);print();break;case '2':recover(p);print();break;case '3':clear();return 0;break;int bfa()/最佳适应法char choice=' 'print();ptr pcb=(FreeLink *)malloc(sizeof(FreeLink);pcb->next=top;pcb->prior=top->prior; top->prior=pcb;pcb->start=top->start;cout<<"请输入要为系统分配的内存块名"<<endl;cin>>pcb->name;cout<<"请输入要分配内存的大小"<<endl; goto h;g:cout<<"超过内存最大容量请重新输入要分配内存的大小"<<endl;h:cin>>pcb->size;if(pcb->size>256) goto g;top->size=top->size-pcb->size;top=pcb;top->flag=true;top->next->start+=top->size;print();while(true)dop=top->next;cout<<"请从下列选项中进行选择"<<endl;cout<<"1.分配内存"<<endl;cout<<"2.回收内存"<<endl;cout<<"3.结束操作"<<endl;cout<<"请输入你的选择"cin>>choice;while(choice!='1'&&choice!='2'&&choice!='3');switch(choice)case '1':asc(p);print();break;case '2':recover(p);print();break;case '3':clear();return 0;break;int wfa()/最坏适应法char choice=' 'print();ptr pcb=(FreeLink *)malloc(sizeof(FreeLink);pcb->next=top;pcb->prior=top->prior; top->prior=pcb;pcb->start=top->start;cout<<"请输入要为系统分配的内存块名"<<endl;cin>>pcb->name;cout<<"请输入要分配内存的大小"<<endl; goto j;i:cout<<"超过内存最大容量请重新输入要分配内存的大小"<<endl;j:cin>>pcb->size;if(pcb->size>256) goto i;top->size=top->size-pcb->size;top=pcb;top->flag=true;top->next->start+=top->size;print();while(true)dop=top->next;cout<<"请从下列选项中进行选择"<<endl;cout<<"1.分配内存"<<endl;cout<<"2.回收内存"<<endl;cout<<"3.结束操作"<<endl;cout<<"请输入你的选择"cin>>choice;while(choice!='1'&&choice!='2'&&choice!='3');switch(choice)case '1':dec(p);print();break;case '2':recover(p);print();break;case '3':clear();return 0;break;int main()/主函数char choice = ' ' ptr free=(FreeLink *)malloc(sizeof(FreeLink); top=free; top->name='' top->start=0; top->size=256;top->flag=false; top->prior=NULL; top->next=NULL;cout<<"*Memory allocation and recovery algorithm*"<<endl;cout<<"*存储器的分配与回收算法*"<<endl;while(true)docout<<"请从下列选项中进行选择"<<endl;cout<<"1.最先适应算法"<<endl;cout<<"2.最优适应算法"<<endl;cout<<"3.最坏适应算法"<<endl;cout<<"4.退出"<<endl;cout<<"请输入你的选择"cin>>choice;while(choice!='1'&&choice!='2'&&choice!='3'&&choice!='4');switch(choice)case '1':ffa();break;case '2':bfa();break;case '3':wfa();break;case '4':return 0;break;四、实 验 结 果最先适应法最佳适应法最坏适应法五实验总结知道了存储器的分配与回收算法实现方法,采用最先适应法、最佳适应法、最坏适应法分配主存空间。当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。最后感谢李老师的指导。专心-专注-专业