📄 vmm.cpp
字号:
//
//程序名称:请求分页存储管理
//程序作者:张焕人
//作者邮箱: renwairen369@yahoo.com.cn
// renwairen369@hotmail.com
//作者QQ:27949278
//
//
//
#define MAXP 6 //页表的最大长度
#define MAXB 3 //内存中最多的物理块数
#include <stdio.h>
#include <iostream.h>
typedef struct pa //页表项的数据结构
{
int pn; //页号
int bn; //物理块号
bool s; //状态位
int ad; //外存地址
} pageitem;
typedef struct p //页标置换的FIFO链表
{
int num; //记录页号
struct p *next;
} flink;
pageitem page[MAXP];
init()
{
int i;
for(i=0;i<MAXP;i++) //页表初始化
{
page[i].pn=i;
page[i].s=false;
page[i].bn= i*800 / 17;
page[i].ad=20000+i*1024;
}
}
main()
{ int i;
int cmda,pn;
int bn=0; //当前内存中已存入的页面数
flink *p,*h,*r;
h=r=new flink;
h->num=0; //头节点记录链表中节点个数
init();
cout<<"\t 欢迎使用请求分页存储管理方式模拟程序\n ";
cout<<"\n请输入一个指令地址(0000~6144): ";
cin>>cmda;
while(cmda>=6144)
{
cout<<"\n请输入一个指令地址(0000~6144): ";
cin>>cmda;
}
while(cmda>0)
{
pn=cmda/1024;
cout<<"\t此指令页号为"<<pn;
if(page[pn].s==true)
cout<<" 此页面已在内存中"<<endl;
else
{
if(h->num<MAXB) //内存中还能存入新页面
{
h->num++;
cout<<"\t此页面已调入内存"<<endl;
}
else //内存中不能再存入新页面
{
p=h->next;
page[p->num].s=false;
cout<<"\t此页面已调入内存,页号为"<<p->num<<"的页面被置换出来"<<endl;
h->next=p->next;
delete p; //将第一个页表置换出来
}
page[pn].s=true; //将当前需要的页读入内存
p=new flink;
p->num=pn;
r->next=p;
r=p; //将读入内存的页插入到FIFO队列尾部
}
cout<<"\n当前内存中物理块的情况"<<endl;
cout<<" 页号\t"<<"物理块号\t"<<"状态位\t"<<"外存地址"<<endl;
for(i=0;i<MAXP;i++)
{
if(page[i].s)
cout<<" "<<page[i].pn<<"\t"<<page[i].bn<<"\t\t"<<page[i].s<<"\t"<<page[i].ad<<endl;
}
cout<<"\n\n请输入一个指令地址(0000~6144): ";
cin>>cmda;
while(cmda>=6144)
{
cout<<"\n\n请输入一个指令地址(0000~6144): ";
cin>>cmda;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -