LRU页面调度算法的实现

用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]--;       //调页,让比当前命中的页号大的标记--,说明新的一轮来了,改变标记                           
}

b[flags][1]=2;
count++;
}
}
}
}


}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LRU算法是一种缓存算法,它的全称是Least Recently Used,即最近最少使用算法。该算法的思想是,当缓存满时,淘汰最近最少使用的数据。这种算法可以有效地提高缓存的命中率,从而提高系统性能。 下面是一个简单的LRU页面调度算法的模拟程序,代码如下: ```python class LRUCache: def __init__(self, capacity): self.capacity = capacity self.cache = {} self.lru_list = [] def get(self, key): if key in self.cache: # 更新访问记录 self.lru_list.remove(key) self.lru_list.append(key) return self.cache[key] else: return -1 def put(self, key, value): if key in self.cache: # 更新访问记录 self.lru_list.remove(key) self.lru_list.append(key) self.cache[key] = value else: # 淘汰最近最少使用的数据 if len(self.cache) >= self.capacity: del self.cache[self.lru_list[0]] del self.lru_list[0] self.cache[key] = value self.lru_list.append(key) # 测试程序 cache = LRUCache(3) cache.put(1, 1) cache.put(2, 2) cache.put(3, 3) print(cache.get(1)) # 返回 1 cache.put(4, 4) print(cache.get(2)) # 返回 -1 cache.put(5, 5) print(cache.get(3)) # 返回 -1 print(cache.get(4)) # 返回 4 print(cache.get(5)) # 返回 5 ``` 在这个程序中,LRUCache类表示一个缓存对象,它包含三个成员变量:capacity表示缓存的容量,cache是一个字典,用于存储缓存数据,lru_list是一个列表,用于记录最近访问的数据。 代码中的get()方法用于查询缓存中是否存在指定的键,如果存在,则更新访问记录,并返回对应的值;否则返回-1。put()方法用于向缓存中添加数据,如果数据已经存在,则更新访问记录;否则,先检查缓存是否已满,如果已满,则淘汰最近最少使用的数据,并将新数据添加到缓存中。 在测试程序中,我们创建了一个容量为3的缓存对象,向其中添加了三个数据,然后查询了第一个数据,再添加两个数据,最后查询了三个数据。运行结果符合预期,证明了LRU页面调度算法的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值