📄 324.cpp
字号:
#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include"windows.h"
#include"time.h"
#define n 10//实验中假定主存的长度
#define m 9//实验中假定每个作业分得主存块块数
#define MAX 64
int p[m],q[64];//定义页
struct
{
short int lnumber;//页号
short int flag;//表示该页是否在主存,“1”表示在主存,“0”表示不在主存
int pnumber;//该页所在主存块的块号
short int write;//该页是否被修改过,“1”表示修改过,“0”表示没有修改过
//short int dnumber;//该页存放在磁盘上的位置,即磁盘块号
}page[n];//定义页表
//各个函数的实现如下:
class computer
{public:
computer() ;
void showpagelist();
void showpage() ;
void transformation() ;
};
computer::computer()
{
int i,j;
for(i=0;i<n;i++)
{ page[i].lnumber = i;
page[i].flag = 0;
page[i].pnumber = 10000;//用10000表示为空 主存号
page[i].write = 0;
//page[i].dnumber = i;
}//初始化页表
srand( (unsigned)time( NULL ) );
for(i=0;i<m;i++)
{
page[i].pnumber = rand()%MAX;//srand()函数产生一个以当前时间开始的随机种子 给页号分配块号
for(j=0;j<i;j++)
if(page[i].pnumber ==page[j].pnumber){ page[i].pnumber = rand()%MAX;}
//MAX为最大值,其随机域为0~MAX-1
}
cout<<"主存 "<<endl;//初始化主存
for(i=0;i<MAX;i++)
{q[i]=MAX-i;cout<<q[i]<<"\t";}
for(i=0;i<m;i++)
{
p[i] = i;
page[i].flag = 1;
}//初始化页
}
void computer::showpagelist()
{
int i;
cout<<"页号"<<"\t"<<"是否在主存中"<<"\t"<<"块 号"<<"\t"<<"是否被修改过"<<"\t"<<endl;//"磁盘块号"<<"\t"<<"访问次数"<<endl;
for(i=0;i<n;i++)
{
if(page[i].flag==1) {cout<<page[i].lnumber<<"\t \t"<<page[i].flag<<"\t "<<page[i].pnumber<<"\t \t "<<page[i].write<<" "<<endl;}
else cout<<page[i].lnumber<<endl; //page[i].write<<" "<<page[i].dnumber<<" \t"<<C
}
}
void computer::showpage()
{
int i;
cout<<"页号"<<endl;
for(i=0;i<m;i++)
cout<<p[i]<<"\t";
cout<<endl;
}
void computer::transformation()
{
unsigned logicAddress,logicNumber,physicsAddress,physicsNumber;
int i,j,head=0,tail = 0;
int method,temppage=0;
int k=0;//short int times = 10000;
cout<<"请输入一个逻辑地址:";
cin>>logicAddress;
logicNumber=logicAddress/1024;//读入逻辑地址
//logicNumber = logicAddress >> 10;//得到页号
cout<<"页号为:"<<logicNumber<<endl;
// 0x03ff;//得到页内地址
//cout<<"页内地址为:"<<innerAddress<<endl;
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
{
if(page[i].flag == 1)
{
cout<<"请求的页面在主存中!"<<endl;
physicsNumber = page[i].pnumber;//由页号得到块号
physicsAddress = page[i].pnumber*1024+logicAddress;// << 10 |innerAddress;//得到物理地址
cout<<"请求的物理地址为:"<<physicsAddress<<endl;//输出物理地址
k=1; break;
}
else
{
cout<<"请求的块号不在主存中! 将进行调度处理!"<<endl;
for(i=0;i<n;i++)
if(page[i].flag == 0)
{temppage=1;method=i;break;}
if(temppage==1)
{cout<<"有空页号可以分配的主存块号为:";
srand( (unsigned)time( NULL ) );page[method].pnumber = rand()%MAX;
for(j=0;j<method;j++)
if(page[method].pnumber ==page[j].pnumber){ page[method].pnumber = rand()%MAX;}
cout<<page[method].pnumber; page[method].flag =1;
cout<<endl;
physicsAddress = page[method].pnumber*1024+logicAddress;
cout<<"请求的物理地址为:"<<physicsAddress<<endl;//输出物理地址
k=1; break;}
}
}
}
if(k==0)
{
cout<<"采用先进先出算法!"<<endl;
head=page[0].write;//根据被重写的次数zaiyebiaozhongzhao
for(i=1;i<n;i++)
if(page[i].write<head) {head=page[i].write;tail=i;}
cout<<"第"<<tail<<"页将被替换!"<<endl;
cout<<"可以分配的主存块号为:";
page[tail].lnumber=logicNumber;
srand( (unsigned)time( NULL ) );//改块号
page[tail].pnumber = rand()%MAX;
for(j=0;j<tail;j++)
if(page[tail].pnumber ==page[j].pnumber) { page[tail].pnumber = rand()%MAX;}
cout<<page[tail].pnumber;cout<<endl;
page[tail].write++;
}
}
void main()
{
char c,d;
computer os;
cout<<"页表正在初始化中...,3秒钟后为你显示页和页表!"<<endl;
Sleep(3000);
os.showpage();
os.showpagelist();
T:
os.transformation();
cout<<"是否显示页和页表?(Y/N)";
cin>>c;
switch(c)
{
case 'y':
os.showpagelist();
case 'n':
cout<<"是否继续进行请求分页?(Y/N)";
cin>>d;
if (d=='Y'||d=='y')
goto T;
else if (d=='N'||d=='n')
exit(1);
else
cout<<"输入错误!"<<endl;
default:cout<<"输入错误!"<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -