版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、_学号:课程设计模拟设计页式存储管理题目的分配与回收学院计算机科学与技术专业班级姓名指导教师吴利军精品资料_2013年01月09日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目:模拟设计页式存储管理的分配与回收初始条件:1预备内容:阅读操作系统的内存管理章节内容,理解有关虚拟存储器、页式存储管理等概念,掌握页式管理内存的分配和回收过程。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务 : (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1采用页式管理方案实施内存分配和回收。能够处理以下的情形 能够输入给定的内存页面数,页面大小,进程的个数及每
2、个进程的页数。 当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面); 当某进程撤消时,显示内存回收后内存空间的使用情况。2设计报告内容应说明: 需求分析; 功能设计(数据结构及模块说明); 开发平台及源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:i )你认为你完成的设计哪些地方做得比较好或比较出色;ii )什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv )完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周 2
3、:完成程序分析及设计。周 2、周 3:完成程序调试及测试。精品资料_周 4、周 5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,一律按0 分记)指导教师签名:年月日系主任(或责任教师)签名:年月日模拟设计页式存储管理的分配与回收1 需求分析页式管理是一种内存空间存储管理的技术, 页式管理分为静态页式管理和动态页式管理。基本原理是将各进程的虚拟空间划分成若干个长度相等的页, 页式管理把内存空间按页的大小划分成片或者页面, 然后把页式虚拟地址与内存地址建立一一对应页表, 并用相应的硬件地址变换机构, 来解决离散地址变换问题。 页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理
4、。页号P位移量W图 1 页的划分页号块号图 2基本页表示例精品资料_静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。 系统通过存储页面表、请求表以及页表来完成内存的分配工作。 页表指的是内存中的一块固定存储区。 页式管理时每个进程至少有一个页表。 请求表指的是用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置; 另外整个系统有一个存储页面表,其描述了物理内存空间的分配使用状况。图 3 请求表的示例存储页面表有两种构成方法:1、位示图法2、空闲页面链表法模拟设计页式存储管理的分配与回收要求能够满足如下的要求:(1) 输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。(
5、2) 要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进精品资料_程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。2 功能设计2.1算法分析首先,请求表给出进程或作业要求的页面数。然后,由存储页面表检查是否有足够的空闲页面,如果没有,则本次无法分配。如果有则首先分配设置页表,并请求表中的相应表项后, 按一定的查找算法搜索出所要求的空闲页面,并将对应的页好填入页表中。精品资料_图 4 分配页面的算法流程2.2数据结构页式管理把内存空间按页的大小划分成片或者页面 , 再按照一定的规律建立起页表 , 并通过请求表将分配内容显示出来 . 将页表和请求表的内容使用结构体来定义
6、是比较方便的 ./ 页表项结构typedef struct _pagetableitempageid pagenum;/ 页号blockid blocknum;/ 块号pgtabitem;/ 页表typedef pgtabitem * pagetable;/ 请求表结构typedef struct _reqtableunsigned pid;/ 进程号unsigned reqpagenum; /请求页面数pagetable pgtabadr;/页表始址bool state;/ 状态精品资料_ reqtabitem;请求表还引入了支持快速插入和删除的list顺序容器来进行相关操作.list<
7、;reqtabitem> reqtable因为模拟设计的关系 , 页面的起始地址均应该为随机的数值, 所以程序在设计过程中加入了随机数类的编写.class RandomNumberprivate:unsigned long randseed;public:RandomNumber(unsigned long s=0);unsigned short Random(unsigned long n);double fRandom(void);采用当前系统的时间值来生成伪随机数分配地址.定义随机数产生器 :RandomNumber random定义内存页面数 :int pagenum定义页面大小
8、 :int pagesize定义进程个数 :int pnum用整数数组模拟分配的内存页面数int * mempage=new intpagenum2.3 模块说明主函数主函数依次运行了程序中所实现的关键函数.精品资料_int main()InitSys();/初始化系统MainChoice();/输出系统菜单Destroy();/释放申请的动态内存return 0;各个功能函数初始化内存页面 : void Init_Mempage(void)获取内存使用情况 : int Get_Mempagenum(void)初始化默认的请求表 : void Init_Reqtable(void)为默认的进程
9、分配内存 : void Init_DistMem(void)手动创建进程 , 并分配内存 : void Dist_Mem(void)释放申请的动态内存 : void Destroy(void)结束指定进程 : void Kill(void)打印函数打印出进程请求表 : void PrintReqtable(void)打印出页表 : void PrintPageTable(void)打印出内存使用情况 : void PrintMem(void)打印出物理块的大小 : void PrintBlockSize(void)其他函数初始化系统 : void InitSys(void)输出主菜单 : vo
10、id MainMenu(void)精品资料_选择运行分支 :void MainChoice()3 开发平台3.1 开发平台(1) 使用系统: Windows 7(2) 使用语言: C+(3) 开发工具: Visual C+ 6.04 测试用例,运行结果与运行情况分析4.1 测试方法通过输入正常数据以及非正常数据对程序进行全方位测试4.2 测试结果(1) 程序主界面精品资料_(2) 输入进程号和页面数 :(3) 显示进程页表 :精品资料_(4) 显示请求表(5) 显示内存使用情况以及物理块大小精品资料_(6) 错误检验精品资料_5 源程序的主要部分#include <iostream>
11、;#include <cstdlib>#include <iomanip>#include <list>#include "page.h"#include "Random.h"using namespace std;list<reqtabitem> reqtable;RandomNumber random; / 随机数产生器内存页面数 21-100unsigned pagenum=random.Random(80)+21; /unsigned pagesize=random.Random(16)+5; /页
12、面大小5-20unsigned pnum=random.Random(4)+5;/进程的个数 5-8int * mempage=new intpagenum; /用整数数组模拟内存页面数void Init_Mempage(void)int i=0;for(i=0;i<int(pagenum);i+)mempagei=0;/数组全部赋初值int Get_Mempagenum(void)int sum=0;for(int i=0;i<int(pagenum);i+)if(mempagei=0)sum+;return sum;/判断有多少内存页面已经被使用精品资料_void Init_R
13、eqtable(void)int i;for(i=1;i<=int(pnum);i+)reqtabitem preq;preq.pid=i;preq.reqpagenum=random.Random(4)+2;/ 进程请求的页面大小 -5preq.state=false;preq.pgtabadr=NULL;/ 依次压入容器reqtable.push_back(preq);/* 为默认的进程分配内存 */void Init_DistMem(void)int reqpnum;/ 进程请求页面数int i;list<reqtabitem>:iterator pos=reqtabl
14、e.begin();for(;pos!=reqtable.end();pos+)reqpnum=(*pos).reqpagenum;if(reqpnum>int(Get_Mempagenum() / 判断请求的内存页面数目是否大于剩余的cout<<" 没有足够的内存 !"<<endl;cout<<endl;else(*pos).state=true;pagetable temp = new pgtabitemreqpnum; /新建临时页表项数组if(temp=NULL)cout<<" 内存分配失败 !&quo
15、t;<<endl;exit(0);(*pos).pgtabadr=temp;for(i=0;i<reqpnum;i+)/ 页表的页号tempi.pagenum=i;int randnum=random.Random(pagenum)+1;/随机产生一个块号while(mempagerandnum=1)randnum=random.Random(pagenum)+1;tempi.blocknum=randnum;/页表的块号mempagerandnum=1;精品资料_/* 手动创建进程 , 并分配内存 */void Dist_Mem(void)int i;/ 新创建进程记录re
16、qtabitem preq;int pid;/ 进程号int reqpnum;/ 请求页面数bool flag=false;docout<<" 请输入进程号 :"flag=false;cin>>pid;for(list<reqtabitem>:iteratorpos=reqtable.begin();pos!=reqtable.end();pos+)if(*pos).pid=pid)flag=true;cout<<" 该进程号已经存在 , 请重新输入 "<<endl;cout<<en
17、dl;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<<end
18、l;elsepreq.state=true;pagetable temp = new pgtabitemreqpnum;if(temp=NULL)cout<<" 内存分配失败 !"<<endl;exit(0);preq.pgtabadr=temp;for(i=0;i<int(reqpnum);i+)tempi.pagenum=i;/ 页表的页号int randnum=random.Random(pagenum)+1;/ 随机产生一个块号 while(mempagerandnum=1)randnum=random.Random(pagenum)+
19、1;精品资料_tempi.blocknum=randnum;/页表的块号mempagerandnum=1;/ 将该进程的记录加入请求表reqtable.push_back(preq);/* 程序结束时 , 释放申请的动态内存 */void Destroy(void)list<reqtabitem>:iterator pos=reqtable.begin(); for(pos=reqtable.begin();pos!=reqtable.end();pos+)if(*pos).state=true)delete (*pos).pgtabadr;reqtable.clear();/*打
20、印出进程请求表 */void PrintReqtable(void)cout<<endl;cout<<"|-|"<<endl;cout<<"|进程请求表|"<<endl;cout<<"|-|"<<endl;进程号 "cout<<"|"<<setw(8)<<"<<setw(16)<<"请求页面数 "<<setw(16)<
21、;<"页表起始地址 "<<setw(16)<<"页表长度 "<<setw(16)<<"状态|"<<endl;cout<<"|-|"<<endl;list<reqtabitem>:iterator pos=reqtable.begin(); for(pos=reqtable.begin();pos!=reqtable.end();pos+) cout<<"|"<<setw(
22、8)<<(*pos).pid <<setw(16)<<(*pos).reqpagenum <<setw(16)<<(*pos).pgtabadr <<setw(16)<<(*pos).reqpagenum) * pagesize;if(*pos).state)cout<<setw(4)<<" 已分配|"<<endl;elsecout<<setw(4)<<" 未分配|"<<endl;if(*pos).p
23、id!=reqtable.back().pid)cout<<"|-|"<<endl;else精品资料_cout<<"|-|"<<endl;/* 打印页表 */void PrintPageTable(void)unsigned pid;int i;bool flag=false;cout<<" 请输入进程号 :"cin>>pid;list<reqtabitem>:iterator pos=reqtable.begin(); for(pos=reqtabl
24、e.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)<&l
25、t;" 块号|"<<endl;cout<<"|-|"<<endl;int reqpagenum=(*pos).reqpagenum;for(i=0;i<reqpagenum;i+)cout<<"|"<<setw(16)<<(*pos).pgtabadri.pagenum<<setw(6)<<(*pos).pgtabadri.blocknum<<"|"<<endl;if(i!=reqpagen
26、um-1)|"<<endl;cout<<"|-else|"<<endl;cout<<"|-if(flag=false)cout<<" 系统中不存在该进程或者该进程还没有被分配内存 !n" cout<<endl;void PrintMem(void)cout<<"内存总块数为"<<pagenum<<",已经使用了"<<pagenum-Get_Mempagenum()<<
27、;"块!"<<endl;cout<<" 现在还有 "<<Get_Mempagenum()<<"块内存区域空闲 !"<<endl; cout<<endl;void PrintBlockSize(void)cout<<" 物理块大小为 :"<<pagesize<<"KB"<<endl;cout<<endl;精品资料_/* 结束指定进程 */void Kill(void)
28、bool flag;int i;reqtabitem temp;list<reqtabitem>:iterator pos=reqtable.begin();int pid;docout<<" 请输入进程号 :"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<<" 系统中不存在该进程 !"<
29、;<endl;cout<<endl;while(flag=false);for(i=0;i<int(temp.reqpagenum);i+)mempagetemp.pgtabadri.blocknum=0;reqtable.remove(temp);/ 重新为没有分配到内存的进程分配内存 for(pos=reqtable.begin();pos!=reqtable.end();pos+)if(*pos).state=false)int reqpnum;reqpnum=(*pos).reqpagenum; if(reqpnum<=Get_Mempagenum()(*
30、pos).state=true;pagetable temp = new pgtabitemreqpnum;if(temp=NULL)cout<<" 内存分配失败 !"<<endl;cout<<endl;exit(0);(*pos).pgtabadr=temp;for(i=0;i<int(reqpnum);i+)tempi.pagenum=i;/ 页表的页号int randnum=random.Random(pagenum)+1;/随机产生一个块号while(mempagerandnum=1)randnum=random.Rando
31、m(pagenum)+1;tempi.blocknum=randnum;/页表的块号mempagerandnum=1;精品资料_/* 初始化系统 */void InitSys(void)cout.setf(ios:left);/左对齐Init_Mempage();Init_Reqtable();Init_DistMem();/* 输出主菜单 */void MainMenu(void)cout<<"页式存储管理的分配与回收"<<endl;cout<<"1.手动创建进程 "<<endl;cout<<
32、"2.显示进程页表 "<<endl;cout<<"3.显示请求表 "<<endl;cout<<"4.撤销进程 "<<endl;cout<<"5.显示内存使用情况 "<<endl;cout<<"6.显示物理块大小 "<<endl;cout<<"7.退出系统 "<<endl;cout<<"请输入您的选择 (0-7):"/* 选择函数 */void MainChoice()int choice;doMainMenu();cin>>choice;switch(choice)case 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东深圳市光明区秋硕小学招聘1人笔试备考题库及答案解析
- 2026广东东莞市石碣镇招聘编外聘用人员5人笔试备考试题及答案解析
- 2026四川成都市双流区怡心湖幼儿园招聘6人笔试备考试题及答案解析
- 2026广东东莞市残疾人体育训练中心招聘编外聘用人员1人笔试备考题库及答案解析
- 2026龙南市殡葬服务中心公开招聘会计人员1人笔试备考试题及答案解析
- 2026浙江绍兴杭绍临空示范区开发集团有限公司工作人员招聘23人笔试备考试题及答案解析
- 2026年春季鲁教版(五四学制)小学音乐一年级下册教学计划含进度表
- 4.7.2 免疫与免疫规划 第1课时教学设计(2025-2026学年人教版生物八年级上册)
- 2026福建龙岩市市属中学招聘教师52人笔试备考试题及答案解析
- 2026广东广州市越秀区六榕街道办事处招聘辅助人员2笔试备考题库及答案解析
- 2026届山东省济南市重点中学高三下学期3月综合模拟考试化学试题含解析
- idc数据中心运营制度
- 八年级地理下册《东北地区人口与城市的时空格局》教学设计与实施
- 英语-河南省2028届高一年级TOP二十名校十二月调研考试
- 高考化学2026年模拟试卷必刷题汇编-元素及其化合物(解答大题)
- 5.1《四大地理区域的划分》课件-2025-2026学年湘教版地理八年级下册
- 2025年10月自考00138中国近现代经济史试题及答案
- 俄国边境管理制度
- GB/T 25383-2025风能发电系统风力发电机组风轮叶片
- 办事合同协议书
- 江苏省2024年中职职教高考文化统考数学试卷及答案
评论
0/150
提交评论