欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

先进先出调度算法处理缺页中断

程序员文章站 2023-10-31 21:35:10
模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断 ......

模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断

 

实验内容与步骤↓↓↓

  • 编写程序,模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断。
  • 假定主存的每块长度为1024个字节,现有一个共7页的作业,其副本已在磁盘上。系统为该作业分配了4个主存块,且该作业的第0页至第3页已经装入主存,其余3页尚未装入主存,该作业的页表见下表。

 

页号

标志

主存块号

修改标志

在磁盘上的位置

0

1

5

0

010

1

1

8

0

012

2

1

9

0

013

3

1

1

0

021

4

0

 

0

022

5

0

 

0

023

6

0

 

0

125

 

  • 如果该作业执行的指令序列如下表所示:

 

 

操作

页号

页内地址

操作

页号

页内地址

+

0

072

+

4

056

+

1

050

5

023

2

015

存(save)

1

037

存(save)

3

026

+

2

078

取(load)

0

056

4

001

6

040

存(save)

6

086

 

  执行上述的指令序列来调试你所设计的程序(仅模拟指令的执行,不必考虑指令序列中具体操作的执行)



   运行效果如下:

  先进先出调度算法处理缺页中断


 

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 int main(){
 5     string *operation;//定义“操作“指针
 6     int num,*pagenum,*address,t;//定义操作个数,页号,页内地址
 7     int pagetable[7][5]={0,1,5,0,10,
 8                          1,1,8,0,12,
 9                          2,1,9,0,13,
10                          3,1,1,0,21,
11                          4,0,-1,0,22,
12                          5,0,-1,0,23,
13                          6,0,-1,0,125};//定义页表并赋初值
14     int pagenumqueue[4]={0,1,2,3};//页号队列
15     int blockqueue[4]={5,8,9,1};//主存块号队列
16     cout<<"请输入操作个数:";
17     cin>>num;
18     operation=new string[num];
19     pagenum=new int[num];
20     address=new int[num];
21     //循环num个输入操作,页号,页内地址
22     cout<<"请依次输入"<<num<<"个操作以及其所对应的页号和页内地址"<<endl;
23     for(int i=0;i<num;i++){
24         cin>>operation[i];
25         cin>>pagenum[i];
26         cin>>address[i];
27     }
28     //---------------调度算法---------------
29     for(int i=0;i<num;i++){
30         //判断操作所对应的页面是否在主存块中
31         if(pagetable[pagenum[i]][1]==1){//若在主块中,直接输出物理地址
32             cout<<"物理地址为:"<<pagetable[pagenum[i]][2]*1024+address[i]<<endl;
33         }else{
34             //若不在主块中,采用先进先出调度算法
35             if(pagetable[pagenumqueue[0]][3]==1){//若修改标志为1,则需写回磁盘
36                 pagetable[pagenumqueue[0]][1]=0;//调出的页面标志为0
37                 pagetable[pagenumqueue[0]][2]=-1;//调出的页面块号标为-1
38                 cout<<"将"<<pagenumqueue[0]<<"号页面写回磁盘,";
39             }else{
40                 //若修改标志为0,直接删除
41                 pagetable[pagenumqueue[0]][1]=0;//调出的页面标志为0
42                 pagetable[pagenumqueue[0]][2]=-1;//调出的页面块号标为-1
43                 cout<<"将"<<pagenumqueue[0]<<"号页面从内存中删除,";
44             }
45             cout<<"将"<<pagenum[i]<<"号页面调入内存,";
46             pagetable[pagenum[i]][1]=1;//把调入页面的标志位置1
47             pagetable[pagenum[i]][2]=blockqueue[0];//给调入页面的块号赋值
48             //pagetable[pagenumqueue[0]][1]=0;//把调出页面的标志位置0
49             cout<<"物理地址为:"<<pagetable[pagenum[i]][2]*1024+address[i]<<endl;
50             t=blockqueue[0];//备份主存块号队列的队头元素
51 
52             //页号队列,主存块号队列的处理
53             for(int j=0;j<3;j++){
54                 pagenumqueue[j]=pagenumqueue[j+1];
55                 blockqueue[j]=blockqueue[j+1];
56             }
57             pagenumqueue[3]=pagenum[i];//将调入内存的页面号添加到队尾
58             blockqueue[3]=t;//将备份的队头元素放置队尾
59         }
60         //判断操作是否为save,若是,则令修改标志为1
61         if(operation[i]=="save"){
62             pagetable[pagenum[i]][3]=1;
63         }
64     }
65     return 0;
66 }

2019-05-02-22:17:43