?? 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 + -