LRU最近最久未使用頁面置換演算法
阿新 • • 發佈:2019-02-20
置換策略:選擇最近最久未使用的頁面予以淘汰,系統在每個頁面設定一個訪問欄位,
用以記錄這個頁面自上次被訪問以來所經歷的時間T,當要淘汰一個頁面時,選擇T最大的頁面。
演算法思想:a[0]始終存放最近最久未使用的頁面,a[M-1]存放最近剛被使用的頁面。
(1)當待訪問頁面 b[i]在記憶體陣列 a 中下標 k 時,處理過程:
①將頁面 a[k+1]…a[M-1]全部前移一位;
②將頁面 b[i]放置在 a[M-1]位置。
(2)當待訪問頁面 b[i]不在記憶體,發生缺頁且記憶體已滿時,置換過程:
①每次置換出a[0]頁面;
②將頁面 a[1]…a[M-1]全部前移一位;
③將新頁面插入到 a[M-1]位置。
#define M 3 /*M 為系統分配給作業的主存頁面數*/
#define N 20 /*N 為要裝入作業的頁面總數*/
int a[M]; /*存放已裝入記憶體的頁號序列*/
int b[N]; /*存放作業頁號序列*/
int c[N]; /*存放被淘汰的頁號序列*/
#include <stdio.h>
int LRU(int x,int a[M]) /* 以下函式判斷第i 個頁面是否在記憶體*/
{
int i;
for(i=0;i<M;i++)
{
if(a[i]==x)
{
return i;
}
}
return -1;
}
int main()
{
int count; /*count 為缺頁總次數*/
int flag; /*flag 標識該頁是否在記憶體*/
int i,k;
int j=0;//存放被淘汰的頁號
float s;//缺頁率
printf("請輸入作業序號:\n");
for(i=0;i<N;i++)
scanf("%d",&b[i]);
for(i=0;i<M;i++)//開始M頁一定缺頁
{
a[i]=b[i];
}
count=M;
for (i=M;i<N;i++)
{
flag=LRU(b[i],a);
if(flag==-1)//不在記憶體需要置換
{
c[j]=a[0];//①每次置換出a[0] 頁面
j++;
for(k=0;k<M-1;k++)
{
a[k]=a[k+1]; //②將之後的頁面a[1...M-1]全部前移一位
}
a[M-1]=b[i]; // ③將新頁面插入到a[M-1]位置
count++;
}
else
{
for(k=flag;k<M-1;k++)
{
a[k]=a[k+1]; //②將之後的頁面a[1...M-1]全部前移一位
}
a[M-1]=b[i]; // ③將新頁面插入到a[M-1]位置
}
}
s=count*100/N;
printf("\n發生缺頁的次數=%d\n",count);
printf("\n缺頁中斷率=%0.2f%%\n",s);
printf("\n駐留記憶體的頁號分別為:");
for(i=M-1;i>=0;i--)
printf("%d, ",a[i]);
printf("\n");
printf("\n被淘汰的頁號分別為:");
for(i=0;i<j;i++)
printf("%d, ",c[i]);
printf("\n");
return 0;
}