实验二 第一题 模拟分页式存储管理中硬件的地址转换和产生缺页中断

来源:互联网 发布:高淇java300集 知乎 编辑:程序博客网 时间:2024/06/07 22:15

#include<iostream>#include<iomanip>using namespace std;struct yebiao{int sign;  long zhucunkuaihao;long cipanweizhi;yebiao(int c,long a,long b){zhucunkuaihao=a;cipanweizhi=b;sign=c;}yebiao(long a,long b){zhucunkuaihao=a;cipanweizhi=b;sign=1;}yebiao(long a){cipanweizhi=a;zhucunkuaihao=-1;sign=0;}};yebiao ing[7]={yebiao(1,5,11),yebiao(8,12),yebiao(9,13),yebiao(1,21),yebiao(22),yebiao(23),yebiao(121)};int zhucun[32];struct zhiling{int yehao;int danweihao;struct zhiling*next;//public:zhiling(int a,int b){yehao=a;danweihao=b;next=NULL;}zhiling(){next=NULL;}friend class zhilinglianbiao;};class zhilinglianbiao{zhiling*head,*p;public:    //void show(){p=head;while(p!=NULL){char q;cin>>q; cout<<p->yehao<<ing[p->yehao].sign<<endl;p=p->next;}}zhilinglianbiao(){head=NULL;p=NULL;}void charu(zhiling &a){//while(p->next!=NULL) p=p->next;if(head==NULL) {zhiling*newzhi=new zhiling();newzhi=&a;head=p=newzhi;           // cout<<p->yehao<<ing[p->yehao].zhucunkuaihao<<endl; }else {/*if(head->next==NULL||p==NULL){zhiling*newnode=&a;head->next=p=newnode;}else {zhiling*newnode=&a;p->next=newnode;p=newnode;}*/zhiling*newzhi=new zhiling();newzhi=&a;//cout<<"调试"<<newzhi->yehao<<endl;if(p==NULL)cout<<"p为空"<<endl;else cout<<"p不为空";int i;cin>>i;p->next=newzhi;//cout<<"yunxing";                             cout<<ing[p->yehao].cipanweizhi; p=newzhi;              //show();}                                   }void run(){p=head;while(p!=NULL){//cout<<ing[p->yehao].sign<<endl;       cout<<ing[p->yehao].cipanweizhi;if(ing[p->yehao].sign==1) {cout<<"第"<<p->yehao<<"页的"<<"绝对地址为"<<'\t';cout<<(ing[p->yehao].zhucunkuaihao*128+p->danweihao)<<endl;p=p->next;}else {cout<<"页号*"<<p->yehao<<"不在主存中,产生缺页中断随后调入主存"<<endl;int i;for(i=0;i<32;i++) {if(zhucun[i]==0) break;}ing[p->yehao].zhucunkuaihao=i;ing[p->yehao].sign=1;zhucun[i]=1;}}}};void main(){        cout<<"初始时页表为:"<<endl;                    cout<<"┏"<<"页号"<<"┳"<<"标志"<<"┳"<<"主存块号"<<"┳"<<"在磁盘位置"<<"┓"<<endl;for(int j=0;j<7;j++) {cout<<"┣"<<setw(4)<<j<<"╋"<<setw(4)<<ing[j].sign<<"╋"<<setw(8)<<ing[j].zhucunkuaihao<<"╋"<<setw(10)<<ing[j].cipanweizhi<<"┫"<<endl; }                             //cout<<ing[2].zhucunkuaihao<<endl;  cout<<"┗"<<"━━"<<"┻"<<"━━"<<"┻"<<"━━━━"<<"┻"<<"━━━━━"<<"┛"<<endl;zhucun[1]=1;zhucun[5]=1;zhucun[8]=1;zhucun[9]=1;zhilinglianbiao a;zhiling zh[]={zhiling(0,70),zhiling(1,50),zhiling(2,15),zhiling(3,21),zhiling(0,56),zhiling(6,40),zhiling(4,53),zhiling(5,23),zhiling(1,37),zhiling(2,78),zhiling(4,1),zhiling(6,84)};for(int i=0;i<12;i++) {a.charu(zh[i]);}cout<<"运行..."<<endl;a.run();char q;cout<<"输入任意字符退出"<<endl;cin>>q;} 

[提示]

(1)      分页式虚拟存储系统是把作业信息的副本存放在磁盘上,当作业被选中时,可把作业的开始几页先装入主存且启动执行。为此,在为作业建立页表时,应说明哪些页已在主存,哪些页尚未装入主存,页表的格式为:

 

页号

标志

主存块号

在磁盘上的位置

 

 

 

 

其中,标志----用来表示对应页是否已经装入主存,标志位=1,则表示该页已经在主存,标志位=0,则表示该页尚未装入主存。

主存块号----用来表示已经装入主存的页所占的块号。

在磁盘上的位置----用来指出作业副本的每一页被存放在磁盘上的位置。

(2)      作业执行时,指令中的逻辑地址指出了参加运算的操作存放的页号和单元号,硬件的地址转换机构按页号查页表,若该页对应标志为“1”,则表示该页已在主存,这时根据关系式:

                 绝对地址=块号×块长+单元号

计算出欲访问的主存单元地址。如果块长为2的幂次,则可把块号作为高地址部分,

把单元号作为低地址部分,两者拼接而成绝对地址。若访问的页对应标志为“0”,

则表示该页不在主存,这时硬件发“缺页中断”信号,有操作系统按该页在磁盘上

的位置,把该页信息从磁盘读出装入主存后再重新执行这条指令。

(3)      设计一个“地址转换”程序来模拟硬件的地址转换工作。当访问的页在主存时,则形成绝对地址,但不去模拟指令的执行,而用输出转换后的地址来代替一条指令的执行。当访问的页不在主存时,则输出“* 该页页号”,表示产生了一次缺页中断。该模拟程序的算法如图2-1。

 

图2-1 地址转换模拟算法

 

(4)      假定主存的每块长度为128个字节;现有一个共七页的作业,其中第0页至第3页已经装入主存,其余三页尚未装入主存;该作业的页表为:

 

0

1

5

011

1

1

8

012

2

1

9

013

3

1

1

021

4

0

 

022

5

0

 

023

6

0

 

121

 

 

 


如果作业依次执行的指令序列为:

 

操作

页号

单元号

操作

页号

单元号

+

0

70

移位

4

053

+

1

50

+

5

023

×

2

15

1

037

3

21

2

078

0

56

+

4

001

6

40

6

084

 

(5)      运行设计的地址转换程序,显示或打印运行结果。因仅模拟地址转换,并不模拟指令的执行,故可不考虑上述指令序列中的操作。

0 0
原创粉丝点击