⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 324.cpp

📁 操作系统实验的编程
💻 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 + -