模擬頁式虛擬存儲管理中硬體的地址轉換和用先進先出調度演算法處理缺頁中斷 ...
模擬頁式虛擬存儲管理中硬體的地址轉換和用先進先出調度演算法處理缺頁中斷
實驗內容與步驟↓↓↓
- 編寫程式,模擬頁式虛擬存儲管理中硬體的地址轉換和用先進先出調度演算法處理缺頁中斷。
- 假定主存的每塊長度為1024個位元組,現有一個共7頁的作業,其副本已在磁碟上。系統為該作業分配了4個主存塊,且該作業的第0頁至第3頁已經裝入主存,其餘3頁尚未裝入主存,該作業的頁表見下表。
- 如果該作業執行的指令序列如下表所示:
![](https://img2018.cnblogs.com/blog/1528081/201905/1528081-20190503091852315-1544617050.png)
執行上述的指令序列來調試你所設計的程式(僅模擬指令的執行,不必考慮指令序列中具體操作的執行)
運行效果如下:
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