模擬頁式虛擬存儲管理中硬件的地址轉換和用先進先出調度算法處理缺頁中斷
實驗內容與步驟↓↓↓
- 編寫程序,模擬頁式虛擬存儲管理中硬件的地址轉換和用先進先出調度算法處理缺頁中斷。
- 假定主存的每塊長度為1024個字節,現有一個共7頁的作業,其副本已在磁盤上。系統為該作業分配了4個主存塊,且該作業的第0頁至第3頁已經裝入主存,其余3頁尚未裝入主存,該作業的頁表見下表。
- 如果該作業執行的指令序列如下表所示:

執行上述的指令序列來調試你所設計的程序(僅模擬指令的執行,不必考慮指令序列中具體操作的執行)
運行效果如下:
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 pageTable[pageNumQueue[0]][1]=0;//調出的頁面標志為0 35 pageTable[pageNumQueue[0]][2]=-1;//調出的頁面塊號標為-1 36 //若不在主塊中,采用先進先出調度算法 37 if(pageTable[pageNumQueue[0]][3]==1){//若修改標志為1,則需寫回磁盤 38 cout<<pageNum[i]<<" 號頁面不在主存中,產生缺頁中斷,"<<" 將"<<pageNumQueue[0]<<" 寫回磁盤,"<<" 將"<<pageNum[i]<<" 號頁面調入主存放到"<<pageNumQueue[0]<<" 號頁面所在的塊,"; 39 }else{ 40 //若修改標志為0,直接刪除 41 cout<<pageNum[i]<<" 號頁面不在主存中,產生缺頁中斷,"<<" 將"<<pageNum[i]<<" 號頁面調入主存放到"<<pageNumQueue[0]<<" 號頁面所在的塊,"; 42 } 43 pageTable[pageNum[i]][1]=1;//把調入頁面的標志位置1 44 pageTable[pageNum[i]][2]=blockQueue[0];//給調入頁面的塊號賦值 45 //pageTable[pageNumQueue[0]][1]=0;//把調出頁面的標志位置0 46 cout<<" 物理地址為:"<<pageTable[pageNum[i]][2]*1024+address[i]<<endl; 47 t=blockQueue[0];//備份主存塊號隊列的隊頭元素 48 49 //頁號隊列,主存塊號隊列的處理 50 for(int j=0;j<3;j++){ 51 pageNumQueue[j]=pageNumQueue[j+1]; 52 blockQueue[j]=blockQueue[j+1]; 53 } 54 pageNumQueue[3]=pageNum[i];//將調入內存的頁面號添加到隊尾 55 blockQueue[3]=t;//將備份的隊頭元素放置隊尾 56 } 57 //判斷操作是否為save,若是,則令修改標志為1 58 if(operation[i]=="save"){ 59 pageTable[pageNum[i]][3]=1; 60 } 61 } 62 return 0; 63 }
2019-05-02-22:17:43