目錄
一、實驗內容
熟悉頁面置換的算法,編寫LRU置換算法
- 假定一個能夠存放M個頁面的內存,當發生缺頁時,調入一個頁面,通過LRU算法求出應該置換出的頁面號。輸入一連串的頁面號,程序自動選擇調出的頁面並計算缺頁率。
- LRU算法的實現要歸功於一個寄存器。
二、LRU算法
思想:利用局部性原理,根據一個進程在執行過程中過去的頁面訪問蹤跡來推測未來的行爲。認爲過去一段時間裏不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。即利用“最近的過去”預測“最近的將來”。
選擇最近一段時間內最久不用的頁面予以淘汰。性能接近最佳算法。
三、代碼實現
#include<stdio.h>
/*數據結構*/
int block_num; /*分配的物理塊數*/
int page_num; /*要訪問的頁面序列個數*/
int page[100]; /*要訪問的頁面序列*/
int memory[10]; /*物理塊中的頁號*/
int table[100][10]; /*顯示矩陣*/
int reg[10]; /*寄存器--記錄頁面的訪問時間*/
char Que[100]; /*數組,記錄是否缺頁*/
/*主函數*/
int main()
{
int count=0; /*記錄缺頁次數*/
int i,j,k;
printf("━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("| 實驗四:LRU頁面置換算法 |\n");
printf("| |\n");
printf("| 學號:*********** |\n");
printf("| 姓名:****** |\n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━\n");
while(1)
{
printf("請輸入分配的物理塊的個數(M<=10):\n");
scanf("%d",&block_num);
if(block_num>10)
printf("輸入不合法,請重新輸入");
printf("\n");
break;
}
while(1)
{
printf("請輸入要訪問的頁面序列個數(P<=100):\n");
scanf("%d",&page_num);
if(page_num>100)
printf("輸入不合法,請重新輸入");
printf("\n");
break;
}
printf("請依次輸入要訪問的頁面序列,以空格隔開:\n");
for(i=0;i<page_num;i++)
{
scanf("%d",&page[i]);
Que[i] = 'N';
}
for(i=0;i<block_num;i++)
memory[i]=-1; //初始內存塊中默認爲空,用-1表示
//訪問頁面
for(i=0;i<page_num;i++)
{
if(i==0) //訪問的第一個頁面
{
memory[i]=page[i];
reg[i]=i;
for(j=0;j<block_num;j++)
table[i][j]=memory[j];
Que[i]='Y';
count++;
}
else
{ /*判斷新頁面號是否在物理塊中*/
for(j=0,k=0;j<block_num;j++)
{
if(memory[j]!=page[i])
k++;
else
{ /*新頁面在內存塊中*/
reg[j]=i; //刷新該頁面的訪問時間
for(int n=0;n<block_num;n++)
table[i][n]=memory[n];
}
}
}
if(k==block_num) /*新頁面不在物理塊中,缺頁*/
{
int q=0;
Que[i]='Y';
count++;
for(int j=0;j<block_num;j++)
{
if(memory[j]==-1) /*內存塊未滿*/
{
memory[j]=page[i];
reg[j]=i;
for(int n=0;n<block_num;n++)
table[i][n]=memory[n];
break;
}
else
q++;
}
if(q==block_num)/*內存塊已滿,需採用LRU置換算法選擇換出頁*/
{
int min=0; //記錄換出頁
for(int m=1;m<block_num;m++)
if(reg[m]<reg[min])
min=m;
memory[min]=page[i];
reg[min]=i; /*記錄該頁的訪問時間(新到的頁面進入之前min的位置,需將min位置的訪問時間更改)*/
for(int n=0;n<block_num;n++)
table[i][n]=memory[n];
}
}
}
/*輸出運行過程及結果*/
printf("採用LRU頁面置換算法結果如下: \n");
printf("\n");
printf("\n");
printf("頁號:");
for(i=0;i<page_num;i++)
printf("%3d",page[i]);
printf("\n");
printf("-----------------------------------------------------\n");
for(i=0;i<block_num;i++)
{
printf("塊%2d:",i);
for(j=0;j<page_num;j++)
printf("%3d",table[j][i]);
printf("\n");
}
printf("-----------------------------------------------------\n");
printf("缺頁:");
for(i=0;i<page_num;i++)
printf("%3c",Que[i]);
printf("\n");
printf("-----------------------------------------------------\n");
printf("\t缺頁次數:%d\n",count);
printf("\t缺頁率:%d/%d\n",count,page_num);
printf("-----------------------------------------------------\n");
}