码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-05-02 23:13:39      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:图片   page   ble   name   管理   修改   地址转换   编写   src   

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

 

实验内容与步骤↓↓↓

  • 编写程序,模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断。
  • 假定主存的每块长度为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

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

标签:图片   page   ble   name   管理   修改   地址转换   编写   src   

原文地址:https://www.cnblogs.com/CodeStudio7/p/10803594.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!