#include<iostream.h>
#include<stdlib.h>
#include<iomanip.h>
#include"windows.h"
#include"os.h"
#define n 64//實驗中假定主存的長度
#define m 4//實驗中假定每個作業分得主存塊塊數
int p[m];//定義頁
struct
{
short int lnumber;//頁號
short int flag;//表示該頁是否在主存,“1”表示在主存,“0”表示不在主存
short int pnumber;//該頁所在主存塊的塊號
short int write;//該頁是否被修改過,“1”表示修改過,“0”表示沒有修改過
short int dnumber;//該頁存放在磁盤上的位置,即磁盤塊號
short int times;//被訪問的次數,用于LRU算法
}page[n];//定義頁表
//各個函數的實現如下:
買粉絲puter::買粉絲puter()
{
int i;
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;
page[i].times = 0;
}//初始化頁表
for(i=0;i<m;i++)
{
page[i].pnumber = i;
}
for(i=0;i<m;i++)
{
p[i] = i;
page[i].flag = 1;
}//初始化頁
}
void 買粉絲puter::showpagelist()
{
int i;
買粉絲ut<<"頁號"<<"\t"<<"是否在主存中"<<"\t"<<"塊 號"<<"\t"<<"是否被修改過"<<"\t"<<"磁盤塊號"<<"\t"<<"訪問次數"<<endl;
for(i=0;i<n;i++)
{
買粉絲ut<<page[i].lnumber<<"\t"<<page[i].flag<<" "<<page[i].pnumber<<"\t"<<page[i].write<<" "<<page[i].dnumber<<" \t"<<page[i].times<<endl;
}
}
void 買粉絲puter::showpage()
{
int i;
for(i=0;i<m;i++)
{
買粉絲ut<<"\t"<<p[i];
}
買粉絲ut<<endl;
}
void 買粉絲puter::transformation()
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
int i,head=0,fail = 0;
int method,temppage=0;
short int times = 10000;
買粉絲ut<<"請輸入一個邏輯地址(四位十六進制數):";
cin>>hex>>logicAddress;//讀入邏輯地址
logicNumber = logicAddress >> 10;//得到頁號
買粉絲ut<<"頁號為:"<<logicNumber<<endl;
innerAddress = logicAddress & 0x03ff;//得到頁內地址
買粉絲ut<<"頁內地址為:"<<innerAddress<<endl;
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
{
if(page[i].flag == 1)
{
買粉絲ut<<"請求的頁面在主存中!"<<endl;
page[i].times++;
physicsNumber = page[i].pnumber;//由頁號得到塊號
買粉絲ut<<"請求的主存塊號為:"<<physicsNumber<<endl;
physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址
買粉絲ut<<"請求的物理地址為:"<<physicsAddress<<endl;//輸出物理地址
break;
}
else
{
買粉絲ut<<"請求的頁面不在主存中! 將進行缺頁中斷處理!"<<endl<<"請選擇算法!"<<endl;
買粉絲ut<<"1.先進先出"<<endl<<"2.最近最少用"<<endl<<"請選擇置換算法:";
cin>>method;
if(method == 1) //采用先進先出算法
{
買粉絲ut<<"采用先進先出算法!"<<endl;
fail = p[head];
買粉絲ut<<"第"<<fail<<"頁將被替換!"<<endl;
p[head] = logicNumber;
head = (head+1) % m;
if(page[fail].write == 1)
買粉絲ut<<"第"<<fail<<"頁曾被修改過!"<<endl;
page[fail].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[fail].pnumber;
page[fail].pnumber = 10000;
page[logicNumber].times++;
break;
}
else if(method == 2) //采用最近最少用算法
{
買粉絲ut<<"采用最近最少用算法!"<<endl;
for(i=0;i<n;i++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
{
times = page[i].times;
temppage = page[i].lnumber;
}
}
}
買粉絲ut<<"第"<<temppage<<"頁將被替換!"<<endl;
for(i=0;i<m;i++)
{
if(p[i] == temppage)
{
p[i] = logicNumber;
}
}
if(page[temppage].write == 1)
買粉絲ut<<"第"<<temppage<<"頁曾被修改過!"<<endl;
page[temp