标签:图片 page ble name 管理 修改 地址转换 编写 src
模拟页式虚拟存储管理中硬件的地址转换和用先进先出调度算法处理缺页中断
实验内容与步骤↓↓↓
页号 |
标志 |
主存块号 |
修改标志 |
在磁盘上的位置 |
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