《实验2:存储器的分配与回收.doc》由会员分享,可在线阅读,更多相关《实验2:存储器的分配与回收.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验报告学院(系)名称:计算机与通信工程学院姓名张君卓学号20135612专业计算机科学与技术班级2013级1班实验项目实验二:存储器的分配与回收算法实现课程名称操作系统课程代码0668036实验时间2015 年11月13日 第5、6节2011 年12月1 日 第3、4节2011 年12月5 日 第7、8节实验地点软件实验室7-216软件实验室7-219软件实验室7-215批改意见成绩教师签字: 实验内容:1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。3. 当一个新作业要求装入主存
2、时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。实验要求:1 详细描述实验设计思想、程序结构及各模块设计思路;2 详细描述程序所用数据结构及算法;3 明确给出测试用例和实验结果;4 为增加程序可读性,在程序中进行适当注释说明;5 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6 实验报告撰写要求结构清晰、描述准确逻辑性强;
3、7 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】#include #include #include using namespace std;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;cou
4、t区号tt起始位置t区间长度t区间状态tendl;docoutnamettstartttsizeflag=false)cout空闲endl;elsecout已占用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请输入要分配内存的进程名fl-name;cout请输
5、入要分配内存的大小fl-size;min=256;fl-flag=true;doif(p-flag=false&p-sizesize=fl-size)min=p-size;op=p;p=p-next;while(p!=NULL);if(op-sizefl-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
6、-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请输入要分配内存的进程名fl-name;cout请输入要分配内存的大小fl-size;max=fl-size;fl-flag=true;doif(p-flag=false&p-siz
7、e=max)max=p-size;op=p;p=p-next;while(p!=NULL);if(op-sizefl-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内存过小,分配失败!en
8、dl;goto flag4;flag3: cout分配成功!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
9、-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-pr
10、ior=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)
11、; break;case 4:p-name=; p-flag=false; break; void allocate(ptr &p)/最先适应法的内存分配函数FreeLink *fl=(FreeLink *)malloc(sizeof(FreeLink);cout请输入要分配内存的进程名fl-name;cout请输入要分配内存的大小fl-size;fl-flag=true;doif(p-flag=false&p-sizefl-size) fl-start=p-start; p-start=fl-start+fl-size; p-size=p-size-fl-size; fl-next=p; f
12、l-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 = ;coutn;do if(p-flag=true&p-name=n)splice(p); goto c; p=p-n
13、ext;while(p!=NULL);cout内存并未分配给对应进程,回收失败!endl;goto d;c: cout内存回收成功!next=top;pcb-prior=top-prior; top-prior=pcb;pcb-start=top-start;cout请输入要为系统分配的内存块名pcb-name;cout请输入要分配内存的大小endl; goto f;e:cout超过内存最大容量请重新输入要分配内存的大小pcb-size;if(pcb-size256) goto e;top-size=top-size-pcb-size;top=pcb;top-flag=true;top-nex
14、t-start+=top-size;print();while(true)dop=top-next;cout请从下列选项中进行选择endl;cout1.分配内存endl;cout2.回收内存endl;cout3.结束操作endl;coutchoice;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=
15、;print();ptr pcb=(FreeLink *)malloc(sizeof(FreeLink);pcb-next=top;pcb-prior=top-prior; top-prior=pcb;pcb-start=top-start;cout请输入要为系统分配的内存块名pcb-name;cout请输入要分配内存的大小endl; goto h;g:cout超过内存最大容量请重新输入要分配内存的大小pcb-size;if(pcb-size256) goto g;top-size=top-size-pcb-size;top=pcb;top-flag=true;top-next-start+=
16、top-size;print();while(true)dop=top-next;cout请从下列选项中进行选择endl;cout1.分配内存endl;cout2.回收内存endl;cout3.结束操作endl;coutchoice;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 p
17、cb=(FreeLink *)malloc(sizeof(FreeLink);pcb-next=top;pcb-prior=top-prior; top-prior=pcb;pcb-start=top-start;cout请输入要为系统分配的内存块名pcb-name;cout请输入要分配内存的大小endl; goto j;i:cout超过内存最大容量请重新输入要分配内存的大小pcb-size;if(pcb-size256) goto i;top-size=top-size-pcb-size;top=pcb;top-flag=true;top-next-start+=top-size;print
18、();while(true)dop=top-next;cout请从下列选项中进行选择endl;cout1.分配内存endl;cout2.回收内存endl;cout3.结束操作endl;coutchoice;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 *)mallo
19、c(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;cout1.最先适应算法endl;cout2.最优适应算法endl;cout3.最坏适应算法endl;cout4.退出endl;coutchoice;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;截图:最先适应法 1. 最佳适应法2. 最差适应法总结:通过这次实验,加深了对内存分配的理解和应用,也发现自己对课程的掌握不太牢固,课后应进行仔细的复习,加深印象。对某些算法的理解不太透彻,应该巩固完善。