模拟设计页式存储管理的分配与回收Word格式文档下载.doc
《模拟设计页式存储管理的分配与回收Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《模拟设计页式存储管理的分配与回收Word格式文档下载.doc(18页珍藏版)》请在冰点文库上搜索。
![模拟设计页式存储管理的分配与回收Word格式文档下载.doc](https://file1.bingdoc.com/fileroot1/2023-4/30/4046f498-a504-440f-bea3-e288d2799630/4046f498-a504-440f-bea3-e288d27996301.gif)
//请求表结构
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开发平台
(1)使用系统:
Windows7
(2)使用语言:
C++
(3)开发工具:
VisualC++2008
4测试用例,运行结果与运行情况分析
4.1测试方法
通过输入正常数据以及非正常数据对程序进行全方位测试
4.2测试结果
(1)程序主界面
(2)输入进程号和页面数:
(3)显示进程页表:
(4)显示请求表
(5)显示内存使用情况以及物理块大小
(6)错误检验
5源程序的主要部分
#include<
iostream>
cstdlib>
iomanip>
list>
#include"
page.h"
Random.h"
usingnamespacestd;
reqtable;
RandomNumberrandom;
//随机数产生器
unsignedpagenum=random.Random(80)+21;
//内存页面数21-100
unsignedpagesize=random.Random(16)+5;
//页面大小 5-20
unsignedpnum=random.Random(4)+5;
//进程的个数5-8
int*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;
if(mempage[i]==0)
sum++;
returnsum;
//判断有多少内存页面已经被使用
/*初始化默认的请求表*/
voidInit_Reqtable(void)
inti;
for(i=1;
=int(pnum);
{
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;
//进程请求页面数
list<
:
iteratorpos=reqtable.begin();
for(;
pos!
=reqtable.end();
pos++)
reqpnum=(*pos).reqpagenum;
if(reqpnum>
int(Get_Mempagenum())) //判断请求的内存页面数目是否大于剩余的
{
cout<
<
"
没有足够的内存!
endl;
cout<
}
else
(*pos).state=true;
pagetabletemp=newpgtabitem[reqpnum];
//新建临时页表项数组
if(temp==NULL)
{
cout<
内存分配失败!
exit(0);
}
(*pos).pgtabadr=temp;
for(i=0;
reqpnum;
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)
reqtabitempreq;
//新创建进程记录
intpid;
boolflag=false;
do{
cout<
请输入进程号:
;
flag=false;
cin>
>
pid;
for(list<
if((*pos).pid==pid)
flag=true;
该进程号已经存在,请重新输入"
break;
}while(flag==true);
//循环直到输入的Pid满足条件
preq.pid=pid;
cout<
请输入需要的页面数:
cin>
preq.reqpagenum=reqpnum;
preq.state=false;
preq.pgtabadr=NULL;
reqpnum=preq.reqpagenum;
if(reqpnum>
Get_Mempagenum())
没有足够的内存,进程创建失败!
cout<
else
preq.state=true;
pagetabletemp=newpgtabitem[reqpnum];
if(temp==NULL)
exit(0);
preq.pgtabadr=temp;
for(i=0;
int(reqpnum);
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)
for(pos=reqtable.begin();
if((*pos).state==true)
delete[](*pos).pgtabadr;
reqtable.clear();
/*打印出进程请求表*/
voidPrintReqtable(void)
cout<
|--------------------------------------------------------------------|"
|进程请求表|"
|"
setw(8)<
进程号"
<
setw(16)<
请求页面数"
<
页表起始地址"
页表长度"
状态|"
|---------------------------------------------------------------------|"
list<
for(pos=reqtable.begin();
{
(*pos).pid
<
(*pos).reqpagenum
(*pos).pgtabadr
((*pos).reqpagenum)*pagesize;
if((*pos).state)
setw(4)<
已分配|"
else
未分配|"
if((*pos).pid!
=reqtable.back().pid)
}
/*打印页表*/
voidPrintPageTable(void)
unsignedpid;
inti;
boolflag=false;
cin>
if((*pos).pid==pid&
&
(*pos).state==true)
{
flag=true;
|---------------------------|"
|此进程的页表|"
页号"
setw(6)<
块号|"
intreqpagenum=(*pos).reqpagenum;
reqpagenum;
(*pos).pgtabadr[i].pagenum
<
(*pos).pgtabadr[i].blocknum<
|"
if(i!
=reqpagenum-1)
cout<
else
}
if(flag==false)
cout<
系统中不存在该进程或者该进程还没有被分配内存!
\n"
cout<
voidPrintMem(void)
内存总块数为"
pagenum<
已经使用了"
pagenum-Get_Mempagenum()<
块!
现在还有"
Get_Mempagenum()<
块内存区域空闲!
voidPrintBlockSize(void)
物理块大小为:
pagesize<
KB"
/*结束指定进程*/
voidKill(void)
boolflag;
reqtabitemtemp;
for(pos=reqtable.begin();
temp=*pos;
if(flag==false)
系统中不存在该进程!
}while(flag==false);
int(temp.reqpagenum);
mempage[temp.pgtabadr[i].blocknum]=0;
reqtable.remove(temp);
//重新为没有分配到内存的进程分配内存
if((*pos).state==false)
intreqpnum;
reqpnum=(*pos).reqpagenum;
if(reqpnum<
=Get_Mempagenum())
(*pos).state=true;
pagetabletemp=newpgtabitem[reqpnum];
if(temp==NULL)
{
exit(0);
}
(*pos).pgtabadr=temp;
for(i=0;
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<
页式存储管理的分配与回收"
1.手动创建进程"
2.显示进程页表"
3.显示请求表"
4.撤销进程"
5.显示内存使用情况"
6.显示物理块大小"
7.退出系统"
请输入您的选择(0--7):
/*