当前位置: 首页 > news >正文

Oracle筑基篇-调度算法-LRU的引入

常见的调度算法

图1 调度算法思维导图

一、LRU算法的典型使用场景

1. 操作系统中的页面置换

什么时候用到页面置换算法呢?

当CPU发出指令需要访问某个地址时,若该地址在TLB(Translation Lookaside Buffer,快表)或页表中未命中,就会发生缺页异常(Page Fault)。此时,操作系统需要从磁盘加载缺失页面到物理内存中。如果物理内存已满,就需要选择一个页面置换出去腾出空间。

什么是LRU算法?

主要管理虚拟内存和物理内存之间的交换。内存中分成固定大小的页框(4K),把程序(硬盘上)分成4K大小的块,用到哪一块,加载那一块,加载的过程中,如果内存已经满了,会把最不常用的一块放到swap分区,把最新的一块加载进来,这个就是著名的LRU算法。

LRU算法在此场景下的作用?

  • 选择被置换的物理页面:根据页面最近的使用记录,优先选择最久未被使用的页面。
  • 确保效率:通过淘汰冷页面,尽量保留活跃的热页面,提高系统性能。
2. 缓存机制

除了操作系统,LRU算法还广泛应用于各种缓存系统,用于管理有限的缓存空间:

  • Redis:采用近似LRU算法(通过采样实现),用于淘汰旧数据。
  • 浏览器缓存:管理网页资源(如图片、脚本)时,选择最久未访问的资源进行清理。
  • MySQL缓冲池:缓存数据块以减少磁盘IO操作,通过类似LRU机制维护热端和冷端,优化数据访问。
  • Oracle缓冲池还增加不少机制来提高访问效率:
    1. 触摸计数, Oracle 引入触摸计数来测量对 LRU 列表上的缓冲区进行访问的频率每当数据块被访问时,其触摸计数会增加;
    2. LRU列表的热端和冷端,同时存在指向同一 LRU 上的脏缓冲区和非脏缓冲区的指针,冷缓冲区是最近未被使用的,热缓冲区是被频繁访问并在最近已使用的;
    3. 中部插入机制,当缓冲区必须从磁盘读入时, 数据库会将缓冲区插入到 LRU 列表的中部,通过这种方式,热块可以保留在缓存中,以使他们不需要再次从磁盘读取;

。。。。。。

3. 文件系统

在文件系统中,缓存文件块时也经常使用LRU算法。例如,文件读取缓存块满时,选择最久未访问的块进行替换。

二、页面置换算法的功能

操作系统中当发生缺页异常时,如果内存中没有空闲页框,则需要根据某种策略(如LRU)选择一个页面从物理内存中置换到磁盘,以腾出空间加载需要访问的新页面。也就是说选择⼀个物理⻚⾯换出到磁盘,然后把需要访问的⻚⾯换⼊到物理⻚。具体流程:

  • 如果物理内存中还有空闲页框,直接将新页面加载到空闲页框中。
  • 如果物理内存已满:
    1. 根据置换算法(如LRU)选择一个页面置换到磁盘。
    2. 如果被置换的页面是脏页(即内容被修改过),则先将其写回磁盘。
    3. 将被置换页面对应的页表项状态改为“无效”。
    4. 加载新的页面到该物理页框中,并更新页表项。

三、物理页换入换出操作流程

当操作系统物理内存已满并且访问的页面不在物理内存时(缺页中断),就需要进行换入换出操作,需要通过「⻚⾯置换算法」选择⼀个物理⻚,如果该物理⻚有被修改过(脏⻚),则把它换出到磁盘(写回),然后把该被置换出去的⻚表项的状态改成「⽆效的」,最后把正在访问的⻚⾯装⼊到这个物理⻚中。

在具体操作中,LRU算法需要完成以下步骤:

  1. 选择物理页:找到最久未被使用的页面。
  2. 处理脏页:如果被替换的页面是脏页,则需将其写回磁盘,否则不需读回磁盘直接换出。
  3. 更新页表:将被替换页面的状态标记为无效,并将新页面加载到物理内存中。

页表字段:页号、物理页、状态位、访问字段、修改位、硬盘地址

四、从数据结构看LRU的实现

我们以数据库缓冲池为例,其中LRU有两个功能

  1. 获取数据get
  2. 写入数据put

假设buffer cache大小为6

1. 数组实现

我们依次读入buffer的数据分别是2、6、3、7、8、9、1、10,这时候数组已经满了,如果需要新调入一个数据块,这时候我们怎么找出数组中哪一项时最不常用的?实现方式很多,最常用的可以在每一个块上记录一个Timestamp,此时,3号块8s没被访问,时间最长。

但是问题又来了,查找最不常用的内存块需要遍历整个buffer cache,时间复杂度时O(n),好一点的数组查找算法如二分查找也要 O(log n) ,哈希查找理想情况下是O(1),但最坏情况下所有元素都映射到一个桶里可能是O(n),也就是我们常说的存在哈希冲突,换链表试一下。

数组实现优劣:

  • 优点:简单易实现。
  • 缺点:查找最久未使用的页面需要遍历整个数组,时间复杂度为 O(n)。
2. 单向链表实现

使用尾插法维护一个单向链表,每次把新来的数据插入在链表尾部,头部就永远是最不常用的块,比如依次访问2、6、3、7、4、8六个块,

这时候缓存满了

  • 当访问的块不在buffer里,直接把头去掉head=head.next,把新访问的数据块插入到链表尾部;put()写入数据是O(1),删除最不常用的数据也是O(1).
  • 当访问的块在buffer里,比如要再次访问块3的时候,需要把最后访问的放到链表尾部,也就是3放到链表尾部,这个时候缓冲区块的物理位置是不会改变的,变动指针方向即可。

直接在尾部直接画线图有点难看,使用伪尾部节点构造一个空指针,算不占buffer空间

所以上面的图相当于

在这个过程需要在链表查找到块三,在链表上get()查找还是一个O(n)的操作,和链表长度成正比,再继续看看下一个结构-哈希表+单向链表。

链表实现优劣:

  • 使用链表维护页面访问顺序,最近访问的页面在链表尾,最久未使用的页面在链表头,查找最久未使用的页面时间复杂度降至O(1)。
  • 每次访问页面,需要将页面移动到链表尾部,查找命中的缓存块时间复杂度为O(n)。
3. 哈希表 + 单向链表

数组说到get()查找一个元素O(1)操作可以是哈希查找,用哈希表实现且后面跟一个链表。

如图所示:

还没完,我们还是要再次访问数据块3,

通过哈希表查找操作get(3)已经可以O(1)实现了

将最常访问的放在链表尾部,找到块3之后将三号块指向tail,断开8号块指向tail的指针指向3号块。

6->3->7的指针也需要断开,跳过3号块,将6号块指向7号块,怎么通过3号块直接找到它的前驱呢?双向链表,我们继续看

哈希表+单向链表实现优劣:

  • 哈希表存储页面号到链表节点的映射,快速定位页面。
  • 单向链表维护访问顺序,结合哈希表后,查找命中的缓存块的时间复杂度降至 O(1),但是更改操作还是O(n)
4. 哈希表 + 双向链表(最优实现)

最后我们得到了哈希表+双向链表的结构实现LRU

哈希表用来实现get()查找操作是O(1),链表用来实现排序和put()新增操作是O(1)。

Java里有这样的结构:LinkedHashMap

哈希表+双向链表实现优劣:

  • 双向链表:实现页面访问顺序的快速更新,支持节点的插入、删除操作。
  • 哈希表:快速定位页面。
  • 复杂度:查找、插入和删除均为 O(1)。

五、实际应用中的优化(以Oracle缓冲池为例)

LRU在数据库中并不是上面get(),put()两个功能,这么简单的实现,还会结合具体场景进行优化。例如,Oracle缓冲池引入了以下机制:

  1. 热端和冷端
    • 缓冲区分为热端和冷端,热端保存频繁访问的数据,冷端保存最近未使用的数据。
    • 新加载的页面通常插入到LRU链表的中部,避免直接进入热端。
  1. 触摸计数
    • 通过计数器记录页面访问频率,用于辅助LRU决策。
    • 频繁访问的页面更可能停留在热端,提高命中率。
  1. 脏页管理
    • LRU链表中同时维护脏缓冲区和非脏缓冲区。
    • 在需要页面置换时,优先选择冷端的非脏页,减少写回磁盘的开销。

可以尝试一下力扣146题:146. LRU 缓存 - 力扣(LeetCode)

相关文章:

Oracle筑基篇-调度算法-LRU的引入

常见的调度算法 图1 调度算法思维导图 一、LRU算法的典型使用场景 1. 操作系统中的页面置换 什么时候用到页面置换算法呢? 当CPU发出指令需要访问某个地址时,若该地址在TLB(Translation Lookaside Buffer,快表)或页…...

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动…...

linux驱动:6ull(3)自动分配设备号来创建led驱动

在 linux驱动:6ull(2)的文章代码上进行更改 步骤: 创建入口函数和出口函数定义一个设备结构体和创建一个led设备在入口函数init中添加初始化led的gpio在入口函数init中添加自动分配设备号来创建led字符设备在出口函数中取消led的…...

GM_T 0039《密码模块安全检测要求》题目

单项选择题 根据GM/T 0039《密码模块安全检测要求》,送检单位的密码模块应包括()密码主管角色。 A.一个 B.两个 C.至少一个 D.至少两个 正确答案:C 多项选择题 根据GM/T 0039《密码模块安全检测要求》,关于非入侵式安全,以下属于安全三级密码模块要求的是()。 …...

第四届电气工程与控制科学

重要信息 官网:www.ic2ecs.com 时间:2024年12月27-29日 简介 第四届电气工程与控制科学定于2024年12月27-29日在中国南京召开。主要围绕“电气工程“、”控制科学“、”机械工程“、”自动化”等主题展开,旨在为从电…...

LabVIEW在电液比例控制与伺服控制中的应用

LabVIEW作为一种图形化编程环境,广泛应用于各类控制系统中,包括电液比例控制和伺服控制领域。在这些高精度、高动态要求的控制系统中,LabVIEW的优势尤为突出。以下从多个角度探讨其应用与优势: ​ 1. 灵活的控制架构 LabVIEW为电…...

植物大战僵尸杂交版v3.0.2最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.0.2版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接::https://pan.quark.cn/s/5c…...

车辆重识别代码笔记12.19

1、resnet_ibn_a和resnet网络的区别 ResNet-IBN-A 是在 ResNet 基础上进行了一些改进的变种,具体来说,它引入了 Instance Batch Normalization (IBN) 的概念,这在某些任务中(如图像识别、迁移学习等)有显著的性能提升。…...

linux内核网络分层概述

在开发应用时,我们使用 socket 实现网络数据的收发。以tcp为例,server端通过 socket, bind, listen来创建服务端,然后通过 accept接收客户端连接;客户端通过 socket和 connect系统调用来创建客户端。用于数据收发的系统调用包括 s…...

H3C交换机配置 telnet 服务

使用一个交换机做成 telnet 服务, telnet 可以使用指定端口开启三层交换机, 用于与 pc 互通, 也可以使用自带的 vlan1 设置 ip 然后达到互通, 因为华三的交换机端口默认是 access 口, 默认带 vlan1 , 直接设置 vlan1 的 ip 也就可以实现互通 实现互通 互通的两种方式 设置 vl…...

江苏计算机专转本 技能Mysql知识点总结(二)

三、SQL数据操纵语言(增删改查) 1.insert 语句(增) INSERT INTO 表名 (列1, 列2, 列3) VALUES (值1, 值2, 值3); 2.Delete 语句(删) //1. DELETE FROM 表名 WHERE 条件;//2. truncate table 表名; …...

边缘智能网关助力打造建筑智慧消防物联网

随着经济社会的快速发展,为了满足民众生产、生活、消费需求,高层建筑、大型综合连体建筑持续兴建,各类火灾风险和事故也越发增加。得益于物联网的普及应用,消防监测和管理迎来数字化、智慧化转型升级。 针对各类高层、大型建筑消防…...

学习Cookie 提升

目录 Cookie 的覆盖​​​​​​​ Cookie下的path 特点 设置Cookie 路径 实例 Cookie的最大存活时间 设置Cookie 存活时间 实例 Cookie 和session的区别 和联系 Cookie 的覆盖 当 key相同 和只要path的上级目录的路径相同,就可以被替换掉 value 值 如下图…...

OpenAI 发布会 9 天技术总结

OPEN AI 发布会总结 OpenAI 发布会 12 天技术总结Day 1: 开幕与愿景主要内容:体验方式: Day 2: GPT-4 及其突破性进展主要内容:体验方式: Day 3: GPT-4 在编程领域的突破 - Codex & Copilot主要内容:体验方式&…...

免费注册.news域名一年(今日有效)

时间紧迫,就不上图了,需要的尽快。 网址:https://www.namecheap.com/ 优惠码:FREEDOM24...

解决JIRA、Confluence用户自动注销、反复登录的问题

一、问题描述:当工作从从confluence里面打开jira的时候,在回到confluence时候,就自动退出了,需要账号密码登录重复登录,使人十分厌恶。 二、原因分析: 访问 JIRA、Confluence 或任何其他具有相同域或 IP 上…...

Oracle创建逻辑目录

Oracle 在执行逻辑备份及还原时,需要用到逻辑目录。 本文就来简单介绍一下逻辑目录相关的操作,希望对大家有所帮助。 ‌1.登录到Oracle数据库‌ 使用具有足够权限的数据库用户登录到Oracle数据库。通常,这需要是管理员账号,如SYS…...

【AIGC-ChatGPT进阶副业提示词】星际占卜师:探索星象能量的艺术【限时免费阅读,一天之后自动进入进阶课程】

引言 在这个数字化的时代,我们创造了一个独特的角色 —— 星际占卜师。这不仅是一个简单的运势预测工具,更是一个融合了玄学、预言和能量解读的智能向导。通过精心设计的系统提示词和独特的画境生成机制,星际占卜师能够为用户带来沉浸式的占…...

泷羽sec-shell编程(9)

shell(9) 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他…...

【Vue-4小时速通01-ES6】

1.var和let的区别 1.1作用域与有效范围 var 在函数或全局作用域中声明变量,无论在块级作用域内外都可以访问。 var 即使在块级作用域外部访问,仍然能获取到结果。 let 在块级作用域内声明变量,仅在其所在的作用域中有效。 let 如果在作用域…...

基于STM32的智能仓储环境监测的Proteus仿真

文章目录 一、智能仓储环境监测1.题目要求2.思路3.电路仿真3.1 未仿真时3.2 开始仿真,显示屏显示Init后,正常显示温度湿度光照烟雾数值3.3 切换温度阈值界面,用阈值加减设置温度min和温度max阈值3.4 调整温度数值,触发风扇/加热3.…...

logback日志控制台打印与写入文件

1.创建logback-spring.xml文件放入resource下 <?xml version"1.0" encoding"UTF-8"?> <configuration><property name"LOG_CONTEXT_NAME" value"log"/><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用…...

成方金融科技后端部分笔试题 - 解析

单选题 1.以下关于JAVA自动类型转换&#xff0c;描述错误的是哪一项?(B) A.byte->short B.char->short C.char->int D.float->double 2.请选择运行以下代码后&#xff0c;系统显示的内容什么?(B) public class Test {static {int x1;}static int x,y;publ…...

WatchAlert - 开源多数据源告警引擎

概述 在现代 IT 环境中&#xff0c;监控和告警是确保系统稳定性和可靠性的关键环节。然而&#xff0c;随着业务规模的扩大和数据源的多样化&#xff0c;传统的单一数据源告警系统已经无法满足复杂的需求。为了解决这一问题&#xff0c;我开发了一个开源的多数据源告警引擎——…...

Linux procps-ng 包详解

简介 procps-ng 包是用于监视和管理 Linux 上的进程和系统性能的实用程序集合。它与 /proc 文件系统交互以检索实时系统信息。procps-ng 中的实用程序包括 ps、top、free、uptime 等命令。 安装 procps-ng 使用包管理工具安装 Debian/Ubuntu sudo apt update sudo apt ins…...

[react] <NavLink>自带激活属性

NavLink v6.28.0 | React Router 点谁谁就带上类名 当然类名也是可以自定义 <NavLinkto{item.link}className{({ isActive }) > (isActive ? 测试 : )}>{item.title}</NavLink> 有什么用?他会监听你的路由,刷新的话也会带上激活效果...

智能语音识别模块与声音传感器模块对比分析:原理、优缺点、性价比与应用领域

随着物联网&#xff08;IoT&#xff09;和智能家居的发展&#xff0c;智能设备的控制方式越来越多样化&#xff0c;尤其是语音控制和声音感应控制。智能语音识别模块和声音传感器模块作为两种常见的音频输入设备&#xff0c;它们在不同的应用场景中发挥着重要作用。本文将深入分…...

大模型+安全实践之春天何时到来?

引子:距《在大模型实践旅途中摸了下上帝的脚指头》一文发布近一年,2024年笔者继续全情投入在大模型+安全上,深度参与了一些应用实践,包括安全大模型首次大规模应用在国家级攻防演习、部分项目的POC直到项目落地,也推动了一些场景安全大模型应用从0到3的孵化上市。这一年也…...

贪心算法【Lecode_HOT100】

文章目录 1.买卖股票的最佳时机No.1212.跳跃游戏No.553.跳跃游戏IINo.454.划分字母区间No.763 1.买卖股票的最佳时机No.121 class Solution {public int maxProfit(int[] prices) {if (prices null || prices.length 0) {return 0;}// 初始化买入价格为最大值&#xff0c;最大…...

cmd初使用windows-docker时的一些小小问题

跟着大神文章做的&#xff0c;原文地址为【Docker】掌握 Docker魔法&#xff1a;Windows 11 平台上的完美容器部署终极指南_win11 docker-CSDN博客 1.用户名或密码错误 报错原文&#xff1a;Error response from daemon: Head "https://registry-1.docker.io/v2/library…...