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 );
}
}
}
关于操作系统的内存管理,如何节约更少的内存为最多的进程提供资源是研究的重要方向。 内存虚拟存储管理是当前最常见的,最成功的方法是在——内存有限的情况下将一些外部内存扩展为虚拟内存,而真正的内存只存储当前运行中获得的信息。 这无疑大大扩展了内存功能,大大提高了计算机的并发性。 基于虚拟页面的存储管理是一种将流程所需的空间划分为多个页面,在内存中仅存储当前所需的页面,其馀页面存储在外部的管理方式。
有好处和缺点。 基于虚拟页面的存储管理增加了进程所需的内存空间,但也存在运行时间长的缺点。 在过程中,不可避免地用内存中的现有信息替换外部存储器中存储的某些信息,由于外部存储器速度较慢,此步骤所用的时间不可忽视。 因此,尽可能好的算法来减少读取外部存储器的次数也是相当有意义的。