1. 程式人生 > >LRU最近最久未使用頁面置換演算法

LRU最近最久未使用頁面置換演算法

置換策略:選擇最近最久未使用的頁面予以淘汰,系統在每個頁面設定一個訪問欄位,
用以記錄這個頁面自上次被訪問以來所經歷的時間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; }

這裡寫圖片描述