模拟分页式虚拟存储管理中硬件的地址转换和缺页中断 选择页面调度算法处理缺页中断
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
};
class work
{
private:
long int Page;
int sym;
long int inum;
int change;
long int onum;
public:
work(){}
work(long
int
P,
int
s,long
int
i,int
c,long
int
o):Page(P),sym(s),inum(i),change(c),onum(o){}
INS[3].setope ("存"); INS[3].setpage(3); INS[3].setunit(21);
INS[4].setope ("取"); INS[4].setpage(0); INS[4].setunit(56);
INS[5].setope ("-"); INS[5].setpage(6); INS[5].setunit(40);
开始
取一条指令
取指令中访问的页号-->L
查页表
是
否
该页标志=1?
形成绝对地址 是
置 L 页修改标志为“1”
是存指令? 否
输出绝对地址
有后继指令?
是 取下一条指令
否 结束
是
输出 j,修改 L 页的标志及 在内存中的地址,输出 L
否 J 页修改标志为 1?
j=p[k]
P[k]=L,k=(k==m-1)?0:(k+1) 修改页表
操作系统实验二(第一题) 一.实验内容
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断。 二.实验目的
在计算机系统总,为了提高主存利用率,往往把辅助存储器作为主存储器的扩充,使多 道运行的作业的全部逻辑地址空间综合可以超出主存的绝对地址空间。用这种办法扩充的主 存储区成为虚拟存储器。 三.实验题目
INS[5].setope ("-"); INS[5].setpage(6); INS[5].setunit(40);
INS[6].setope ("移位"); INS[6].setpage(4); INS[6].setunit(53);
INS[7].setope ("+"); INS[7].setpage(5); INS[7].setunit(23);
int getsym(){return sym;} long int getinum(){return inum;} int getchange(){return change;} long int getonum(){return onum;}
};
void diaodu(work *w,ins * i,int numofins) {
};
void diaodu(work *w,ins * i,int numofins) { for(int j=0;j<numofins;j++)
{
long int tempofk;
long int a =i[j].getpage(); for(int k=0;k<7;k++)
//7 是页表的页数
if(w[k].getPage()!=a)
INS[8].setope ("存"); INS[8].setpage(1); INS[8].setunit(37);
INS[9].setope ("取"); INS[9].setpage(2); INS[9].setunit(78);
INS[10].setope ("+"); INS[10].setpage(4); INS[10].setunit(1);
模拟分页式存储管理中硬件的地址转换和产生缺页中断。
开始
取一条指 令
取指令中访问的页号
查页表
是
否
该也标志=1?
形成绝对地址 输出绝对地址
输出“*”页号表示 发生缺页中断
有后继指令?
取下一条指令
结束
四.程序清单 //
// 操作实验二.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include<iostream> #include<string> #include<fstream> using namespace std;
void setPage(long int P){ Page=P;}
void setsym( int s){ sym=s;}
void setinum(long int i){ inum=i;} void setchange(int c){ change=c;} void setonum(long int o){ onum=o;} long int getPage(){return Page;}
INS[2].setpage(2); INS[2].setunit(15);
INS[3].setope ("存"); INS[3].setpage(3); INS[3].setunit(21);
INS[4].setope ("取"); INS[4].setpage(0); INS[4].setunit(56);
void setonum(long int o){ onum=o;} long int getPage(){return Page;}
int getsym(){return sym;} long int getinum(){return inum;} long int getonum(){return onum;}
else if(w[iii].getsym()==1) {
if(i[ii].getope()=="存") w[iii].setchange (1);
cout<<" 绝 对 地 址 谓 : "<<w[iii].getinum()*128+i[ii].getunit()<<" "<<w[iii].getinum()<<" "<<i[ii].getunit()<<endl;
p[k]=L; k=(k==m-1)?0:(k+1); }
来自百度文库
cout<<"调入主存的页:"; for(int iiii=0;iiii<m;iiii++) {
int kk=p[iiii]; cout<<w[kk].getPage()<<" "; } cout<<endl<<"...................................................."<<endl; }
INS[11].setope ("存"); INS[11].setpage(6); INS[11].setunit(84);
work*W =new work[7]; ifstream in("g://operate1.txt");
long int p; int s;
long int i;
long int o;
class ins { private:string ope; long int page; long int unit; public: ins(){ } ins(string o,long int p,long int u):ope(o),page(p),unit(u){} void setope(string o){ ope=o;} void setpage(long int p){ page=p;} void setunit(long int u){ unit=u;} string getope(){return ope;} long int getpage(){return page;} long int getunit(){return unit;}
} else {
cout<<"产生中断"<<"*"<<endl; int j=p[k]; w[j].setsym(0); w[j].setinum(-1); w[L].setsym(1); w[L].setinum(rand()%20+10); if(w[j].getchange ()==1)
cout<<"第"<<j<<"页需要重新写入磁盘中"<<" 第"<<L<<"页被调 入主存"<<endl;
INS[6].setope ("移位"); INS[6].setpage(4); INS[6].setunit(53);
INS[7].setope ("+"); INS[7].setpage(5); INS[7].setunit(23);
continue;
else
{
tempofk=k;
break;
}
if(w[tempofk].getsym()==1) cout<<"绝对地址:"<<w[tempofk].getinum()*128+i[j].getunit()<<"
地址为:"<<w[tempofk].getonum()<<" "<<"操作为:"<<i[j].getope()<<endl; else cout<<"*"<<"发生缺页中断"<<endl;
九.程序清单 / 操作系统实验二.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include<iostream> #include<string> #include<fstream> using namespace std;
class ins { private:string ope; long int page; long int unit; public: ins(){ } ins(string o,long int p,long int u):ope(o),page(p),unit(u){} void setope(string o){ ope=o;} void setpage(long int p){ page=p;} void setunit(long int u){ unit=u;} string getope(){return ope;} long int getpage(){return page;} long int getunit(){return unit;}
}
"<<"磁盘
}
int main() {
ins*INS=new ins[12];
INS[0].setope ("+"); INS[0].setpage(0); INS[0].setunit(70); INS[1].setope ("+"); INS[1].setpage(1); INS[1].setunit(50); INS[2].setope ("×");
};
class work { private:
long int Page; int sym; long int inum; long int onum; public: work(){} work(long int P, int s,long int i,long int o):Page(P),sym(s),inum(i),onum(o){} void setPage(long int P){ Page=P;} void setsym( int s){ sym=s;} void setinum(long int i){ inum=i;}
const int m=4; int p[m]={0,1,2,3}; int k=0; int tempofins=12; for(int ii=0;ii<tempofins;ii++) {
int L=i[ii].getpage(); for(int iii=0;iii<7;iii++)
if(w[iii].getPage()!=L) continue;
}
int main() {
ins*INS=new ins[12];
INS[0].setope ("+"); INS[0].setpage(0); INS[0].setunit(70); INS[1].setope ("+"); INS[1].setpage(1); INS[1].setunit(50); INS[2].setope ("×"); INS[2].setpage(2); INS[2].setunit(15);
for(int jj=0;jj<7 ;jj++) {
in>>p;in>>s;in>>i;in>>o ; W[jj].setPage(p); W[jj].setsym(s);W[jj].setinum(i);W[jj].setonum(o);
} diaodu(W,INS,12); } 五.结果显示
操作系统实验二(第二题) 一.用先进先出(FIFO)
class work
{
private:
long int Page;
int sym;
long int inum;
int change;
long int onum;
public:
work(){}
work(long
int
P,
int
s,long
int
i,int
c,long
int
o):Page(P),sym(s),inum(i),change(c),onum(o){}
INS[3].setope ("存"); INS[3].setpage(3); INS[3].setunit(21);
INS[4].setope ("取"); INS[4].setpage(0); INS[4].setunit(56);
INS[5].setope ("-"); INS[5].setpage(6); INS[5].setunit(40);
开始
取一条指令
取指令中访问的页号-->L
查页表
是
否
该页标志=1?
形成绝对地址 是
置 L 页修改标志为“1”
是存指令? 否
输出绝对地址
有后继指令?
是 取下一条指令
否 结束
是
输出 j,修改 L 页的标志及 在内存中的地址,输出 L
否 J 页修改标志为 1?
j=p[k]
P[k]=L,k=(k==m-1)?0:(k+1) 修改页表
操作系统实验二(第一题) 一.实验内容
模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断。 二.实验目的
在计算机系统总,为了提高主存利用率,往往把辅助存储器作为主存储器的扩充,使多 道运行的作业的全部逻辑地址空间综合可以超出主存的绝对地址空间。用这种办法扩充的主 存储区成为虚拟存储器。 三.实验题目
INS[5].setope ("-"); INS[5].setpage(6); INS[5].setunit(40);
INS[6].setope ("移位"); INS[6].setpage(4); INS[6].setunit(53);
INS[7].setope ("+"); INS[7].setpage(5); INS[7].setunit(23);
int getsym(){return sym;} long int getinum(){return inum;} int getchange(){return change;} long int getonum(){return onum;}
};
void diaodu(work *w,ins * i,int numofins) {
};
void diaodu(work *w,ins * i,int numofins) { for(int j=0;j<numofins;j++)
{
long int tempofk;
long int a =i[j].getpage(); for(int k=0;k<7;k++)
//7 是页表的页数
if(w[k].getPage()!=a)
INS[8].setope ("存"); INS[8].setpage(1); INS[8].setunit(37);
INS[9].setope ("取"); INS[9].setpage(2); INS[9].setunit(78);
INS[10].setope ("+"); INS[10].setpage(4); INS[10].setunit(1);
模拟分页式存储管理中硬件的地址转换和产生缺页中断。
开始
取一条指 令
取指令中访问的页号
查页表
是
否
该也标志=1?
形成绝对地址 输出绝对地址
输出“*”页号表示 发生缺页中断
有后继指令?
取下一条指令
结束
四.程序清单 //
// 操作实验二.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include<iostream> #include<string> #include<fstream> using namespace std;
void setPage(long int P){ Page=P;}
void setsym( int s){ sym=s;}
void setinum(long int i){ inum=i;} void setchange(int c){ change=c;} void setonum(long int o){ onum=o;} long int getPage(){return Page;}
INS[2].setpage(2); INS[2].setunit(15);
INS[3].setope ("存"); INS[3].setpage(3); INS[3].setunit(21);
INS[4].setope ("取"); INS[4].setpage(0); INS[4].setunit(56);
void setonum(long int o){ onum=o;} long int getPage(){return Page;}
int getsym(){return sym;} long int getinum(){return inum;} long int getonum(){return onum;}
else if(w[iii].getsym()==1) {
if(i[ii].getope()=="存") w[iii].setchange (1);
cout<<" 绝 对 地 址 谓 : "<<w[iii].getinum()*128+i[ii].getunit()<<" "<<w[iii].getinum()<<" "<<i[ii].getunit()<<endl;
p[k]=L; k=(k==m-1)?0:(k+1); }
来自百度文库
cout<<"调入主存的页:"; for(int iiii=0;iiii<m;iiii++) {
int kk=p[iiii]; cout<<w[kk].getPage()<<" "; } cout<<endl<<"...................................................."<<endl; }
INS[11].setope ("存"); INS[11].setpage(6); INS[11].setunit(84);
work*W =new work[7]; ifstream in("g://operate1.txt");
long int p; int s;
long int i;
long int o;
class ins { private:string ope; long int page; long int unit; public: ins(){ } ins(string o,long int p,long int u):ope(o),page(p),unit(u){} void setope(string o){ ope=o;} void setpage(long int p){ page=p;} void setunit(long int u){ unit=u;} string getope(){return ope;} long int getpage(){return page;} long int getunit(){return unit;}
} else {
cout<<"产生中断"<<"*"<<endl; int j=p[k]; w[j].setsym(0); w[j].setinum(-1); w[L].setsym(1); w[L].setinum(rand()%20+10); if(w[j].getchange ()==1)
cout<<"第"<<j<<"页需要重新写入磁盘中"<<" 第"<<L<<"页被调 入主存"<<endl;
INS[6].setope ("移位"); INS[6].setpage(4); INS[6].setunit(53);
INS[7].setope ("+"); INS[7].setpage(5); INS[7].setunit(23);
continue;
else
{
tempofk=k;
break;
}
if(w[tempofk].getsym()==1) cout<<"绝对地址:"<<w[tempofk].getinum()*128+i[j].getunit()<<"
地址为:"<<w[tempofk].getonum()<<" "<<"操作为:"<<i[j].getope()<<endl; else cout<<"*"<<"发生缺页中断"<<endl;
九.程序清单 / 操作系统实验二.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include<iostream> #include<string> #include<fstream> using namespace std;
class ins { private:string ope; long int page; long int unit; public: ins(){ } ins(string o,long int p,long int u):ope(o),page(p),unit(u){} void setope(string o){ ope=o;} void setpage(long int p){ page=p;} void setunit(long int u){ unit=u;} string getope(){return ope;} long int getpage(){return page;} long int getunit(){return unit;}
}
"<<"磁盘
}
int main() {
ins*INS=new ins[12];
INS[0].setope ("+"); INS[0].setpage(0); INS[0].setunit(70); INS[1].setope ("+"); INS[1].setpage(1); INS[1].setunit(50); INS[2].setope ("×");
};
class work { private:
long int Page; int sym; long int inum; long int onum; public: work(){} work(long int P, int s,long int i,long int o):Page(P),sym(s),inum(i),onum(o){} void setPage(long int P){ Page=P;} void setsym( int s){ sym=s;} void setinum(long int i){ inum=i;}
const int m=4; int p[m]={0,1,2,3}; int k=0; int tempofins=12; for(int ii=0;ii<tempofins;ii++) {
int L=i[ii].getpage(); for(int iii=0;iii<7;iii++)
if(w[iii].getPage()!=L) continue;
}
int main() {
ins*INS=new ins[12];
INS[0].setope ("+"); INS[0].setpage(0); INS[0].setunit(70); INS[1].setope ("+"); INS[1].setpage(1); INS[1].setunit(50); INS[2].setope ("×"); INS[2].setpage(2); INS[2].setunit(15);
for(int jj=0;jj<7 ;jj++) {
in>>p;in>>s;in>>i;in>>o ; W[jj].setPage(p); W[jj].setsym(s);W[jj].setinum(i);W[jj].setonum(o);
} diaodu(W,INS,12); } 五.结果显示
操作系统实验二(第二题) 一.用先进先出(FIFO)