LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

为什么要使用链表实现呢,因为这个页面不会很多,内存和资源开销都小

在计算机中,开销往往是需要考虑的,我们不希望占用过多的系统资源,动态路由小型网络使用RIP(Bellman-Ford Routing Algorithm),大型网络设备用的就是OSPF(dijkstra),当然也有很多方面的考虑,比如RIP配置和管理更简单,RIP为了避免出现网络延迟太高,也将路由器最大的允许跳数设为15

我们存储的时候就按照时间吧,末尾为刚刚使用的,淘汰前面的

然后我们来考虑下这个算法,保证我们不使用无关变量。这个cache是空的

进行一次请求需要查看我当前的cache里是否存在这个数据

1存在

  存在就比较简单了,直接取出数据,页面数据不变,并把这个结点放在最后

2不存在

  2.1cache满

  把最靠前的页面用读取数据的数据覆盖,然后把它放到最后的cache

  2.2cache不满

  直接去读取数据,然后把他放在最后的页面

我需要维护的是一个编号(或者说地址)还有后结点,然后查询肯定是O(1)的,这是内部完成的,不需要我考虑(直接得到地址去取数据)

缺页中断都对应了一个硬件操作,就是去取这个数据

#include <stdio.h>
#include <stdlib.h>
struct node
{
int id;
struct node *next;
} * head, *tail, *p;
void PushBack()
{
/*
pre没有意义,仅需要多保留一个尾结点
p->pre = tail; //使pre指向前一个节点,循环可得到反向链表
*/
p->next = NULL;
tail->next = p;
tail = p;
}
void fun()
{
struct node *q;
q = head;
while (q->next != NULL)
{
if (q->next->id == p->id)//不缺页
{
PushBack();
p = q->next;
q->next = p->next;
free(p);
return; //执行完全部操作停掉
}
q = q->next;
}
printf("发生缺页中断 %d\n",p->id);
PushBack();
p = head->next;
head->next = p->next;
free(p);
}
int main()
{
int sum, n, i;
sum = ; //初始cache内没有数据
scanf("%d", &n); //读入页数
head = (struct node *)malloc(sizeof(struct node));
head->next = NULL;
tail = head;
while ()
{
p = (struct node *)malloc(sizeof(struct node));
scanf("%d", &p->id);
if (p->id < )
{
break;
}
else
{
if (sum < n) //cache未满,放至后面
{
PushBack();
printf("发生缺页中断 %d\n",p->id);
sum += ; //并对cache+1
}
else
{
fun();
}
}
}
return ;
}

事后来看,我说pre没有意义是不对的,因为实际上并不是乱序的,往往我们先访问的到的会被继续访问,并不是一个完全的均摊复杂度。

所以应该记录pre进行倒序,有兴趣的可以实现一下,不过我还是觉得c++好写,但是内部肯定是更厉害的

c++实现就用list搞一下啊,把最近访问的放到最前面

#include<iostream>
#include<list>
void fun(std::list<int>&L,int x)
{
for(std::list<int>::iterator it=L.begin();it!=L.end();it++)
{
if(*it==x)
{
L.push_front(x);
L.erase(it);
return;
}
}
std::cout<<"发生缺页中断 "<<x<<std::endl;
L.pop_back();
L.push_front(x);
}
int main()
{
std::list<int>L;
int sum, n, i,x;
sum = ; //初始cache内没有数据
std::cin>>n; //读入页数
while (true)
{
scanf("%d", &x);
if (x < )
{
break;
}
else
{
if (sum < n) //cache未满,放至后面
{
L.push_front(x);
std::cout<<"发生缺页中断 "<<x<<std::endl;
sum += ; //并对cache+1
}
else
{
fun(L,x);
}
}
}
return ;
}

C++ list 因为内部就是双向链表

public class LRUCache{
private int limit;
private HashMap<String,Node> hashMap;
private Node head;
private Node end; public LRUCache(int limit)
{
this.limit = limit;
hashMap = new HashMap<String,Node>();
} public String get(String key){
Node node = hashMap.get(key);
if(node ==null)
return null;
refreshNode(node);
return node.value;
} public void put(String key,String value){
Node node = hashMap.get(key);
if(node == null){
if(hashMap.size()>=limit)
{
String oldKey = removeNode(head);
hashMap.remove(oldKey);
}
node = new Node(key,value);
addNode(node);
hashMap.put(key,node)
}else{
node.value = value;
refreshNode(node);
}
} public void remove(String key){
Node node = hashMap.get(key);
removeNode(node);
hashMap.remove(key);
} private void refreshNode(Node node)
{
if(node == end)
return;
removeNode(node);
addNode(node);
} public String removeNode(Node node){
if(node == end)
end = end.pre;
else if(node ==head)
head = head.next;
else
{
node.pre.next = node.next;
node.next.pre = node.pre;
}
return node.key;
} public void addNode(Node node)
{
if(end!=null)
{
end.next = node;
node.pre = end;
node.next = null;
}
end = node;
if(head == null)
head = node;
} }

Java实现(高并发线程安全使用ConcurrentHashMap

操作系统之LRU算法 C语言链表实现的更多相关文章

  1. Redis内存回收:LRU算法

    Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中采用两种算法进行内存回收,引用计数算法以及LRU ...

  2. Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?

    在<Redis 数据缓存满了怎么办?>我们知道 Redis 缓存满了之后能通过淘汰策略删除数据腾出空间给新数据. 淘汰策略如下所示: 设置过期时间的 key volatile-ttl.vo ...

  3. 操作系统页面置换算法(opt,lru,fifo,clock)实现

    选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...

  4. 【操作系统】银行家算法实现(C语言)

    [操作系统]银行家算法实现(C语言) 注意:本人编码水平很菜.算是自己的一个总结.可能会有我还没有发现的bug.如果有人发现后可以指出,不胜感激. 1.银行家算法: 我们可以把操作系统看作是银行家,操 ...

  5. 操作系统 页面置换算法LRU和FIFO

    LRU(Least Recently Used)最少使用页面置换算法,顾名思义,就是替换掉最少使用的页面. FIFO(first in first out,先进先出)页面置换算法,这是的最早出现的置换 ...

  6. 链表插入和删除,判断链表是否为空,求链表长度算法的,链表排序算法演示——C语言描述

    关于数据结构等的学习,以及学习算法的感想感悟,听了郝斌老师的数据结构课程,其中他也提到了学习数据结构的或者算法的一些个人见解,我觉的很好,对我的帮助也是很大,算法本就是令人头疼的问题,因为自己并没有学 ...

  7. 用LinkedHashMap实现LRU算法

    (在学习操作系统时,要做一份有关LRU和clock算法的实验报告,很多同学都应该是通过数组去实现LRU,可能是对堆栈的使用和链表的使用不是很熟悉吧,在网上查资料时看到了LinkedHashMap,于是 ...

  8. LRU算法原理解析

    LRU是Least Recently Used的缩写,即最近最少使用,常用于页面置换算法,是为虚拟页式存储管理服务的. 现代操作系统提供了一种对主存的抽象概念虚拟内存,来对主存进行更好地管理.他将主存 ...

  9. LRU算法与LRUCache

    关于LRU LRU(Least recently used,最近最少使用)算法是操作系统中一种经典的页面置换算法,当发生缺页中断时,需要将内存的一个或几个页面置换出,LRU指出应该将内存最近最少使用的 ...

随机推荐

  1. SPSS分析技术:CMH检验(分层卡方检验);辛普森悖论,数据分析的谬误

    SPSS分析技术:CMH检验(分层卡方检验):辛普森悖论,数据分析的谬误 只涉及两个分类变量的卡方检验有些时候是很局限的,因为混杂因素总是存在,如果不考虑混杂因素,得出的分析结论很可能是谬误的,这就是 ...

  2. ElasticSearch基本操作(安装,索引的创建和删除,映射)

    ElasticSearch基于Lucene的搜索服务器,支持分布式,提供REST接口,可用于云计算,可以实现实时搜索,开源免费.这时很官方的一句话,在使用之前,我们简单的介绍一下安装过程.在官网下载之 ...

  3. tensorflow object detection faster r-cnn 中keep_aspect_ratio_resizer是什么意思

    如果小伙伴的英语能力强可以直接阅读这里:https://stackoverflow.com/questions/45137835/what-the-impact-of-different-dimens ...

  4. Effective Modern C++  条款1:理解模板型别推导

    成百上千的程序员都在向函数模板传递实参,并拿到了完全满意的结果,而这些程序员中却有很多对这些函数使用的型别是如何被推导出的过程连最模糊的描述都讲不出来. 但是当模板型别推导规则应用于auto语境时,它 ...

  5. 关于CE的反思

    当你注视着你的分数, 眼眶倏地猛睁. 不会做的题血红一片, 认真做了的题一点墨蓝. 你知道, 你CE了, 你挂了, 你倒数第一了, 你当场去世了. 两小时的努力付诸东流, 线段树的碎片历历在目. 思考 ...

  6. 百度the big talk节目

    主要事件 2015-03-09期:硅谷峰会:智能机器人&对话沃兹尼亚克 2015-03-02期:硅谷峰会:创新金融和智能城市 2015-02-15期:硅谷峰会:数字生物学和数字医药 2015- ...

  7. 2019.8.1 NOIP模拟测试11 反思总结

    延迟了一天来补一个反思总结 急匆匆赶回来考试,我们这边大家的状态都稍微有一点差,不过最后的成绩总体来看好像还不错XD 其实这次拿分的大都是暴力[?],除了某些专注于某道题的人以及远程爆踩我们的某学车神 ...

  8. LINUX常见服务列表

    服务名        必需(是/否)用途描述        注解 acon              否       语言支持        特别支持左手书写语言:阿拉伯语,波斯语和希伯莱语 acpi ...

  9. NOIP模拟 7.01

    水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没. CCY ...

  10. farv

    http://weishu.me/ https://github.com/jimupon/VirtualXposed O:  ?  api 26 - vdex N: speed-profile M: ...