缓存置换算法

缓存置换算法

image

 

缓存置换算法

 

操做系统本质上是一个多级缓存系统,从cpu寄存器,cpu一级缓存,cpu二级缓存,cpu三级缓存,主内存,硬盘,从右到左访问效率依次提高。如何在有限的资源内处理无限的数据?最理想的状况是置换出将来短时间内不会被再次访问的数据,可是咱们没法预知将来,因此只能从数据在过去的访问状况中寻找规律进行置换。算法

 

LRU

 

LRU全称是Least Recently Used,即最近最久未使用算法。其基于若是一个数据在最近一段时间没有被访问到,那么在未来它被访问的可能性也很小的思路,也就是说优先删除掉在过去一段时间内没有被访问的数据。缓存

 

利用双向链表记录数据顺序,hashmap查询数据;操作系统

  • 插入/更新:首先判断是否已经存在key。若是已经存在该key,则重置成当前的value而且将该key移动到链表的头部;若是不存在则建立一个新节点,一样将其该key移动到链表的头部而且设置hashmap的映射。若是缓存满了,则将以前最老的元素删除。
  • 查询:若是从缓存中获取到对应的key,则返回对应的数据而且将该key移动到链表的头部;
  • 删除:因为链表从头至尾保持最新到最旧的顺序,所以删除链表尾部便可;

 

image

 

LFU

 

LFU全称是Least Frequently Used,即最近最少使用算法。其基于若是一个数据在最近一段时间内使用次数不多,那么在未来一段时间内被使用的可能性也很小的思路,也就是说删除在过去一段时间内使用次数不多的数据;code

 

注意LFU和LRU算法的不一样之处:LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的。blog

 

一样利用双向链表记录数据顺序,hashmap查询数据(存储的节点还须要维护访问次数)内存

  • 插入/更新:首先判断是否已经存在key。若是已经存在该key,则重置成当前的value而且将访问频率+1,接着和链表中该节点的前置节点比较,是否须要调换位置;若是不存在则建立一个新节点,一样将其该key加入到链表的尾部而且设置hashmap的映射。若是缓存满了,则将以前最老的元素删除。
  • 查询:若是从缓存中获取到对应的key,则返回对应的数据而且将访问频率+1,接着和链表中该节点的前置节点比较,是否须要调换位置;
  • 删除:因为链表从头至尾保持最新到最旧的顺序,所以删除链表尾部便可;

 

image

 

FIFO

 

FIFO全称是First in First out,即先进先出算法。其基于若是一个数据最早进入缓存中,则应该最先淘汰掉的思路,也就是说优先删除掉最早保存到链表中的数据;资源

 

利用双向链表记录数据顺序,hashmap查询数据;hash

  • 插入/更新:首先判断是否已经存在key。若是已经存在该key,则重置成当前的value;若是不存在则建立一个新节点,一样将其该key移动到链表的尾部而且设置hashmap的映射。若是缓存满了,则将以前最早进入缓存的元素删除。
  • 查询:若是从缓存中获取到对应的key,则返回对应的数据,不会在链表中移动key的顺序;
  • 删除:因为链表从头至尾保持最旧到最新的顺序,所以删除链表头部便可;

 

image

 

image

相关文章
相关标签/搜索