数据库缓存管理

1. 简介

缓存管理器是数据库管理系统(DBMS)中负责管理内存中page并处理文件和索引管理器的page请求的组件。由于内存空间有限,我们不能将所有page存储在缓存池中。因此,缓存管理器需要制定替换策略,当空间填满时选择哪些page进行替换。缓存管理器与磁盘空间管理器进行通信,执行所需的磁盘操作。
在这里插入图片描述

2. 缓存池

缓存池是通过将内存划分为可以放置page的frame来创建的。一个缓存frame可以容纳与一个page相同的数据量。为了有效地跟踪frame,缓存管理器会在内存中分配额外空间用于元数据表。

元数据表追踪以下信息:

  • frame ID:唯一关联到内存地址
  • page ID:确定frame当前包含哪个page
  • 脏位:验证page是否被修改
  • 固定计数:跟踪当前使用page的请求者数量
    在这里插入图片描述
3. 处理page请求

当请求的page存在于内存中时,增加page的固定计数,并返回page的内存地址。如果page不在缓存池中且还有空间,找到下一个空frame并将page读入该frame,将page的固定计数设置为1并返回page的内存地址。如果没有空frame,则使用替换策略决定替换哪个page。

替换策略依赖于page访问模式,选择最优策略以减少I/O开销。如果被替换的page设置了脏位,需要将page写回磁盘以确保更新持久化。一旦请求者完成工作,需要通知缓存管理器减少使用page的固定计数。

4. LRU替换策略

LRU(最近最少使用)是一种常用的替换策略。当需要在已满的缓存池中读入新page时,替换最近最少使用且未固定的page。为了跟踪page使用情况,元数据表中添加了“最后使用”列,记录page固定计数减少的最新时间。实现LRU通常成本较高,Clock策略提供了一种高效近似LRU的实现。
在这里插入图片描述

5. Clock替换策略

Clock策略通过使用元数据表中的引用位列和时钟指针变量来高效地近似LRU。算法将元数据表视为一个循环列表,并设置时钟指针为当前考虑的frame。策略如下:

  • 迭代表中的frame,跳过固定的page,找到第一个引用位为0的未固定frame。
  • 每次迭代,如果当前frame的引用位为1,则将其设为0并移动时钟指针到下一个frame。
  • 到达引用位为0的frame时,替换现有page(如果脏位为1,则写回磁盘并设为0),读入新page,设置frame的引用位为1,并移动时钟指针到下一个frame。
    在这里插入图片描述
6. MRU替换策略

MRU(最近最常使用)策略在替换page时,选择最近最常使用的未固定page。尽管看似反直觉,但在某些访问模式下,如重复的顺序扫描,MRU的性能优于LRU。

7. page请求与缓存命中

在处理page请求时,如果请求的page不在缓存池中,需要选择一个未固定的frame进行替换。如果frame为脏,则需要将当前page写回磁盘并标记为干净,读入请求的page,并返回其地址。如果可以预测请求(如顺序扫描),可以提前读取多个page以优化性能。

8. 脏页处理

缓存管理器通过page上的脏位标记发现脏页。当page被修改时,设置脏位。当需要替换脏页时,缓存管理器会将其写回磁盘。

9. 缓存池状态

缓存池是DBMS服务器启动时分配的大范围内存(MB到GB)。缓存管理器的元数据是DBMS服务器启动时分配的小数组。在内存中保持一个基于PageId的哈希表索引,以便快速查找page。

10. 替换策略的选择

替换策略的选择对I/O次数影响很大,取决于访问模式。LRU适用于随机访问,而MRU适用于重复顺序访问。现代DBMS通常使用混合策略以适应不同的工作负载。例如,PostgreSQL使用Clock策略。

总结

缓存管理器提供了一种间接映射,将磁盘page ID映射到内存地址,确保每个请求的page在内存中被固定以进行操作,并在使用完成后解除固定。通过替换不太可能被引用的page和预取可能被引用的page,缓存管理器试图最小化缓存未命中次数。

要点回顾
  • 固定计数和脏位:何时设置/取消设置?由系统的哪一层处理?
  • LRU、MRU和Clock:能够手动运行每个策略。
  • 顺序扫描和缓存未命中的行为。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rider使用libman

问题 rider没有libman的相关功能,需要使用cli 安装Libman dotnet tool install -g Microsoft.Web.LibraryManager.Cli # 如果存在可以尝试更新 dotnet tool update -g Microsoft.Web.LibraryManager.Cli查看命令 libman --help初始化 cdnjs官网 libman init安…

【十三】图解 Spring 核心数据结构:BeanDefinition 其二

图解 Spring 核心数据结构:BeanDefinition 其二 概述 前面写过一篇相关文章作为开篇介绍了一下BeanDefinition,本篇将深入细节来向读者展示BeanDefinition的设计,让我们一起来揭开日常开发中使用的bean的神秘面纱,深入细节透彻理解…

CTFShow的RE题(三)

数学不及格 strtol 函数 long strtol(char str, char **endptr, int base); 将字符串转换为长整型 就是解这个方程组了 主要就是 v4, v9的关系, 3v9-(v10v11v12)62d10d4673 v4 v12 v11 v10 0x13A31412F8C 得到 3*v9v419D024E75FF(1773860189695) 重点&…

刷代码随想录有感(127):动态规划——判断是否为子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {vector<vector<int>>dp(s.size() 1, vector<int>(t.size() 1, 0));for(int i 1; i < s.size(); i){for(int j 1; j < t.size(); j){if(s[i …

方法引用详解

什么是方法引用&#xff1f;&#xff1a;针对于函数式接口中的抽象方法 为什么用方法引用&#xff1f;&#xff1a;避免代码的重复&#xff0c;简便书写&#xff0c;提高效率 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数…

数据结构之“栈”(全方位认识)

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 栈是一种数据结构&#xff0c;具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲&#xff01;&#xff01; …

u盘存了东西却显示没有文件怎么办?原因分析与解决方案

在数字化时代&#xff0c;U盘已成为我们日常生活中不可或缺的存储设备。然而&#xff0c;有时我们可能会遇到一种令人困惑的情况&#xff1a;明明在U盘中存储了重要文件&#xff0c;但插上电脑后却显示没有文件。这种突如其来的“消失”不仅让人感到焦虑&#xff0c;更可能对我…

web前端开发——开发环境和基本知识

今天我来针对web前端开发讲解一些开发环境和基本知识 什么是前端 前端通常指的是网站或者Web应用中用户可以直接与之交互的部分&#xff0c;包括网站的结构、设计、内容和功能。它是软件开发中的一个专业术语&#xff0c;特别是指Web开发领域。前端开发涉及的主要技术包括HTML…

Windows ipconfig命令详解,Windows查看IP地址信息

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 ipconfig 1、基…

mac|Mac压缩与解压缩

1、系统自带的压缩软件。但是它能解压的格式很少 2、keka&#xff08;优点&#xff1a;体积小&#xff0c;没广告&#xff09; 支持压缩格式&#xff1a;7z&#xff0c;Zip&#xff0c;Tar&#xff0c;Gzip&#xff0c;Bzip2&#xff0c;DMG&#xff0c;ISO 支持的提取格式&…

计算机专业怎么选择电脑

现在高考录取结果基本已经全部出来了&#xff0c;很多同学都如愿以偿的进入到了计算机类专业&#xff0c;现在大部分同学都在为自己的大学生活做准备了&#xff0c;其中第一件事就是买电脑&#xff0c;那计算机类专业该怎么选择电脑呢&#xff1f; 计算机专业是个一类学科&…

golang线程池ants-实现架构

1、总体架构 ants协程池&#xff0c;在使用上有多种方式(使用方式参考这篇文章&#xff1a;golang线程池ants-四种使用方法)&#xff0c;但是在实现的核心就一个&#xff0c;如下架构图&#xff1a; 总的来说&#xff0c;就是三个数据结构&#xff1a; Pool、WorkerStack、goW…

性能测试相关理解(一)

根据学习全栈测试博主的课程做的笔记 一、说明 若未特别说明&#xff0c;涉及术语都是jmeter来说&#xff0c;线程数&#xff0c;就是jmeter线程组中的线程数 二、软件性能是什么 1、用户关注&#xff1a;响应时间 2、业务/产品关注&#xff1a;响应时间、支持多少并发数、…

Oracle 11.2.0.1升级到11.2.0.4并做rman备份异机恢复

下载好数据库升级包&#xff0c;想去Oracle官网下载的&#xff0c;提示没有授权 只能在csdn找付费的了&#xff0c;9块1个&#xff0c;下载了前2个。 注意&#xff0c;总共有7个包&#xff0c;如果Oracle是安装在linux服务器&#xff0c;且无图形界面管理的 只需要第一&#xf…

Java面试八股之如何提高MySQL的insert性能

如何提高MySQL的insert性能 提高MySQL的INSERT性能可以通过多种策略实现&#xff0c;以下是一些常见的优化技巧&#xff1a; 批量插入&#xff1a; 而不是逐条插入&#xff0c;可以使用单个INSERT语句插入多行数据。例如&#xff1a; INSERT INTO table_name (col1, col2) V…

C++笔试强训2

文章目录 一、选择题二、编程题 一、选择题 和笔试强训1的知识点考的一样&#xff0c;因为输出的是double类型所以后缀为f,m.n对其30个字符所以m是30&#xff0c;精度是4所以n是4&#xff0c;不加符号默认是右对齐&#xff0c;左对齐的话前面加-号&#xff0c;所以答案是-30.4f…

最新扣子(Coze)实战案例:使用扩图功能,让你的图任意变换,完全免费教程

&#x1f9d9;‍♂️ 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI应用。 &#x1f4dc; 本教程是《AI应用开发系列教程之扣子(Coze)实战教程》&#xff0c;完全免费学习。 &#x1f440; 微信关注公从号&#xff1a;斜杠君&#xff0c;可获取完整版教程。&a…

深入探索C语言中的结构体:定义、特性与应用

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 目录 结构体的介绍结构体定义结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构体的介绍 在C语言中&#xff0c;结构体是一种用户自定义的数据类型&#xff0c;它允许开发者将不同类型的变量组合在一起…

MySQL数据库树状结构查询

一、树状结构 MySQL数据库本身并不直接支持树状结构的存储&#xff0c;但它提供了足够的灵活性&#xff0c;允许我们通过不同的方法来模拟和实现树状数据结构。具体方法看下文。 数据库表结构&#xff1a; 实现效果 查询的结果像树一样 二、使用 以Catalog数据表&#xff0c…

lua入门(1) - 基本语法

本文参考自&#xff1a; Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用&#xff1a; 如下图: 按…