模拟设计页式存储管理的分配与回收
更新时间: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;
}
正在阅读:
模拟设计页式存储管理的分配与回收08-27
小学六年级家乡的风俗作文600字精选5篇05-02
普通高中学生入党申请书范文09-08
非稳态条件下的中长期径流耦合预报方法06-19
强夯地基处理设计方案05-13
口腔种植学考题(本科)09-14
excel计算基尼系数法,简单实用04-03
揭西县职称论文发表-室速动态心电图心源性晕厥论文选题题目05-05
汉服,遇见你是我一生的春暖花开02-13
一年级上册第六单元语文试题03-17
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 回收
- 分配
- 存储
- 模拟
- 设计
- 管理
- 广州中考英语单项历年分析理解与练习
- 社保人员增加表
- 微机原理 周荷琴 答案
- DOL魔盘
- 新贸易保护主义对山东省贸易的影响
- 2017年电大创建小企业形成性考核作业参考答案
- 数字电路课程设计——九路抢答器
- 监理招标文件(仓储物流) -20110124
- 推进工会信息化建设 促进工会工作上台阶
- 常用电气元件英语
- 高低温试验箱GDW-225-40-3000说明书要点
- 医疗纠纷案例分析作业(三)
- T430HVN01.0 SKD product final spec_v1.3_LBC_20140909
- 【睿智彩神】收集整理福彩3D选号技巧
- 北京航空航天大学航空宇航科学与技术考研 招生人数 参考书 报录比 复试分数线 考研真题 考研经验 招生简章
- (打)加强党委班子自身建设
- 安大校园环境认知调研报告
- HG5-227-80玻璃管液位计
- 新概念第一册自学导读
- 直齿圆锥齿轮的设计步骤