




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./__0120910340228课程设计题目模拟设计页式存储管理的分配与回收学院计算机科学与技术专业计算机科学与技术班级XX姓名XX指导教师XXX2011年01月09日课程设计任务书学生__XX专业__计算机0902班指导XXX工作单位:计算机科学与技术学院题目:模拟设计页式存储管理的分配与回收初始条件:1.预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念,并体会页式管理内存的分配和回收过程。2.实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:〔包括课程设计工作量与其技术要求,以与说明书撰写等具体要求〕1.采用页式管理方案实施内存分配和回收。能够处理以下的情形⑴能够输入给定的内存页面数,页面大小,进程的个数与每个进程的页数。⑵要求当某进程提出申请空间的大小后,显示能否满足申请,以与为该进程分配资源后内存空间的使用情况〔被进程占用的页面,空闲的页面〕。2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明<功能与框图>;⑶源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:=1\*romani〕你认为你完成的设计哪些地方做得比较好或比较出色;=2\*romanii〕什么地方做得不太好,以后如何改正;=3\*romaniii〕从本设计得到的收获〔在编写,调试,执行过程中的经验和教训〕;=4\*romaniv〕完成本题是否有其他的其他方法〔如果有,简要说明该方法〕;=5\*romanv〕对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周1、周2:完成程序分析与设计。周2、周3:完成程序调试与测试。周4、周5:验收,撰写课程设计报告。〔注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记〕指导教师签名:年月日系主任〔或责任教师〕签名:年月日模拟设计页式存储管理的分配与回收1需求分析页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。基本原理是将各进程的虚拟空间划分成若干个长度相等的页<page>,页式管理把内存空间按页的大小划分成片或者页面〔pageframe〕,然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。图1页的划分图2基本页表示例静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以与页表来完成内存的分配工作。页表指的是内存中的一块固定存储区。页式管理时每个进程至少有一个页表。请求表指的是用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置;另外整个系统有一个存储页面表,其描述了物理内存空间的分配使用状况。图3请求表的示例存储页面表有两种构成方法:1、位示图法2、空闲页面链表法模拟设计页式存储管理的分配与回收要求能够满足如下的要求:输入给定的内存页面数,页面大小,进程的个数与每个进程的页数。要求当某进程提出申请空间的大小后,显示能否满足申请,以与为该进程分配资源后内存空间的使用情况〔被进程占用的页面,空闲的页面〕。2功能设计2.1算法分析首先,请求表给出进程或作业要求的页面数。然后,由存储页面表检查是否有足够的空闲页面,如果没有,则本次无法分配。如果有则首先分配设置页表,并请求表中的相应表项后,按一定的查找算法搜索出所要求的空闲页面,并将对应的页好填入页表中。图4分配页面的算法流程2.2数据结构页式管理把内存空间按页的大小划分成片或者页面,再按照一定的规律建立起页表,并通过请求表将分配内容显示出来.将页表和请求表的内容使用结构体来定义是比较方便的.//页表项结构typedefstruct_pagetableitem{ pageidpagenum; //页号 blockidblocknum; //块号}pgtabitem; //页表typedefpgtabitem*pagetable;//请求表结构typedefstruct_reqtable{ unsignedpid; //进程号 unsignedreqpagenum; //请求页面数 pagetablepgtabadr;//页表始址 boolstate; //状态}reqtabitem;请求表还引入了支持快速插入和删除的list顺序容器来进行相关操作.list<reqtabitem>reqtable因为模拟设计的关系,页面的起始地址均应该为随机的数值,所以程序在设计过程中加入了随机数类的编写.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;}2.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<>3开发平台3.1开发平台使用系统:Windows7使用语言:C++开发工具:VisualC++20084测试用例,运行结果与运行情况分析4.1测试方法通过输入正常数据以与非正常数据对程序进行全方位测试4.2测试结果<1>程序主界面<2>输入进程号和页面数:<3>显示进程页表:<4>显示请求表<5>显示内存使用情况以与物理块大小<6>错误检验5源程序的主要部分#include<iostream>#include<cstdlib>#include<iomanip>#include<list>#include"page.h"#include"Random.h"usingnamespacestd;list<reqtabitem>reqtable;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;i<int<pagenum>;i++> mempage[i]=0; //数组全部赋初值}/*获取内存的使用情况*/intGet_Mempagenum<void>{ intsum=0; for<inti=0;i<int<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;//进程请求的页面大小-5 preq.state=false; preq.pgtabadr=NULL; reqtable.push_back<preq>; //依次压入容器 }}/*为默认的进程分配内存*/voidInit_DistMem<void>{ intreqpnum; //进程请求页面数 inti; list<reqtabitem>::iteratorpos=reqtable.begin<>; for<;pos!=reqtable.end<>;pos++> { reqpnum=<*pos>.reqpagenum; if<reqpnum>int<Get_Mempagenum<>>> //判断请求的内存页面数目是否大于剩余的 { cout<<"没有足够的内存!"<<endl; cout<<endl; } else { <*pos>.state=true; pagetabletemp=newpgtabitem[reqpnum];//新建临时页表项数组 if<temp==NULL> { cout<<"内存分配失败!"<<endl; exit<0>; } <*pos>.pgtabadr=temp; for<i=0;i<reqpnum;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; cin>>pid; for<list<reqtabitem>::iteratorpos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.pid==pid> { flag=true; cout<<"该进程号已经存在,请重新输入"<<endl; cout<<endl; break; } } }while<flag==true>;//循环直到输入的Pid满足条件 preq.pid=pid; cout<<"请输入需要的页面数:"; cin>>reqpnum; preq.reqpagenum=reqpnum; preq.state=false; preq.pgtabadr=NULL; reqpnum=preq.reqpagenum; if<reqpnum>Get_Mempagenum<>> { cout<<"没有足够的内存,进程创建失败!"<<endl; cout<<endl; } else { preq.state=true; pagetabletemp=newpgtabitem[reqpnum]; if<temp==NULL> { cout<<"内存分配失败!"<<endl; exit<0>; } preq.pgtabadr=temp; for<i=0;i<int<reqpnum>;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; } } reqtable.push_back<preq>; //将该进程的记录加入请求表}/*程序结束时,释放申请的动态内存*/voidDestroy<void>{ list<reqtabitem>::iteratorpos=reqtable.begin<>; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.state==true> delete[]<*pos>.pgtabadr; } reqtable.clear<>;}/*打印出进程请求表*/voidPrintReqtable<void>{ cout<<endl; cout<<"||"<<endl; cout<<"|进程请求表|"<<endl; cout<<"||"<<endl; cout<<"|"<<setw<8><<"进程号" <<setw<16><<"请求页面数" <<setw<16><<"页表起始地址" <<setw<16><<"页表长度" <<setw<16><<"状态|"<<endl; cout<<"||"<<endl; list<reqtabitem>::iteratorpos=reqtable.begin<>; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { cout<<"|"<<setw<8><<<*pos>.pid <<setw<16><<<*pos>.reqpagenum <<setw<16><<<*pos>.pgtabadr <<setw<16><<<<*pos>.reqpagenum>*pagesize; if<<*pos>.state> cout<<setw<4><<"已分配|"<<endl; else cout<<setw<4><<"未分配|"<<endl; if<<*pos>.pid!=reqtable.back<>.pid> cout<<"||"<<endl; else cout<<"||"<<endl; }}/*打印页表*/voidPrintPageTable<void>{ unsignedpid; inti; boolflag=false; cout<<"请输入进程号:"; cin>>pid; list<reqtabitem>::iteratorpos=reqtable.begin<>; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.pid==pid&&<*pos>.state==true> { flag=true; cout<<"||"<<endl; cout<<"|此进程的页表|"<<endl; cout<<"||"<<endl; cout<<"|"<<setw<16><<"页号" <<setw<6><<"块号|"<<endl; cout<<"||"<<endl; intreqpagenum=<*pos>.reqpagenum; for<i=0;i<reqpagenum;i++> { cout<<"|"<<setw<16><<<*pos>.pgtabadr[i].pagenum <<setw<6><<<*pos>.pgtabadr[i].blocknum<<"|"<<endl; if<i!=reqpagenum-1> cout<<"||"<<endl; else cout<<"||"<<endl; } } } if<flag==false> cout<<"系统中不存在该进程或者该进程还没有被分配内存!\n"; cout<<endl;}voidPrintMem<void>{ cout<<"内存总块数为"<<pagenum<<",已经使用了"<<pagenum-Get_Mempagenum<><<"块!"<<endl; cout<<"现在还有"<<Get_Mempagenum<><<"块内存区域空闲!"<<endl; cout<<endl;}voidPrintBlockSize<void>{ cout<<"物理块大小为:"<<pagesize<<"KB"<<endl; cout<<endl;}/*结束指定进程*/voidKill<void>{ boolflag; inti; reqtabitemtemp; list<reqtabitem>::iteratorpos=reqtable.begin<>; intpid; do{ cout<<"请输入进程号:"; flag=false; cin>>pid; for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.pid==pid> { flag=true; temp=*pos; break; } } if<flag==false> cout<<"系统中不存在该进程!"<<endl; cout<<endl; }while<flag==false>; for<i=0;i<int<temp.reqpagenum>;i++> mempage[temp.pgtabadr[i].blocknum]=0; reqtable.remove<temp>; //重新为没有分配到内存的进程分配内存 for<pos=reqtable.begin<>;pos!=reqtable.end<>;pos++> { if<<*pos>.state==false> { intreqpnum; reqpnum=<*pos>.reqpagenum; if<reqpnum<=Get_Mempagenum<>> { <*pos>.state=true; pagetabletemp=newpgtabitem[reqpnum]; if<temp==NULL> { cout<<"内存分配失败!"<<endl; cout<<endl; exit<0>; } <*pos>.pgtabadr=temp; for<i=0;i<int<reqpnum>;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; } } } }}/*初始化系统*/voidInitSys<void>{ cout.setf<ios::left>;//左对齐 Init_Mempage<>; Init_Reqtable<>; Init_DistMem<>;}/*输出主菜单*/voidMainMenu<void>{ cout<<"页式存储管理的分配与回收"<<endl; cout<<"1.手动创建进程"<<endl; cout<<"2.显示进程页表"<<endl; cout<<"3.显示请求表"<<endl; cout<<"4.撤销进程"<<endl; cout<<"5.显示内存使用情况"<<endl; cout<<"6.显示物理块大小"<<endl; cout<<"7.退出系统"<<endl; cout<<"请输入您的选择<0--7>:";}/*选择函数*/voidMainChoice<>{ intchoice; do{ MainMenu<>; cin>>choice; switch<choice> { case1: Dist_Mem<>; break; case2: PrintPageTable<>; break; case3: PrintReqtable<>; break; case4: Kill<>; break; case5: PrintMem<>; break; case6: PrintBlockSize<>; break; case7: break; default:cout<<"输入有误,请重新输入.\n"; co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业废水处理与节能减排
- 工业机器人技术在智能制造中的运用
- 工业废水处理技术及实践案例分析
- 工业机器人与智能材料的融合应用
- 工业机器人与机器学习的融合应用
- 工业自动化系统设计与管理探讨
- ai企业管理制度
- 标准仓库入仓管理制度
- 校内公务接待管理制度
- 校区物品安全管理制度
- 《螺栓连接多层全装配式混凝土墙板结构技术规程》
- 【MOOC】《电工技术》(北京科技大学)中国大学MOOC慕课答案
- 输血科内部审核检查表
- 《绿色低碳铝评价导则及追溯指南》T CNIA 0245-2024
- 食品标准操作规程
- 浙江省杭州市2023-2024学年高一下学期期末教学质量检测政治试题
- 电网工程劳务分包投标方案(技术方案)
- 国开(山东)2024年《小学生心理健康教育》形考1-3终考答案
- 《积极心理学(第3版)》 课件 第10章 感恩
- 人工智能营销(第2版)课件全套 阳翼 第1-8章 迈入人工智能领域-人工智能营销的伦理与法律问题
- 人音版四下第5课 陕北绿了百姓笑了
评论
0/150
提交评论