操作系统PageIn、PageOut所用到的LRU策略(原理+实现)

本文介绍了LRU(Least Recently Used)缓存淘汰策略,通过双向链表和哈希表来高效管理数据。LRU利用局部性原理,删除最近最少使用的数据。详细阐述了LRU的工作原理,并描述了如何在缓存满时删除数据的过程,包括数据的插入、查找和淘汰操作。
摘要由CSDN通过智能技术生成

一、什么是LRU缓存策略
LRU(Least Recently Used)近期最少使用算法。它的原理就是,缓存一定量的数据,当缓存数量超过设置的阈值时就删除一部分旧的数据。
那么我们怎样判定旧数据呢???根据局部性原理,距离当前最久没有被访问过的数据应该被淘汰。

二、LRU缓存策略实现原理
1、使用双向链表记录数据的被使用的时间
因为我们要删除最久没有被访问的数据,为了保证效率,我们在缓存中维护一个双向链表,该链表将缓存中的数据按照访问时间从新到旧排列起来。
当我们需要访问一个数据的时候,如果缓存中已经缓存了这个数据,那么我们就将该数据从缓存的双向链表中摘除,然后再重新放入到双向链表的表头。
如果缓存中没有我们需要的数据,那么我们可以在外部获得数据,然后将数据放入到缓存中,此过程中会将新数据插入到双向链表的表头。

2、使用hash表保证缓存中数据的访问速度
因为链表进行查找是O(n),比较慢。因此为了提高效率,我们除了将数据维护在一个双向链表中,同时还将数据维护在一个hash表中,这时我们访问的效率就变成了O(1)。

3、原理如图:
这里写图片描述
首先明白,hash表和双向链表用的是同一个结点。双向链表按照访问时间将这些结点串起来,就是图中黑色的箭头。hash表按照key值将这些结点串起来,并且使用拉链法解决冲突,比如紫色的箭头。

4、向缓存中插入一个结点
首先到hash表中去找:
如果找到的话,再去双向链表中将这个结点移到双向链表的头部。
如果没找到的话,则将这个数据插入到双向链表的头部,同时也插入到hash表中。如果这时候缓存的数量已经超过阈值,则就将双向链表的最后一个结点从链表中移除(注意不是删除),然后再将这个移除的结点,从hash表也移除,最后再删除这个结点。因为hash表和双向链表使用的是同一个结点,所以必须等到两边都移除后才能删除。

三、模拟实现LRU缓存

#include<iostream>
#include<iomanip>
using namespace std;

//缓存链表、hash表的结点类型
typedef struct SNode{
	int iKey;
	char cData;//此处可能是1K的数据量
	//【出于演示效果和运行效率使用char来代替】
	SNode* pHashPrev;//指向hash链表的前一个结点
	SNode* pHashNext;//指向hash链表的后一个结点
	SNode* pLstPrev;//指向缓存双向链表的前一个结点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值