《操作系统-存储器的分配与回收算法实现(共20页).doc》由会员分享,可在线阅读,更多相关《操作系统-存储器的分配与回收算法实现(共20页).doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上操作系统实验报告存储器的分配与回收算法实现姓 名: 学 号: 班 级: 09计算机1 一、实验名称及要求1、实验名称:存储器的分配与回收算法实现2、实验要求: 学生应正确地设计有关的数据结构与各个功能模块,画出程序的流程图,编写程序,程序执行结果应正确。3、实验方式: 学生通过实验室的微机上机,实际调试程序。4、实验环境: Windows操作系统环境下的个人微机 或程序设计语言二、实验内容1 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。2 采用最先适应法、最佳适应法、最坏适应法分配主存空间。3 当一个新作业要
2、求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。5 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。三、实验程序#include #include #include typedef struct FreeLink/定义自由链struct FreeLink *prior;char name;int start;int size;bool flag;struct FreeLink *n
3、ext;* ptr,*head;head top;ptr p;void print()/将内存分配情况打印到屏幕上p=top;cout*内存分配情况表*endl;cout区号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;pt
4、r op;FreeLink *fl=(FreeLink *)malloc(sizeof(FreeLink);cout请输入要分配内存的进程名fl-name;cout请输入要分配内存的大小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;
5、 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请输入要分配内
6、存的进程名fl-name;cout请输入要分配内存的大小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-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-s
7、ize=fl-size) op-flag=fl-flag; op-name=fl-name; free(fl); goto flag3;cout内存过小,分配失败!endl;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
8、)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
9、(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-prio
10、r; 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请输入要分配内存的进程名fl-name;cout请输入要分配内存的大小fl-size;fl-flag=true;doif(p-flag=false&p-sizefl-si
11、ze) 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
12、(ptr &p)/内存回收函数char n = ;coutn;do if(p-flag=true&p-name=n)splice(p); goto c; p=p-next;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-si
13、ze;if(pcb-size256) 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;cout1.分配内存endl;cout2.回收内存endl;cout3.结束操作endl;coutchoice;while(choice!=1&choice!=2&choice!=3);switch(choice)case 1:allocate(p);print();break;case 2:r
14、ecover(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请输入要为系统分配的内存块名pcb-name;cout请输入要分配内存的大小endl; goto h;g:cout超过内存最大容量请重新输入要分配内存的大小pcb-size;if(pcb
15、-size256) 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;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);prin
16、t();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请输入要为系统分配的内存块名pcb-name;cout请输入要分配内存的大小endl; goto j;i:cout超过内存最大容量请重新输入要分配内存的大小pcb-size;if(pcb-size256) goto
17、 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;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
18、 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
19、;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;四、实 验 结 果最先适应法最佳适应法最坏适应法五实验总结知道了存储器的分配与回收算法实现方法,采用最先适应法、最佳适应法、最坏适应法分配主存空间。当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。最后感谢李老师的指导。专心-专注-专业