操作模拟式存储管理分配与回收_第1页
操作模拟式存储管理分配与回收_第2页
操作模拟式存储管理分配与回收_第3页
操作模拟式存储管理分配与回收_第4页
操作模拟式存储管理分配与回收_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、作者: ZHANGJIAN仅供个人学习,勿做商业用途学 号:0120910340228课程设计模拟设计页式存储管理的分题目配与回收学院计算机科学与技术专业计算机科学与技术班级XX姓名XX指导教师XXX2011 年 01 月 09 日课程设计任务书学生姓名: XX 专业班级: 计算机 0902 班指导教师: XXX工作单位:计算机科学与技术学院题 目 : 模拟设计页式存储管理的分配与回收初始条件:1预备内容:阅读操作系统的内存管理章节内容,了解有关虚拟存储器、页式存储管理等概念, 并体会页式管理内存的分配和回收过程。 精品文档收集整理汇总2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任

2、务 : (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1采用页式管理方案实施内存分配和回收。能够处理以下的情形 能够输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。 要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内存空 间的使用情况(被进程占用的页面,空闲的页面)。 精品文档收集整理汇总2设计报告内容应说明:课程设计目的与功能;需求分析,数据结构或模块说明 (功能与框图 );源程序的主要部分;测试用例,运行结果与运行情况分析;自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正;iii

3、 )从本设计得到的收获(在编写,调试,执行过程中的经验和教训); 精品文档收集整理汇 总iv )完成本题是否有其他的其他方法(如果有,简要说明该方法); v)对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周 1、周 2:完成程序分析及设计。周 2、周 3 :完成程序调试及测试。周 4、周 5 :验收,撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按 0 分记)指导教师签名:年月 日系主任(或责任教师)签名:年月 日模拟设计页式存储管理的分配与回收1 需求分析 页式管理是一种空间存储管理的技术,页式管理分为静态页式管理和动态页式管理。基本原 理是将各的虚拟

4、空间划分成若干个长度相等的页 (page) ,页式管理把内存空间按页的大小划分 成片或者页面( page frame ),然后把页式与建立一一对应页表,并用相应的地址变换机构, 来解决地址变换问题。页式管理采用请求调页或预调页技术实现了内外存的统一管理。 精品文档 收集整理汇总图1 页的划分 图 2 基本页表示例 静态分页管理的第一步是为要求内存的作业或进程分配足够的页面。系统通过 存储页面、请求表以及页表来完成内存的分配工作。页表指的是内存中的一块固定存储区。页式管理时每个进程至少有一个页表。请求表指的是用来确定作业或进程的虚拟空间的各页在 内存中的实际对应位置;另外整个系统有一个存储页面表

5、,其描述了物理内存空间的分配使用 状况。 精品文档收集整理汇总图 3 请求表的示例 存储页面表有两种构成方法:1、位示图法2、空闲页面链表法 模拟设计页式存储管理的分配与回收要求能够满足如下的要求 :(1) 输入给定的内存页面数,页面大小,进程的个数及每个进程的页数。(2) 要求当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资源后内 存空间的使用情况(被进程占用的页面,空闲的页面)。 精品文档收集整理汇总2 功能设计2.1 算法分析首先,请求表给出进程或作业要求的页面数。然后,由存储页面表检查是否有足够的空闲页面,如果没有,则本次无法分配。如果有则首先分配设置页表,并请求表中

6、的相应表项后, 按一定的查找搜索出所要求的空闲页面,并将对应的页好填入页表中。 精品文档收集整理汇总图4 分配页面的算法流程2.2 数据结构页式管理把内存空间按页的大小划分成片或者页面 ,再按照一定的规律建立起页表 ,并通过. 精品文档收请求表将分配内容显示出来 .将页表和请求表的内容使用结构体来定义是比较方便的 集整理汇总/页表项结构typedef struct _pagetableitempageid pagenum;/页号blockid blocknum;/块号pgtabitem;/页表typedef pgtabitem * pagetable;/请求表结构typedef struct

7、_reqtableunsigned pid;/进程号unsigned reqpagenum;/请求页面数pagetable pgtabadr; /页表始址 bool state;/状态 reqtabitem;请求表还引入了支持快速插入和删除的 list 顺序容器来进行相关操作 . list reqtable因为模拟设计的关系 ,页面的起始地址均应该为随机的数值 ,所以程序在 设计过程中加入了随机数类的编写 .class RandomNumberprivate:unsigned long randseed;public:RandomNumber(unsigned long s=0); unsig

8、ned short Random(unsigned long n); double fRandom(void);采用当前系统的时间值来生成伪随机数分配地址 定义随机数产生器 :RandomNumber random 定义内存页面数 :int pagenum 定义页面大小 :int pagesize 定义进程个数 :int pnum用整数数组模拟分配的内存页面数 int * mempage=new intpagenum2.3 模块说明2.3.1 主函数主函数依次运行了程序中所实现的关键函数 .int main()InitSys();/ 初始化系统MainChoice();/ 输出系统菜单Dest

9、roy();/释放申请的动态内存return 0;2.3.2 各个功能函数初始化内存页面 :void Init_Mempage(void) 获取内存使用情况 :int Get_Mempagenum(void) 初始化默认的请求表 :void Init_Reqtable(void) 为默认的进程分配内存 :void Init_DistMem(void) 手动创建进程 ,并分配内存 :void Dist_Mem(void) 释放申请的动态内存 :void Destroy(void) 结束指定进程 :void Kill(void)2.3.3 打印函数打印出进程请求表 :void PrintReqta

10、ble(void)打印出页表 :void PrintPageTable(void) 打印出内存使用情况 :void PrintMem(void) 打印出物理块的大小 :void PrintBlockSize(void)2.3.4 其他函数初始化系统 :void InitSys(void)输出主菜单 :void MainMenu(void)选择运行分支 :void MainChoice()3 开发平台3.1 开发平台(1) 使用系统: Windows7(2) 使用语言: C+(3) 开发工具: Visual C+ 20084 测试用例,运行结果与运行情况分析4.1 测试方法通过输入正常数据以及非

11、正常数据对程序进行全方位测试4.2 测试结果(1)程序主界面(2)输入进程号和页面数 :(3) 显示进程页表 :(4) 显示请求表(5) 显示内存使用情况以及物理块大小(6) 错误检验5 源程序的主要部分#include #include #include #include #include page.h#include Random.husing namespace std;list reqtable;RandomNumber random; /随机数产生器unsigned pagenum=random.Random(80)+21; 内/ 存页面数 21-100 精品文档收集整理汇总 uns

12、igned pagesize=random.Random(16)+5; 页/ 面大小5-20unsigned pnum=random.Random(4)+5;/进/ 程的个数 5-8 int * mempage=new intpagenum; /用整数数组模拟内存页面数 /* 初始化内存页面 */ void Init_Mempage(void)int i=0;for(i=0;iint(pagenum);i+) mempagei=0;/数组全部赋初值/* 获取内存的使用情况 */int Get_Mempagenum(void)int sum=0;for(int i=0;iint(pagenum)

13、;i+) if(mempagei=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;/进/ 程请求的页面大小 -5 preq.state=false;preq.pgtabadr=NULL;reqtable.push_back(preq);/依次压入容器/* 为默认的进程分配内存 */ void Init_DistMem(

14、void)int reqpnum;/进程请求页面数int 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=

15、NULL)cout内存分配失败 !endl;exit(0);(*pos).pgtabadr=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

16、preq;/新创建进程记录int pid;/进程号int reqpnum;/请求页面数bool flag=false;docoutpid;for(list:iterator pos=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

17、.state=false;preq.pgtabadr=NULL; reqpnum=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=rand

18、om.Random(pagenum)+1;/随/ 机产生一个块号 while(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+

19、精) 品文档收集整理汇总if(*pos).state=true)delete (*pos).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=req

20、table.begin();for(pos=reqtable.begin();pos!=reqtable.end();pos+精) 品文档收集整理汇总cout|setw(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; 文档来源网络及个人整

21、理,勿用作商业用途 elsecout|人整理,勿用作商业用途|endl; 文档来源网络及个/* 打印页表 */void PrintPageTable(void)unsigned pid;int i;bool flag=false; coutpid;list:iterator pos=reqtable.begin();for(pos=reqtable.begin();pos!=reqtable.end();pos+文) 档来源网络及个人整理 , 勿用作商业用途if(*pos).pid=pid&(*pos).state=true) flag=true;cout cout cout cout|end

22、l; 此进程的页表 |endl;|endl;setw(16)页号 setw(6)块号|endl;cout|endl;int reqpagenum=(*pos).reqpagenum;for(i=0;ireqpagenum;i+)cout|setw(16)(*pos).pgtabadri.pagenumsetw(6)(*pos).pgtabadri.blocknum |endl; 文档来源网络及 个人整理 ,勿用作商业用途if(i!=reqpagenum-1)cout|endl;elsecout|endl;if(flag=false) cout系统中不存在该进程或者该进程还没有被分配内存 !n;

23、coutendl;void PrintMem(void)cout 内 存 总 块 数 为 pagenum, 已 经 使 用 了 pagenum-Get_Mempagenum() 块!endl; 文档来源网络及个人整理 ,勿用作商业用途cout现在还有 Get_Mempagenum()块内存区域空闲 !endl; coutendl;void PrintBlockSize(void)cout物理块大小为 :pagesizeKBendl; coutendl;/* 结束指定进程 */ void Kill(void)bool flag;int i;reqtabitem temp;list:iterato

24、r pos=reqtable.begin();int pid;do coutpid;for(pos=reqtable.begin();pos!=reqtable.end();pos+文) 档来源网络及个人整理 ,勿用作商业用途if(*pos).pid=pid)flag=true; temp=*pos; break; if(flag=false)cout系统中不存在该进程 !endl; coutendl;while(flag=false); for(i=0;iint(temp.reqpagenum);i+)mempagetemp.pgtabadri.blocknum=0; reqtable.re

25、move(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; pagetable temp = new pgtabitemreqpnum; if(temp=NULL)cout内存分配失败 !endl; coutendl;exit(0);(*pos)

26、.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;/页表的块号 mempagerandnum=1; /* 初始化系统 */void InitSys(void)cout.setf(ios:left);/左对齐 Init_Mempage();Init_Reqtable

27、();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:PrintReqtable();bre

28、ak;case 4:Kill();break;case 5:PrintMem();break;case 6:PrintBlockSize();break;case 7:break;default :cout输入有误,请重新输入 .n;coutendl;break;while(choice!=7);int main()InitSys();/初始化系统MainChoice();/输出系统菜单Destroy();/释放申请的动态内存return 0;6 自我评价与总结 此次试验是完全在自己独立完成的,首先在分析问题并把问题转化为编程问题,我觉得个人把握 的很好,对页式管理的基本原理理解的比较透彻;其次

温馨提示

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

评论

0/150

提交评论