缓存置换算法
缓存置换算法
缓存置换算法
操作系统本质上是一个多级缓存系统,从cpu寄存器,cpu一级缓存,cpu二级缓存,cpu三级缓存,主内存,硬盘,从右到左访问效率依次提升。如何在有限的资源内处理无限的数据?最理想的情况是置换出未来短期内不会被再次访问的数据,但是我们无法预知未来,所以只能从数据在过去的访问情况中寻找规律进行置换。
LRU
LRU全称是Least Recently Used,即最近最久未使用算法。其基于如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小
的思路,也就是说优先删除掉在过去一段时间内没有被访问的数据。
利用双向链表记录数据顺序,hashmap查询数据;
-
插入/更新:首先判断是否已经存在key。如果已经存在该key,则重置成当前的value并且将该key移动到链表的头部;如果不存在则创建一个新节点,同样将其该key移动到链表的头部并且设置hashmap的映射。如果缓存满了,则将之前最老的元素删除。
-
查询:如果从缓存中获取到对应的key,则返回对应的数据并且将该key移动到链表的头部;
-
删除:由于链表从头到尾保持最新到最旧的顺序,因此删除链表尾部即可;
LFU
LFU全称是Least Frequently Used,即最近最少使用算法。其基于如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小
的思路,也就是说删除在过去一段时间内使用次数很少的数据;
注意LFU和LRU算法的不同之处:LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。
同样利用双向链表记录数据顺序,hashmap查询数据(存储的节点还需要维护访问次数)
-
插入/更新:首先判断是否已经存在key。如果已经存在该key,则重置成当前的value并且将访问频率+1,接着和链表中该节点的前置节点比较,是否需要调换位置;如果不存在则创建一个新节点,同样将其该key加入到链表的尾部并且设置hashmap的映射。如果缓存满了,则将之前最老的元素删除。
-
查询:如果从缓存中获取到对应的key,则返回对应的数据并且将访问频率+1,接着和链表中该节点的前置节点比较,是否需要调换位置;
-
删除:由于链表从头到尾保持最新到最旧的顺序,因此删除链表尾部即可;
FIFO
FIFO全称是First in First out,即先进先出算法。其基于如果一个数据最先进入缓存中,则应该最早淘汰掉
的思路,也就是说优先删除掉最先保存到链表中的数据;
利用双向链表记录数据顺序,hashmap查询数据;
-
插入/更新:首先判断是否已经存在key。如果已经存在该key,则重置成当前的value;如果不存在则创建一个新节点,同样将其该key移动到链表的尾部并且设置hashmap的映射。如果缓存满了,则将之前最先进入缓存的元素删除。
-
查询:如果从缓存中获取到对应的key,则返回对应的数据,不会在链表中移动key的顺序;
-
删除:由于链表从头到尾保持最旧到最新的顺序,因此删除链表头部即可;