ub c语言,操作系统之LRU算法 C语言链表实现

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 #include

structnode

{intid;struct node *next;

}* head, *tail, *p;voidPushBack()

{/*pre没有意义,仅需要多保留一个尾结点

p->pre = tail; //使pre指向前一个节点,循环可得到反向链表*/p->next =NULL;

tail->next =p;

tail=p;

}voidfun()

{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);

}intmain()

{intsum, n, i;

sum= 0; //初始cache内没有数据

scanf("%d", &n); //读入页数

head = (struct node *)malloc(sizeof(structnode));

head->next =NULL;

tail=head;while (1)

{

p= (struct node *)malloc(sizeof(structnode));

scanf("%d", &p->id);if (p->id < 0)

{break;

}else{if (sum < n) //cache未满,放至后面

{

PushBack();

printf("发生缺页中断 %d\n",p->id);

sum+= 1; //并对cache+1

}else{

fun();

}

}

}return 0;

}

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

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

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

7b52d0540324543d130d947e4cd307bee39.jpg

83ee38682e208795decf38c344ef5ea403e.jpg

#include#include

void fun(std::list&L,intx)

{for(std::list::iterator it=L.begin();it!=L.end();it++)

{if(*it==x)

{

L.push_front(x);

L.erase(it);return;

}

}

std::cout<

L.pop_back();

L.push_front(x);

}intmain()

{

std::listL;intsum, n, i,x;

sum= 0; //初始cache内没有数据

std::cin>>n; //读入页数

while (true)

{

scanf("%d", &x);if (x < 0)

{break;

}else{if (sum < n) //cache未满,放至后面

{

L.push_front(x);

std::cout<

sum+= 1; //并对cache+1

}else{

fun(L,x);

}

}

}return 0;

}

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

b239b3591312b752eca38f9171c34b40392.jpg

9afa2ca105d597363552aec00de8e4bde83.jpg

public classLRUCache{private intlimit;private HashMaphashMap;privateNode head;privateNode end;public LRUCache(intlimit)

{this.limit =limit;

hashMap= new HashMap();

}publicString get(String key){

Node node=hashMap.get(key);if(node ==null)return null;

refreshNode(node);returnnode.value;

}public voidput(String key,String value){

Node node=hashMap.get(key);if(node == null){if(hashMap.size()>=limit)

{

String oldKey=removeNode(head);

hashMap.remove(oldKey);

}

node= newNode(key,value);

addNode(node);

hashMap.put(key,node)

}else{

node.value=value;

refreshNode(node);

}

}public voidremove(String key){

Node node=hashMap.get(key);

removeNode(node);

hashMap.remove(key);

}private voidrefreshNode(Node node)

{if(node ==end)return;

removeNode(node);

addNode(node);

}publicString 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;

}returnnode.key;

}public voidaddNode(Node node)

{if(end!=null)

{

end.next=node;

node.pre=end;

node.next= null;

}

end=node;if(head == null)

head=node;

}

}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware 虚拟机 Ubuntu 系统执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask)

可能的原因是&#xff0c;你安装了也安装了其他的虚拟机软件&#xff0c;比如&#xff1a;VirtualBox。我们打开 控制面板 > 网络和共享中心 > 更改适配器设置 &#xff0c; 你就可以打开控制面板/网络和Internet/网络连接界面&#xff1a; 直接禁用相应的网络即可&#…

这本轻小说真厉害 2016

傲娇御坂美琴成轻小说女王一姐 轻小说排名公布 到了年底,作为轻小说的粉丝就没有理由不关注“这本轻小说真厉害!”的相关评选吧?腾讯动漫此前曾经报道过《OVERLORD》以及《龙王的工作》获得榜首殊荣的消息。而近日,年度的最佳作品、最佳角色以及最佳插画师等奖项也已经公布,快…

IDEA初次使用Tomcat运行项目(如何添加加载项目到Tomcat)

IDEA中Tomcat设置说明 Tomcat最好使用干净的版本 不同的版本适配不同的JDK 设置Tomcat基本信息 加载项目&#xff08;war和war exploed模式简单说明&#xff09; 配置完项目后警告消失 应用后启动 选择相应的模式即可

回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)

问题&#xff1a;0/1背包问题例子:weight数组代表物品重量&#xff0c;value数组代表物品价值&#xff0c;M代表背包容量。背包是按单位价值递减的顺序排列的&#xff0c;即value[i]/weight[i]>value[i-1]/weight[i-1].const int weight[Max]{1,11,21,23,33,43,45,55};const…

IDEA中中文乱码问题解决方案

1.修改idea安装目录下的两个文件 C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin\idea.exe.vmoptions C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin\idea64.exe.vmoptions 在这两个文件下增加一行: -Dfile.encodingUTF-8 2.做此修改后,tomcat运行日志会…

linux 6.2 期末考试题,redhat6.2-linux考试试卷(带部分答案)

这个是初学redhat6.2的考试内容,带答案(实做的,水平有限,不完整答案)--------------------------------------------------------------------------------------------装 订 线-----------------------------------------------------------------------------------------广东…

video4linux 安装,【精品博文】Video4linux 下视频编程的流程

最近一直在忙基金申报&#xff0c;今天终于顺利提交了&#xff0c;剩下的就看缘分啦。今天有时间写写Video4linux 下视频编程的流程。Video4linux(简称 V4L),是linux 中关于视频设备的内核驱动。现在已有Video4linux2&#xff0c;还未加入linux 内核&#xff0c;使用的时候要自…

intellij IDEA--- 报inspects a maven model for resolution problems

解决方法是&#xff1a; 第一种&#xff1a; 找到pom.xml 右击 --> Maven --> reImport 第二种方法&#xff1a; 第三种 <properties><junit.version>4.11</junit.version><spring.version>4.3.14.RELEASE</spring.version></prop…

spring AOP自定义注解方式实现日志管理

转&#xff1a;spring AOP自定义注解方式实现日志管理 今天继续实现AOP&#xff0c;到这里我个人认为是最灵活&#xff0c;可扩展的方式了&#xff0c;就拿日志管理来说&#xff0c;用Spring AOP 自定义注解形式实现日志管理。废话不多说&#xff0c;直接开始&#xff01;&…

GPG96244QS1屏驱动难题

void Gpg_Master(unsigned int Data) {unsigned int temp 0b1000000000000000;Master_SCK1;ENABLE_244QS1();//初始化前使能片选_delay(10);DISABLE_244QS1();Master_SCK0; //Generate SCK Clockdo{Master_SDI Data &temp;Master_SCK1; _delay(10); Master_SCK0; //Gener…

linux装机量,在没有盗版的世界 Linux桌面的装机量可能占比达到40%

近日&#xff0c;由奥斯陆大学经济学系博士生Arne Rogde Gramstad公布的“Software Piracy and Linux Adoption”研究报告&#xff0c;发现了Linux系统装机量和软件盗版之间的潜在关联。在这份报告中引用了商业软件联盟(BSA)自2012年以来从104 个国家收集的盗版软件信息&#x…

Spring.io本地服务器解决超时问题

建本地服务器的方法&#xff0c;详情参考官方说明&#xff1a;https://github.com/spring-io/initializr 打开一看是英文&#xff0c;而且你鼓捣半天不一定成功&#xff0c;没事&#xff0c;我已经搭建好了可执行jar包给你下载使用&#xff01;你只需要java -jar&#xff0c;如…

lgg6 android 9,LG G6的18:9屏幕用起来到底是什么样

前不久LG公布了全新18:9屏幕&#xff0c;据他们称这块屏幕是特意为智能手机而设计&#xff0c;如今传言也指向LG G6将会成为首款使用这块屏幕的旗舰&#xff0c;那么为何LG会放弃智能手机坚持的16:9转而使用18&#xff1a;9&#xff0c;体验又会是什么样呢&#xff1f;最近LG公…

屏上有一层紫色(正在找原因)

注&#xff1a; 1、这两天一直在找这个原因、5150控制成功、屏驱动成功、可是为什么屏上面有一层紫色的覆盖住了呢、非常的让我感到不解2、如果什么也不输入、解码出来的信号在TFT上显示是紫色、我现在是不怎么清楚是屏的原因还是解码的原因

Cadence PCB SI

Cadence PCB信号完整性 (SI) 和电源完整性技术(PI)提供了可调整、高性价比并且支持前仿真和后仿真的系统互联设计和分析环境。 Cadence PCB信号完整性 (SI) 和电源完整性技术(PI)提供了可调整、高性价比并且支持前仿真和后仿真的系统互联设计和分析环境。Cadence PCB SI和PI产品…

java1.8安装

简单说下&#xff0c;jdk1.8*的下载&#xff0c;见http://www.cnblogs.com/zlslch/p/5658383.html 双击jdk-8u60-windows-x64.exe运行程序 欢迎使用Java SE开发工具包8 Update 60的安装向导界面&#xff0c;点击“下一步” 选择安装可选功能界面&#xff0c;默认安装&#xff0…

图像正确(相当于这个小项目就要结尾了)

到这里这个小项目就要进入尾声了 1、在其中遇到了很多问题、也听了部门前辈的指点、有的人说的正确、有的人说的不沾边、这时候真的是需要自己去衡量哪个人说的才是自己所需要的、2、关于TVP5150的配置和GPGTFT的配置、刚开始的时候都不知道到底是哪一个配置会出了什么问题、后…

华为升级harmonyos的机型名单,华为智慧屏HarmonyOS 1.0.1.50更新机型和方法

华为智慧屏 V65/V65i/V65尊爵版/V75 新版本发布HarmonyOS 1.0.1.50一、 适配机型&#xff1a;华为智慧屏 V65 4G64G(HEGE-560)华为智慧屏 V65i 4G32G(HEGE-560B)华为智慧屏 V65尊爵版 4G128G(HEGE-560S)华为智慧屏 V75 4G64G(HEGE-570)二、 更新方式&#xff1a;智慧屏系…