首页 > 编程知识 正文

缓存算法,缓存雪崩

时间:2023-05-06 06:31:13 阅读:127862 作者:1591

LRU是最近最早不使用的、最常用于页面替换算法的LRU,它服务于基于虚拟页面的存储管理。

LRU算法的提出基于这样的事实:在前一个指令中频繁使用的页面很可能在后一个指令中频繁使用。 反过来说,长时间不使用的页面,今后很可能长时间不使用。

最近设计并实现了将LRU缓存降至最低的数据结构。 必须支持get和set操作。

如果缓存中存在get(key ) ——密钥,则获取密钥值(始终为正数);如果不存在,则返回-1。

如果set(key,value ) ——键不存在,则设置或插入值。 缓存达到容量后,在插入新项之前,必须禁用最近使用的项。

分析:可以使用HashMap和双向链表实现LRU缓存。 将HashMap、get的时间设为o(1); 通过双向链表,进行节点的添加/删除操作o(1)。

定义双向链表的节点:

类节点{

int key;

int value;

无代码;

节点下一步;

公共节点(intkey,int value ) {

this.key=key;

this.value=value;

}

}

公共类lrucache {

int容量;

HashMap map=new HashMap (;

节点头=空;

节点结束=空;

公共容量(int capacity ) {

this.capacity=capacity;

}

公共插入获取(intkey ) {

if(map.containskey(key ) ) )

noden=map.get(key;

移除(n;

设置(n;

return n.value;

}

返回- 1;

}

公共语音移除(节点) {

if(n.pre!=空) {

n.pre.next=n.next;

}else{

head=n.next;

}

if(n.next!=空) {

n.next.pre=n.pre;

}else{

end=n.pre;

}

}

公共语音设置(节点) {

n.next=head;

n.pre=空;

If (头!=空)

head.pre=n;

head=n;

if (结束==空) )。

end=head

}

公共语音集(intkey,int value ) {

if(map.containskey(key ) ) )

节点old=map.get (key;

old.value=value;

移除(old;

设置(old );

}else{

节点创建=new node (key,value );

if(map.size(=capacity ) {

map.remove(end.key;

移除(结束;

设置(创建);

}else{

设置(创建);

}

映射. put (key,created );

}

}

}

关于操作系统的内存管理,如何节约更少的内存为最多的进程提供资源是研究的重要方向。 内存虚拟存储管理是当前最常见的,最成功的方法是在——内存有限的情况下将一些外部内存扩展为虚拟内存,而真正的内存只存储当前运行中获得的信息。 这无疑大大扩展了内存功能,大大提高了计算机的并发性。 基于虚拟页面的存储管理是一种将流程所需的空间划分为多个页面,在内存中仅存储当前所需的页面,其馀页面存储在外部的管理方式。

有好处和缺点。 基于虚拟页面的存储管理增加了进程所需的内存空间,但也存在运行时间长的缺点。 在过程中,不可避免地用内存中的现有信息替换外部存储器中存储的某些信息,由于外部存储器速度较慢,此步骤所用的时间不可忽视。 因此,尽可能好的算法来减少读取外部存储器的次数也是相当有意义的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。