算法思想:
进行缺页中断处理,中断返回后,重新执行该指令。假定主存的每块长度为64个字节,现有一个具有8页的作业系统,为其分配的4个主存块(即m=4),且最多分四块。其中第0页至第3页已经装入主存。
(4)当采用LRU算法时。则淘汰最近很少访问的页。
代码:
#include
#include
#include
#include
using namespace std;
typedef struct pageTable{
int pageNumber;
int sign=0;
int mainStorageBlockNumber;
int modifiedBit=0;
int externalAddress;
}pageTable;
typedef struct instructionTable{
string operation;
int pageNumber;
int unitNumber;
}instructionTable;
void initPageTable(vector&p){
int pageNumber[]={0,1,2,3,4,5,6,7};
int sign[]={1,1,1,1,0,0,0,0};
int mainStorageBlockNumber[]={5,8,9,10,-1,-1,-1,-1};
int modifiedBit[]={1,1,0,0,-1,-1,-1,-1};
int externalAddress[]={11,12,13,15,17,025,212,213};
pageTable s;
for(int i=0;i<8;i++){
s.pageNumber=pageNumber[i];
s.sign=sign[i];
s.mainStorageBlockNumber=mainStorageBlockNumber[i];
s.modifiedBit=modifiedBit[i];
s.externalAddress=externalAddress[i];
p.push_back(s);
}
}
void initInstructionTable(vector&p){
string operation[]={"+","+","*","存","取","-","移位","+","存","取","+","取"};
int pageNumber[]={0,1,2,3,0,6,4,5,1,7,4,6};
int unitNumber[]={40,50,16,22,54,40,52,22,34,56,2,76};
instructionTable s;
for(int i=0;i<12;i++){
s.operation=operation[i];
s.pageNumber=pageNumber[i];
s.unitNumber=unitNumber[i];
p.push_back(s);
}
}
void printPageTable(vectorp){
cout<<"页表中的内容如下:"<::iterator it=p.begin();it!=p.end();it++){
cout<pageNumber<<"\t"<sign<<"\t"<mainStorageBlockNumber<<"\t\t"<externalAddress<<"\t\t"<modifiedBit<p){
cout<<"指令表的内容如下:"<::iterator it=p.begin();it!=p.end();it++)
cout<operation<<"\t"<pageNumber<<"\t"<unitNumber<&p,vector&q){
int absoluteAddress;
vectorl;
bool flag;
for(vector::iterator it=q.begin();it!=q.end();it++){
cout<<"当前指令:"<operation<<"\t"<pageNumber<<"\t"<unitNumber<::iterator it2;
for(it2=p.begin();it2!=p.end();it2++)
if(it->pageNumber==it2->pageNumber)
break;
if(it2->sign==1){
absoluteAddress=it2->mainStorageBlockNumber*64+it->unitNumber;
cout<<"绝对地址:"<operation=="存")
it2->modifiedBit=1;
flag=true;
for(vector::iterator it3=l.begin();it3!=l.end();it3++)
if(it->pageNumber==*it3){
l.erase(it3);
l.insert(l.begin(),it->pageNumber);
flag=false;
break;
}
if(flag){
if(l.size()<4)
l.insert(l.begin(),it->pageNumber);
else{
l.pop_back();
l.insert(l.begin(),it->pageNumber);
}
}
}
else{
cout<<"该页不在主存,产生缺页中断"<pageNumber);
vector::iterator i;
for(i=p.begin();i!=p.end();i++)
if(i->pageNumber==t){
i->sign=0;
i->modifiedBit=-1;
it2->sign=1;
it2->mainStorageBlockNumber=i->mainStorageBlockNumber;
i->mainStorageBlockNumber=-1;
break;
}
absoluteAddress=it2->mainStorageBlockNumber*64+it->unitNumber;
cout<<"绝对地址:"<::iterator i=l.begin();i!=l.end();i++)
cout<<*i<<"";
cout<p;
vectorq;
cout<<"初始化页表和指令表:"<
结果: