设计页式存储管理的分配与回收_第1页
设计页式存储管理的分配与回收_第2页
设计页式存储管理的分配与回收_第3页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题 目学 院专 业班 级姓 名指导教师学号:课程设计模拟设计页式存储管理的分配与回收计算机科学与技术吴利军2013 年 01 月 09 日课程设计任务书学生姓名:指导教师:吴利军工作单位: 计算机科学与技术学院题 目:模拟设计页式存储管理的分配与回收 初始条件:1 .预备内容:阅读操作系统的内存管理章节内容,理解有关虚拟存储器、页式存储管理等概念,掌握页式管理内存的分配和回收过程。2 实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量与其技术要求,以与说 明书撰写等具体要求)1 .采用页式管理方案实施内存分配和回收。能够处理以下的情形 能够输入给定的内存页面数,

2、页面大小,进程的个数与每个 进程的页数。 当某进程提出申请空间的大小后, 显示能否满足申请,以与 为该进程分配资源后内存空间的使用情况 (被进程占用的页面,空闲 的页面);当某进程撤消时,显示内存回收后内存空间的使用情况。2 .设计报告内容应说明:需求分析;功能设计(数据结构与模块说明);幵发平台与源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法)时间安排:设计

3、安排一周:周1、周2 :完成程序分析与设计。周2、周3 :完成程序调试与测试。周4、周5 :验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日模拟设计页式存储管理的分配与回收1需求分析页式管理是一种内存空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。基本原理是将各进程的虚拟空间划分成若干个长度相等的页,页式管理把内存空间按页的大小划分成片或者页面,然后把页式虚 拟地址与内存地址建立对应页表,并用相应的硬件地址变换机构,来 解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外 存存储器的统一管理。页号

4、P位移量W图1页的划分页号块号图2 基本页表示例静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过存储页面表、请求表以与页表来完成内存的分配工作。页表指的是内存 中的一块固定存储区。页式管理时每个进程至少有一个页表。请求表指的 是用来确定作业或进程的虚拟空间的各页在内存中的实际对应位置;另外 整个系统有一个存储页面表,其描述了物理内存空间的分配使用状况。图3请求表的示例存储页面表有两种构成方法:1、位示图法2、空闲页面链表法模拟设计页式存储管理的分配与回收要求能够满足如下的要求进程号谙求贡面数页面始址页面扶度1201024t20 1已分配1234104434己分配318107

5、818己分配21未分配Wif(1) 输入给定的内存页面数,页面大小,进程的个数与每个进程的页数。(2) 要求当某进程提出申请空间的大小后,显示能否满足申请,以与为该进程分配资源后内存空间的使用情况(被进程占用的页面,空闲的页面)。2功能设计2.1算法分析首先,请求表给出进程或作业要求的页面数。然后,由存储页面表检查 是否有足够的空闲页面,如果没有,则本次无法分配。如果有则首先分配 设置页表,并请求表中的相应表项后,按一定的查找算法搜索岀所要求的 空闲页面,并将对应的页好填入页表中。图4分配页面的算法流程22数据结构页式管理把内存空间按页的大小划分成片或者页面,再按照一定的规律建立起页表 ,并通

6、过请求表将分配内容显示出来 .将页表和请求表的内容 使用结构体来定义是比较方便的 ./ 页表项结构typedef struct _pagetableitempageid pagenum;/ 页号blockid blocknum;/ 块号pgtabitem;/ 页表typedef pgtabitem * pagetable;/ 请求表结构typedef struct _reqtableunsigned pid; / 进程号unsigned reqpagenum; / 请求页面数pagetablepgtabadr; / 页表始址bool state; reqtabitem;/ 状态请求表还引入了支

7、持快速插入和删除的 list 顺序容器来进行相关操作 list reqtable因为模拟设计的关系 ,页面的起始地址均应该为随机的数值 ,所以程序设计过程中加入了随机数类的编写 .class RandomNumberprivate:unsigned long randseed;public:RandomNumber(unsigned long s=0); unsigned short Random(unsigned long n); double fRandom(void);采用当前系统的时间值来生成伪随机数分配地址定义随机数产生器 :RandomNumber random 定义内存页面数 :

8、int pagenum 定义页面大小 :int pagesize 定义进程个数 :int pnummempage=new用整数数组 模拟分 配的 内存页面 数 int intpagenum2.3 模块说明2.3.1 主函数 主函数依次运行了程序中所实现的关键函数 .int main()InitSys(); / 初始化系统MainChoice();/ 输出系统菜单Destroy(); / 释放申请的动态内存return 0;2.3.2 各个功能函数初始化内存页面 : void Init_Mempage(void) 获取内存使用情况 : int Get_Mempagenum(void) 初始化默认

9、的请求表 : void Init_Reqtable(void) 为默认的进程分配内存 : void Init_DistMem(void) 手动创建进程 ,并分配内存 : void Dist_Mem(void) 释放申请的动态内存 : void Destroy(void) 结束指定进程 : void Kill(void)2.3.3 打印函数打印出进程请求表 : void PrintReqtable(void) 打印出页表 : void PrintPageTable(void) 打印出内存使用情况 : void PrintMem(void) 打印出物理块的大小 : void PrintBlockS

10、ize(void)2.3.4 其他函数初始化系统 : void InitSys(void)输出主菜单 : void MainMenu(void) 选择运行分支 :void MainChoice()3 开发平台3.1 开发平台(1) 使用系统: Windows 7(2) 使用语言: C+(3) 开发工具: Visual C+ 6.04 测试用例,运行结果与运行情况分析4.1 测试方法 通过输入正常数据以与非正常数据对程序进行全方位测试4.2 测试结果(1) 程序主界面(2)输入进程号和页面数(3)显示进程页表:F男择:S选号 B.a&叭;此进程的页表辰空 蜓;17425况 举库 甯丙曹恋 F-1

11、1巫竝2 lli播五虹IR-im Il X 4kR ?洁回IV. 囲=1- 与7:5. 蓟 况 一 2毅 分 RLPCOJ1S: 的集 黑瞬费 聶页表竇S1幕 基存理统的程S I-i-SAAA. 式丰S显梯显显退一制 IK-B.B.I4.K.I&-P!土11虫(4) 显示请求表(5) 显示内存使用情况以与物理块大小暑 e:U习档丟僅年谿课桎就性模M顷式曲苣彩渝&与回悅潭elea seosfflce-D-| 回-1 1pI:iifiW求耒1M2-情求贝面数页表起女曲地址 I11!1VG0Q2719?04Qii11& 1I:23Z4己片配11亠1432厂!I11:429BZ719D816罰厂1A3

12、RH271AHF)24厂!1:640OZ7JR3032厂1:7508271Rb840己分fir.11:e398271Aft624厂112012508271BB040已片配1 iL况 旦人回&配分 抄程表理 :s逢程尹程存理统的小 篦迟W进脣 頁丞于销示一霍入块 式手辰显请输理 -n *- PK terlLZL3kL&Lbb 谓裘选盘 建fe程欝统翳呗 仔琦示示销一乔祖人廿心坊tx- -H3.OU(6)错误检验i 口U4 ng谆习屯芙件基站思员计AIS遁式用诸官理的分殆回也梓出easeXos-ew酉分 -吐程表理注反表管建第萝存叩子示祐!eTT岀/丿-,斥 式于显Emf页5-花在5-九请注Igp

13、ks.况冃X參遭苗内 罰需程養0 1拓:2页存ffi程衣 月KK世识 理注灵表隼八选号巫 W建程求程存理统的程帛 FP示示銷不蛊兀入中 式手匠显撤异匠迫K 一1鼻 *-* F9fc35源程序的主要部分#i nclude #in elude #i nclude #i nclude #in clude page.h#in clude Ra ndom.husing n amespace std;list reqtable;Ran domNumber ran dom; /随机数产生器un sig ned page num二ra ndom.Ra ndom(80)+21; /内存页面数 21-100un

14、sig ned pagesize二ra ndom.Ra ndom(16)+5; /页面大小5-20unsigned pnum二random.Random(4)+5;进程的个数 5-8int * mempage=new in tpage num; /用整数数组模拟内存页面数void Ini t_Mempage(void) _int i=0;for(i=0;i in t(page nu m);i+)mempagei=0;/数组全部赋初值int Get_Mempage nu m(void) _int sum=0;for(i nt i=0;ii nt(page nu m);i+)if(mempagei

15、=0)sum+;return sum;/判断有多少内存页面已经被使用void Init_Reqtable(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; / 进程请求页面数in

16、t i;list:iterator pos=reqtable.begin(); for(;pos!=reqtable.end();pos+) reqpnum=(*pos).reqpagenum; if(reqpnumint(Get_Mempagenum() / 判断请求的内存页 面数目是否大于剩余的cout 没有足够的内存 !endl; coutendl; else (*pos).state=true; pagetable temp = new pgtabitemreqpnum; / 新建临 if(temp=NULL)cout 内存分配失败 !endl; exit(0);(*pos).pgta

17、badr=temp; for(i=0;ireqpnum;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;reqtabitem preq; / 新创建进程记录int pid; / 进程号int req

18、pnum; / 请求页面数 bool flag=false;docoutpid;for(list:iteratorpos=reqtable.begin();pos!=reqtable.end();pos+)if(*pos).pid=pid)flag=true;cout 该进程号已经存在 ,请重新输入 endl;coutendl;break;while(flag=true); / 循环直到输入的 Pid 满足条件 preq.pid=pid;coutreqpnum;preq.reqpagenum=reqpnum;preq.state=false;preq.pgtabadr=NULL;reqpnum

19、=preq.reqpagenum; if(reqpnumGet_Mempagenum()cout 没有足够的内存 ,进程创建失败 !endl; coutendl;elsepreq.state=true;pagetable temp = new pgtabitemreqpnum; if(temp=NULL)cout 内存分配失败 !endl;exit(0);preq.pgtabadr=temp; for(i=0;iint(reqpnum);i+)tempi.pagenum=i; /页表的页号随机产生int randnum=random.Random(pagenum)+1;/ 一个块号 while

20、(mempagerandnum=1) randnum=random.Random(pagenum)+1; tempi.blocknum=randnum;/ 页表的块号 mempagerandnum=1;reqtable.push_back(preq); / 将该进程的记录加入请求表/* 程序结束时 ,释放申请的动态内存 */void Destroy(void)list:iterator pos=reqtable.begin();for(pos=reqtable.begin();pos!=reqtable.end();pos+) if(*pos).state=true) delete (*pos

21、).pgtabadr; reqtable.clear();/* 打印出进程请求表 */void PrintReqtable(void)coutendl;cout|endl;cout|进 程 请 求 表|endl;cout|endl;cout|setw(8) 进程号 setw(16) 请求页面数 setw(16) 页表起始地址 setw(16) 页表长度 setw(16) 状态 |endl;cout|endl;list:iterator pos=reqtable.begin(); for(pos=reqtable.begin();pos!=reqtable.end();pos+)cout|set

22、w(8)(*pos).pidsetw(16)(*pos).reqpagenumsetw(16)(*pos).pgtabadrsetw(16)(*pos).reqpagenum) * pagesize;if(*pos).state)coutsetw(4) 已分配 |endl;elsecoutsetw(4) 未分配 |endl;if(*pos).pid!=reqtable.back().pid)cout|endl;elsecout|endl;/* 打印页表 */ void PrintPageTable(void) unsigned pid; int i;bool flag=false; coutp

23、id;list:iterator pos=reqtable.begin(); for(pos=reqtable.begin();pos!=reqtable.end();pos+) if(*pos).pid=pid&(*pos).state=true)flag=true;cout|endl;cout| 此进程的页表cout|cout|setw(16) setw(6) 块号cout|endl;页号|endl;|endl;|endl;int reqpagenum=(*pos).reqpagenum; for(i=0;ireqpagenum;i+)cout|setw(16)(*pos).pgtabad

24、ri.pagenum setw(6)(*pos).pgtabadri.blocknum |endl;if(i!=reqpagenum-1)cout|endl;elsecout|endl; if(flag=false)!n;cout 系统中不存在该进程或者该进程还没有被分配内存 coutendl;void PrintMem(void)cout 内 存 总 块 数 为 pagenum, 已 经 使 用 了 pagenum-Get_Mempagenum() 块 !endl;cout 现 在 还 有 Get_Mempagenum() 块 内 存 区 域 空 闲!e ndl;-coutendl;void

25、 PrintBlockSize(void)cout 物理块大小为 :pagesizeKBendl; coutendl;/* 结束指定进程 */ void Kill(void)bool flag;int i;reqtabitem temp;list:iterator pos=reqtable.begin(); int pid;docoutpid;for(pos=reqtable.begin();pos!=reqtable.end();pos+)if(*pos).pid=pid)flag=true;temp=*pos;break; if(flag=false) cout 系统中不存在该进程 !en

26、dl; coutendl;while(flag=false);for(i=0;iint(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()(*pos).state=true;paget

27、able temp = new pgtabitemreqpnum; if(temp=NULL)cout 内存分配失败 !endl; coutendl;exit(0);(*pos).pgtabadr=temp;for(i=0;iint(reqpnum);i+)tempi.pagenum=i; / 页表的页号int randnum=random.Random(pagenum)+1;/ 机产生一个块号while(mempagerandnum=1)randnum=random.Random(pagenum)+1; tempi.blocknum=randnum;/ 页表的块号 mempagerandnu

28、m=1;/* 初始化系统 */void InitSys(void)cout.setf(ios:left);/ 左对齐Init_Mempage();Init_Reqtable();Init_DistMem();/* 输出主菜单 */void MainMenu(void)cout 页式存储管理的分配与回收 endl;cout1. 手动创建进程 endl;cout2. 显示进程页表 endl;cout3. 显示请求表 endl;cout4. 撤销进程 endl;cout5. 显示内存使用情况 endl;cout6. 显示物理块大小 endl;cout7. 退出系统 endl;coutchoice;switch(choice)case 1:Dist_Mem();break;case 2:PrintPageTable();break;case 3:Prin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论