模拟设计页式存储管理的分配与回收

更新时间:2023-08-27 19:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

仅仅是代码哦

#include <iostream>

#include <cstdlib>

#include <iomanip>

#include <list>

#include "page.h"

#include "Random.h" using namespace std;

list<reqtabitem> reqtable;

RandomNumber random; //随机数产生器

unsigned pagenum=random.Random(80)+21; //内存页面数

unsigned pagesize=random.Random(16)+5; //页面大小 5-20

unsigned pnum=random.Random(4)+5;//进程的个数 5-8

int * mempage=new int[pagenum]; //用整数数组模拟内存页面数

/*初始化内存页面*/

void Init_Mempage(void)

{

int i=0;

for(i=0;i<int(pagenum);i++)

mempage[i]=0; //数组全部赋初值

}

/*获取内存的使用情况*/

int Get_Mempagenum(void)

{

int sum=0;

for(int i=0;i<int(pagenum);i++)

if(mempage[i]==0)

sum++;

return sum; //判断有多少内存页面已经被使用

}

/*初始化默认的请求表*/

void Init_Reqtable(void)

{

int i;

for(i=1;i<=int(pnum);i++)

{ 21-100

仅仅是代码哦

reqtabitem preq;

preq.pid=i;

preq.state=false;

preq.pgtabadr=NULL;

reqtable.push_back(preq); //依次压入容器

}

}

/*为默认的进程分配内存*/

void Init_DistMem(void)

{

int reqpnum; //进程请求页面数

int i;

list<reqtabitem>::iterator pos=reqtable.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 pgtabitem[reqpnum]; //新建临时页表数组 if(temp==NULL)

{

cout<<"内存分配失败!"<<endl;

exit(0);

}

(*pos).pgtabadr=temp;

for(i=0;i<reqpnum;i++)

{ preq.reqpagenum=random.Random(4)+2;//进程请求的页面大小-5

仅仅是代码哦

temp[i].pagenum=i; //页表的页号

int randnum=random.Random(pagenum)+1;//随机产生一块号 while(mempage[randnum]==1)

randnum=random.Random(pagenum)+1;

temp[i].blocknum=randnum;//页表的块号

mempage[randnum]=1;

}

}

}

}

/*手动创建进程,并分配内存*/

void Dist_Mem(void)

{ int i;

reqtabitem preq; //新创建进程记录

int pid; //进程号

int reqpnum; //请求页面数

bool flag=false;

do

{

cout<<"请输入进程号:";

flag=false;

cin>>pid;

for(list<reqtabitem>::iterator

pos=reqtable.begin();pos!=reqtable.end();pos++)

{

if((*pos).pid==pid)

{

flag=true;

cout<<"该进程号已经存在,请重新输入"<<endl;

cout<<endl;

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<<endl;

}

else

{

preq.state=true; pagetable temp = new pgtabitem[reqpnum]; if(temp==NULL) {

cout<<"内存分配失败!"<<endl;

exit(0);

}

preq.pgtabadr=temp;

for(i=0;i<int(reqpnum);i++)

{ temp[i].pagenum=i; //页表的页号

int randnum=random.Random(pagenum)+1;//随机产生一个

块号

while(mempage[randnum]==1)

randnum=random.Random(pagenum)+1;

temp[i].blocknum=randnum;//页表的块号

mempage[randnum]=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();

} //将该进程的记录加入请求表

/* 打印出进程请求表*/

void PrintReqtable(void)

{

cout<<endl;

cout<<"|------------------------------------------------------------------|"<<endl; cout<<"| 进程请求表 |"<<endl; cout<<"|------------------------------------------------------------------|"<<endl; cout<<"|"<<setw(8)<<"进程号"<<setw(16)<<"请求页面数"

<<setw(16)<<"页表起始地址" <<setw(16)<<"页表长度"

<<setw(16)<<"状态 |"<<endl;

cout<<"|-------------------------------------------------------------------|"<<endl; list<reqtabitem>::iterator pos=reqtable.begin();

for(pos=reqtable.begin();pos!=reqtable.end();pos++)

{

cout<<"|"<<setw(8)<<(*pos).pid

<<setw(16)<<(*pos).reqpagenum

<<setw(16)<<(*pos).pgtabadr

<<setw(16)<<((*pos).reqpagenum) * pagesize;

if((*pos).state)

cout<<setw(4)<<"已分配 |"<<endl;

else

cout<<setw(4)<<"未分配 |"<<endl;

if((*pos).pid!=reqtable.back().pid)

cout<<"|--------------------------------------------------------------|"<<end; else

cout<<"|-------------------------------------------------------------|"<<endl; }

}

仅仅是代码哦

/*打印页表*/

void PrintPageTable(void)

{

unsigned pid;

int i;

bool flag=false;

cout<<"请输入进程号:";

cin>>pid;

list<reqtabitem>::iterator pos=reqtable.begin();

for(pos=reqtable.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)<<"块号 |"<<endl;

cout<<"|---------------------------|"<<endl;

int reqpagenum=(*pos).reqpagenum;

for(i=0;i<reqpagenum;i++)

{

cout<<"|"<<setw(16)<<(*pos).pgtabadr[i].pagenum

<<setw(6)<<(*pos).pgtabadr[i].blocknum<<" |"<<endl;

if(i!=reqpagenum-1)

cout<<"|---------------------------|"<<endl;

else

cout<<"|---------------------------|"<<endl;

}

}

}

if(flag==false)

cout<<"系统中不存在该进程或者该进程还没有被分配内存!\n"; cout<<endl;

}

void PrintMem(void)

{

cout<<" 内 存 总 块 数 为 "<<pagenum<<", 已经使用了

仅仅是代码哦

"<<pagenum-Get_Mempagenum()<<"块!"<<endl;

cout<<"现在还有"<<Get_Mempagenum()<<"块内存区域空闲!"<<endl;

cout<<endl;

}

void PrintBlockSize(void)

{ cout<<"物理块大小为:"<<pagesize<<"KB"<<endl;

cout<<endl;

}

/*结束指定进程*/

void Kill(void)

{

bool flag;

int i;

reqtabitem temp;

list<reqtabitem>::iterator pos=reqtable.begin();

int pid;

do

{

cout<<"请输入进程号:";

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<<"系统中不存在该进程!"<<endl;

cout<<endl;

}while(flag==false);

for(i=0;i<int(temp.reqpagenum);i++)

mempage[temp.pgtabadr[i].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;

pagetable temp = new pgtabitem[reqpnum];

if(temp==NULL)

{

cout<<"内存分配失败!"<<endl;

}

cout<<endl; exit(0); (*pos).pgtabadr=temp; for(i=0;i<int(reqpnum);i++) {

temp[i].pagenum=i; //页表的页号 号

int randnum=random.Random(pagenum)+1;//随机产生一

个块号

while(mempage[randnum]==1)

randnum=random.Random(pagenum)+1;

temp[i].blocknum=randnum;//页表的块号

mempage[randnum]=1;

}

}

}

}

} /*初始化系统*/

void InitSys(void)

{

cout.setf(ios::left);//左对齐

Init_Mempage();

Init_Reqtable();

Init_DistMem();

仅仅是代码哦

}

/*输出主菜单*/

void MainMenu(void)

{

cout<<"页式存储管理的分配与回收"<<endl; cout<<"1.手动创建进程"<<endl; cout<<"2.显示进程页表"<<endl;

cout<<"3.显示请求表"<<endl;

cout<<"4.撤销进程"<<endl;

cout<<"5.显示内存使用情况"<<endl; cout<<"6.显示物理块大小"<<endl; cout<<"7.退出系统"<<endl;

cout<<"请输入您的选择(0--7):"; }

/*选择函数*/

void MainChoice()

{

int choice;

do{ MainMenu();

cin>>choice;

switch(choice)

{

case 1:

Dist_Mem();

break;

case 2:

PrintPageTable();

break;

case 3:

PrintReqtable();

break;

case 4:

Kill();

仅仅是代码哦

break;

case 5:

PrintMem();

break;

case 6:

PrintBlockSize();

break;

case 7:

break;

default :cout<<"输入有误,请重新输入.\n"; cout<<endl;

break;

}

}while(choice!=7);

}

int main()

{

InitSys();//初始化系统

MainChoice();//输出系统菜单

Destroy();//释放申请的动态内存 return 0;

}

本文来源:https://www.bwwdw.com/article/mgji.html

Top