用Java实现操作系统的页面调度算法--LRU
页面调度算法--LRU,即按照最近最早使用的原则来调页。下面的例子是页块数为3,页面访问序列为20的LRU,返回的是缺页率。
原理:先把页块分别标记为0,1,2,其中0表示最近最早使用的。每进行一次调页时,首先遍历页块,
如果命中,那么就把页块标记大于命中页块标记的页标记--,并当前页块标记为2,表示这是最新调用的。
如果不命中,那么就把页块标记为0的页找出来,并赋值为当前页面访问的值。并且把页块标记大于命中页块标记的页标记--,并当前页块标记为2,表示这是最新调用的。
public class LRU_algorithm {
static int[]a={1,2,5,6,0,3,6,5,3,6,5,6,0,4,2,7,0,4,3,5};static int[][]b=new int[3][2];
static int count=0;
public static void main(String[] args) {
// TODO 自动生成的方法存根
LRU();
System.out.println(count);
System.out.println("缺页率为"+(count+0.0)/20);
}
public static void LRU(){
b[0][0]=a[0];b[0][1]=0; //页块数为3,最早的页标记为0
b[1][0]=a[1];b[1][1]=1;
b[2][0]=a[2];b[2][1]=2; //最近调用的页标记为2
count=3; //缺页次数,页块数为3
for(int i=3;i<20;i++){ //输入的页面访问序列为20
int flags=0; //判断哪个页是最近最早使用的
for(int j=0;j<3;j++){
if(b[j][0]==a[i]){ //如果命中,那么标记变为2,break
for(int r=0;r<3;r++){
if(b[j][1]<b[r][1]) b[r][1]--; //让比当前命中的页号大的标记--,说明新的一轮来了,改变标记
}
b[j][1]=2;
break;
}
if(b[j][1]==0){ //找出最近最早使用的页,其标记为0;
flags=j;
}
if(j==2){ //如果不命中,那么就取之前找出的最近最早使用的页替换,并标记为2,缺页数++
b[flags][0]=a[i];
for(int r=0;r<3;r++){
if(b[flags][1]<b[r][1]) b[r][1]--; //调页,让比当前命中的页号大的标记--,说明新的一轮来了,改变标记
}
count++;
}
}
}
}
}