模拟设计页式存储管理的分配与回收Word格式文档下载.doc

上传人:wj 文档编号:1497380 上传时间:2023-04-30 格式:DOC 页数:18 大小:299.50KB
下载 相关 举报
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第1页
第1页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第2页
第2页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第3页
第3页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第4页
第4页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第5页
第5页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第6页
第6页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第7页
第7页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第8页
第8页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第9页
第9页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第10页
第10页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第11页
第11页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第12页
第12页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第13页
第13页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第14页
第14页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第15页
第15页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第16页
第16页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第17页
第17页 / 共18页
模拟设计页式存储管理的分配与回收Word格式文档下载.doc_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

模拟设计页式存储管理的分配与回收Word格式文档下载.doc

《模拟设计页式存储管理的分配与回收Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《模拟设计页式存储管理的分配与回收Word格式文档下载.doc(18页珍藏版)》请在冰点文库上搜索。

模拟设计页式存储管理的分配与回收Word格式文档下载.doc

//请求表结构

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):

/*

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2