武汉理工大学《操作系统》课程设计说明书1学号:0120910340228课程设计题目模拟设计页式存储管理的分配与回收学院计算机科学与技术专业计算机科学与技术班级XX姓名XX指导教师XXX2011年01月09日武汉理工大学《操作系统》课程设计说明书2课程设计任务书学生姓名:XX专业班级:计算机0902班指导教师:XXX工作单位:计算机科学与技术学院题目:模拟设计页式存储管理的分配与回收初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会页式管理内存的分配和回收过程。2.实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.采用页式管理方案实施内存分配和回收。能够处理以下的情形⑴能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。⑵要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收,撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日武汉理工大学《操作系统》课程设计说明书3模拟设计页式存储管理的分配与回收1需求分析页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。基本原理是将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面(pageframe),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。图1页的划分图2基本页表示例武汉理工大学《操作系统》课程设计说明书4静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以及页表来完成内存的分配工作。页表指的是内存中的一块固定存储区。页式管理时每个进程至少有一个页表。请求表指的是用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置;另外整个系统有一个存储页面表,其描述了物理内存空间的分配使用状况。图3请求表的示例存储页面表有两种构成方法:1、位示图法2、空闲页面链表法模拟设计页式存储管理的分配与回收要求能够满足如下的要求:(1)输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。(2)要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。武汉理工大学《操作系统》课程设计说明书52功能设计2.1算法分析首先,请求表给出进程或作业要求的页面数。然后,由存储页面表检查是否有足够的空闲页面,如果没有,则本次无法分配。如果有则首先分配设置页表,并请求表中的相应表项后,按一定的查找算法搜索出所要求的空闲页面,并将对应的页好填入页表中。图4分配页面的算法流程武汉理工大学《操作系统》课程设计说明书62.2数据结构页式管理把内存空间按页的大小划分成片或者页面,再按照一定的规律建立起页表,并通过请求表将分配内容显示出来.将页表和请求表的内容使用结构体来定义是比较方便的.//页表项结构typedefstruct_pagetableitem{pageidpagenum;//页号blockidblocknum;//块号}pgtabitem;//页表typedefpgtabitem*pagetable;//请求表结构typedefstruct_reqtable{unsignedpid;//进程号unsignedreqpagenum;//请求页面数pagetablepgtabadr;//页表始址boolstate;//状态}reqtabitem;请求表还引入了支持快速插入和删除的list顺序容器来进行相关操作.listreqtabitemreqtable武汉理工大学《操作系统》课程设计说明书7因为模拟设计的关系,页面的起始地址均应该为随机的数值,所以程序在设计过程中加入了随机数类的编写.classRandomNumber{private:unsignedlongrandseed;public:RandomNumber(unsignedlongs=0);unsignedshortRandom(unsignedlongn);doublefRandom(void);};采用当前系统的时间值来生成伪随机数分配地址.定义随机数产生器:RandomNumberrandom定义内存页面数:intpagenum定义页面大小:intpagesize定义进程个数:intpnum用整数数组模拟分配的内存页面数int*mempage=newint[pagenum]2.3模块说明2.3.1主函数主函数依次运行了程序中所实现的关键函数.intmain(){InitSys();//初始化系统MainChoice();//输出系统菜单Destroy();//释放申请的动态内存return0;}武汉理工大学《操作系统》课程设计说明书82.3.2各个功能函数初始化内存页面:voidInit_Mempage(void)获取内存使用情况:intGet_Mempagenum(void)初始化默认的请求表:voidInit_Reqtable(void)为默认的进程分配内存:voidInit_DistMem(void)手动创建进程,并分配内存:voidDist_Mem(void)释放申请的动态内存:voidDestroy(void)结束指定进程:voidKill(void)2.3.3打印函数打印出进程请求表:voidPrintReqtable(void)打印出页表:voidPrintPageTable(void)打印出内存使用情况:voidPrintMem(void)打印出物理块的大小:voidPrintBlockSize(void)2.3.4其他函数初始化系统:voidInitSys(void)输出主菜单:voidMainMenu(void)选择运行分支:voidMainChoice()武汉理工大学《操作系统》课程设计说明书93开发平台3.1开发平台(1)使用系统:Windows7(2)使用语言:C++(3)开发工具:VisualC++20084测试用例,运行结果与运行情况分析4.1测试方法通过输入正常数据以及非正常数据对程序进行全方位测试4.2测试结果(1)程序主界面(2)输入进程号和页面数:武汉理工大学《操作系统》课程设计说明书10(3)显示进程页表:(4)显示请求表武汉理工大学《操作系统》课程设计说明书11(5)显示内存使用情况以及物理块大小(6)错误检验武汉理工大学《操作系统》课程设计说明书12武汉理工大学《操作系统》课程设计说明书135源程序的主要部分#includeiostream#includecstdlib#includeiomanip#includelist#includepage.h#includeRandom.husingnamespacestd;listreqtabitemreqtable;RandomNumberrandom;//随机数产生器unsignedpagenum=random.Random(80)+21;//内存页面数21-100unsignedpagesize=random.Random(16)+5;//页面大小5-20unsignedpnum=random.Random(4)+5;//进程的个数5-8int*mempage=newint[pagenum];//用整数数组模拟内存页面数/*初始化内存页面*/voidInit_Mempage(void){inti=0;for(i=0;iint(pagenum);i++)mempage[i]=0;//数组全部赋初值}/*获取内存的使用情况*/intGet_Mempagenum(void){intsum=0;for(inti=0;iint(pagenum);i++)if(mempage[i]==0)sum++;returnsum;//判断有多少内存页面已经被使用}/*初始化默认的请求表*/voidInit_Reqtable(void){inti;for(i=1;i=int(pnum);i++){reqtabitempreq;preq.pid=i;preq.reqpagenum=random.Random(4)+2;//进程请求的页面大小-5preq.state=false;preq.pgtabadr=NULL;reqtable.push_back(preq);//依次压入容器}}武汉理工大学《操作系统》课程设计说明书14/*为默认的进程分配内存*/voidInit_DistMem(void){intreqpnum;//进程请求页面数inti;listreqtabitem::iteratorpos=reqtable.begin();for(;pos!=reqtable.end();pos++){reqpnum=(*pos).reqpagenum;if(reqpnumint(Get_Mempagenum()))//判断请求的内存页面数目是否大于剩余的{cout没有足够的内存!endl;coutendl;}else{(*pos).state=true;pagetabletemp=newpgtabitem[reqpnum];//新建临时页表项数组if(temp==NULL){cout内存分配失败!endl;exit(0);}(*pos).pgtabadr=temp;for(i=0;ireqpnum;i++){temp[i].pagenum=i;//页表的页号intrandnum=random.Random(pagenum)+1;//随机产生一个块号while(mempage[randnum]==1)randnum=random.Random(pagenum)+1;temp[i].blocknum=randnum;//页表的块号mempage[randnum]=1;}}}}/*手动创建进程,并分配内存*/voidDist_Mem(void){inti;reqtabitempreq;//新创建进程记录intpid;//进程号intreqpnum;//请求页面数boolflag=false;do{cout请输入进程号:;flag=false;cinpid;for(listreqtabitem::iteratorpos=reqtable.begin();pos!=reqtable.end();pos++){if((*pos).pid==pid)武汉理工大学《操作系统》课程设计说明书15{flag=true;cout该进程号已经存在,请重新输入endl;coutendl;break;}}}while(flag==true);//循环直到输入的Pid满足条件preq.pid=pid;cout请输入需要的页面数:;cinreqpnum;preq.reqpagenum=reqpnum;preq.state=false;preq.pgtabadr=NULL;reqpnum=preq.reqpag