【数据库】缓冲区管理器结构,几种常用替换策略分析,pin钉住缓冲区块防止错误的替换,以及缓冲区管理带来的代价优化

缓冲区管理

专栏内容

  • 手写数据库toadb
    本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。
    本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上tag,方便阶段学习。

开源贡献

  • toadb开源库

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

    • 缓冲区管理
  • 前言
  • 概述
  • 缓冲区管理结构
  • 缓冲区管理策略
  • 缓冲区管理与查询执行的关系
  • 总结
  • 结尾

在这里插入图片描述

前言

随着信息技术的飞速发展,数据已经渗透到各个领域,成为现代社会最重要的资产之一。在这个大数据时代,数据库理论在数据管理、存储和处理中发挥着至关重要的作用。然而,很多读者可能对数据库理论感到困惑,不知道如何选择合适的数据库,如何设计有效的数据库结构,以及如何处理和管理大量的数据。因此,本专栏旨在为读者提供一套全面、深入的数据库理论指南,帮助他们更好地理解和应用数据库技术。

数据库理论是研究如何有效地管理、存储和检索数据的学科。在现代信息化社会中,数据量呈指数级增长,如何高效地处理和管理这些数据成为一个重要的问题。同时,随着云计算、物联网、大数据等新兴技术的不断发展,数据库理论的重要性日益凸显。

因此,本专栏的分享希望可以提高大家对数据库理论的认识和理解,对于感兴趣的朋友带来帮助。

概述

为了更快的查询,我们操作的数据都是加载到缓冲区中,为了更好的得到缓冲区,尽可能的缩小得到缓冲区的延迟,减少不可能满足要求的情况,就需要缓冲区管理器。

本文主要分享缓冲区管理的策略,以及缓冲区管理器的作用。

缓冲区管理结构

数据库的执行模块一般都直接与缓冲区交互,而当需要的数据不在缓冲区时,由缓冲区和磁盘之间交互,加载对应的数据。

一般有两种缓冲区管理结构:

  1. 在大多数关系型DBMS中,缓冲区管理器直接控制内存;
  2. 缓冲区管理器在虚拟内存中分配缓冲区,允许操作系统来决定缓冲区在何时真正在内存中,以及那些缓冲区在操作系统管理的磁盘的swap空间中。许多内存型数据库和面向对象的数据库会按这种方式操作。

不管使用那种结构,都会引起同样的问题 :缓冲区管理器应当限制使用缓冲区的数量,使得它们能够适合内存的容量。

当采用缓冲区管理器直接管理内存的结构时,请求的缓冲区数量,超过了可得到的空间时,就不得不通过将缓冲区的内容刷到磁盘上,来清理一部分缓冲区。

而当使用虚拟内存方式时,可得到的空间会超过真正的内存容量,如果缓冲区超过物理内存容量时,操作系统就会将多块内存在磁盘swap区移进移出,使性能出现波动,系统也会花费大量时间来作交换。

缓冲区管理策略

为了避免缓冲区超过可用上限,带来严重的波动,缓冲区管理器必须给出缓冲区的一个合理使用上限,而到达这一上限之后,需要采用一定策略来保证我们可用的缓冲区请求不被延迟。

这正如大家所熟悉的操作系统的内存调度替换策略,一般有以下几种:

  • 最近最少使用 LRU

LRU策略是替换出最长时间没有读或写过的块;这种方法要求缓冲区管理器维护一张表,来记记录每个缓冲区被最后访问的时间,每次访问都需要生成或更新这个表项,有一定的维护工作量。但是LRU是一个有效的策略。

  • 先进先出 FIFO

在FIFO策略中,当需要一个缓冲区时,需要清空占用时间最长的那个缓冲区,并用来装入请求的数据块。在这种方法中,缓冲区管理器同样也要记录一张表,来记录每个缓冲区的访问时间,当新缓冲区时才会生成表项,再次访问并不会更新表项。

相比LRU,FIFO更少的维护成本,但是它会造成更多的错误,使用最频繁的块反而会被替换出去,又很快又被加载。

  • “时钟”算法

这个算法,可以看成是LRU算法的一种实现,它更有效。将缓冲区看作一个环,一个遍历指示器指向缓冲区中的一个,如果想找到一个可用缓冲区,指示器就按顺时针旋转查找。

每个缓冲区有一个标记,它可以是0或1,当标志为0时,就可以被选中,替换当前缓冲区的内容到磁盘上,同时加载新请求的数据块到缓冲区中,并置为1;如果指示器遇到的缓冲区标记为1,就将它减为0,这样在下一次循环到时,就可以选择;

同样的,当缓冲区被访问时,也会将标记设置为1,这样说明最近被使用过,减少替换的概率。

指示器查找时,直到找到缓冲区标记为0的缓冲区为直,最多会查找第二遍就可以找到。

当然这个标志的取值,可以用更大的数字,意味着指示器在缓冲区上限较小时,需要循环更多遍。

  • 系统控制

查询执行器或者其它数据库模块,可以给缓冲区管理器一些建议,避免像LRU,FIFO,时钟”算法等这些严格的策略引起错误。

比如“钉住”某一缓冲区块,暂时绕过策略控制,比如之前博客提到的一趟算法中,正在一条接一条元组扫描时,这个数据块就不能被替换出去。还有对于正在用到的B树索引的根数据块,它是非常频繁被访问的。

这样可以保持该缓冲区一直在内存中,等到使用完成时,解除就可以使用策略进行替换。

缓冲区管理与查询执行的关系

当执行时,需要得到M个缓冲区时,缓冲区管理器能够保证它得到足够的缓冲区吗?

在缓冲区管理器设计时需要考虑两个问题 :

  • 替换算法能够适应得到的缓冲区数目M的变化;
  • 缓冲区替换给执行带来的额外磁盘I/O数量;

这就需要缓中区管理和执行算法都有一定的适应性;对于第二个问题,需要缓冲区管理器,在占用一定缓冲区后,就要进行提前清理缓冲区,减少需求时的等待代价。

总结

通过对于缓中区管理器的了解,可以看到它的实现策略也是我们熟悉的几种算法,当然会存在一些在实践中的问题,需要在使用时注意。

最后分享一段helloworld的代码

#include <stdio.h>void hello(void) {printf("Hello, World!\n");
}int main(void) {void (*func_ptr)(void) = hello;(*func_ptr)();return 0;
}

在这个例子中,我们定义了一个名为 hello 的函数,它输出 “Hello, World!”。然后,在 main 函数中,我们定义了一个名为 func_ptr 的函数指针,并将其指向 hello 函数。最后,我们通过 (*func_ptr)() 来调用 hello 函数。注意,在使用函数指针时,我们需要使用 (*func_ptr) 来调用函数。

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

【算法】装备合成(二分)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 牛牛有x件材料a和y件材料b&#xff0c;用2件材料a和3件材料b可以合成一件装备&#xff0c;用4件材料a和1件材料b也可以合成一件装备。牛牛想要最大化合成的装备的数量&#xff0c;于是…

重新开启GPT Plus充值通道——基于前端开发者工具

chatGPT PLUS充值通道的关闭 由于chatGPT用户激增&#xff0c;近日&#xff0c;OpenAI的CEO Sam Altman宣布需要暂停新用户对ChatGPT Plus的订阅。在X上&#xff0c;他表达了对于确保用户体验的承诺&#xff0c;同时也提到了用户可以通过应用程序内的通知功能来了解服务恢复的…

代码随想录算法训练营 ---第四十五天

前言&#xff1a; 昨天的题做过之后&#xff0c;今天的题基本上都很简单&#xff0c;但是要注重一下细节。 第一题&#xff1a; 简介&#xff1a; 动态规划五部曲&#xff1a; 1.确定dp数组的含义 dp[i]&#xff1a;爬到有i个台阶的楼顶&#xff0c;有dp[i]种方法 2.确定dp…

常见指令的数据通路和执行过程

作此篇的原因是17年19题&#xff1a; 本题选A&#xff0c;做的时候总感觉不够通透&#xff0c;因此把这题涉及到的内容全部看了一遍&#xff0c;顿时没有那种朦胧感了 零、五段式流水线&#xff1a; 以下均为MIPS设定&#xff1a;指令长度为32位&#xff0c;主存按字节编址&a…

Echarts 最简单创建柱状图

设置容器 <div ref"myChart" style"width: 500px; height: 500px;"> </div>mounted() {//document渲染完成this.draw()}draw() {const myChart this.$echarts.init(this.$refs.myChart)//初始化对象myChart.setOption({ //参数配置项title: …

探索接口测试:SOAP、RestFul规则、JMeter及市面上的接口测试工具

引言 在当今软件开发领域&#xff0c;接口测试扮演着至关重要的角色。随着系统变得日益复杂和互联&#xff0c;对于内部和外部接口的测试变得愈发关键。接口测试不仅仅是验证接口的正确性&#xff0c;更是确保系统的稳定性、安全性和性能优越性的关键一环。 本篇博客将带您深入…

[Linux]进程等待

文章目录 3.进程等待3.1什么是进程等待3.2为什么要进程等待3.3如何进行进程等待?1.wait2.waitpid2.1函数的讲解2.2status的理解2.3代码理解 3.4学后而思1.直接用全局变量获取子进程退出码可以吗?如下2.进程具有独立性 退出码是子进程的数据 父进程是如何拿到退出码的3.对内存…

云匣子 FastJson反序列化RCE漏洞复现

0x01 产品简介 云匣子是租户连接云资源的安全管理工具&#xff0c;帮助云租户更加安全、精细的管理云上的虚拟机、数据库等资源。 云安宝结合多年的运维和安全实践&#xff0c;将云上的运维和安全有机结合&#xff0c;实现对运维过程的事前规划、事中控制和 事后审计。在此之上…

nodejs微信小程序+python+PHP-婚纱摄影预约系统的设计与实现-安卓-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Linuxfork,写时拷贝

1.prinf隐藏的缓冲区 1.思考:为什么会有缓冲区的存在? 2.演示及思考? 1).演示缓存区没有存在感 那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢? 我们用代码演示一下: 比如打开一个main.c,输入内容如下: #include <stdio.h> int main() { …

LLaMA 2:开源的预训练和微调语言模型推理引擎 | 开源日报 No.86

facebookresearch/llama Stars: 36.0k License: NOASSERTION LLaMA 2 是一个开源项目&#xff0c;用于加载 LLaMA 模型并进行推理。 该项目的主要功能是提供预训练和微调后的 LLaMA 语言模型的权重和起始代码。这些模型参数范围从 7B 到 70B 不等。 以下是该项目的关键特性…

kubernetes架构及核心组件简单介绍

目录 整体架构控制面kube-apiserver访问控制通知 kube-scheduler概述默认调度策略 kube-controller-manageretcd架构Raft协议日志复制 数据面kubeletkube-proxy 整体架构 集群架构图 控制面 控制面是kubernetes的核心组件&#xff0c;负责管理和控制集群的整体行为&#xf…

jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程 目录 1、下载jdk17 2、安装jdk17 3、配置环境变量 -> 电脑无其他jdk 4、…

Echarts title标题配置项的使用 更改颜色 副标题

title配置项主要是对图表的标题进行配置 title配置项所有属性文档 title&#xff1a; { ...... }设置标题 副标题 text: 简单创建柱形图,//图表标题 subtext: 副标题,如果想对副标题设置 超链接 边框 颜色 宽度…等 比如&#xff1a;设置超链接 sublink:‘…’, 设置标题位置…

10_7iic整体框架流程

在内核中 这边把iic整个流程分成了 4层 iic_dtiver at24_iic_eeprom 也就是我们的自己的驱动 i2c-core.c 核心层 i2c/busses/i2c-s3c2410.c 控制器层 平台总线驱动层,或者也是图中的设备树 硬件描述 我们假设 板子上有三个iic控制器 0 1 2 这里在控制器0 上挂载了gt24c02的eep…

STK Components 二次开发-创建地面站

1.地面站只需要知道地面站的经纬高。 // Define the location of the facility using cartographic coordinates.var location new Cartographic(Trig.DegreesToRadians(-75.596766667), Trig.DegreesToRadians(40.0388333333), 0.0); 2.创建地面站 创建方式和卫星一样生成对…

如何使用JMeter测试导入接口/导出接口

今天一上班&#xff0c;被开发问了一个问题&#xff1a;JMeter调试接口&#xff0c;文件导入接口怎么老是不通&#xff1f;还有导出文件接口&#xff0c;不知道文件导到哪里去了&#xff1f; 我一听&#xff0c;这不是JMeter做接口测试经常遇到的嘛&#xff0c;但是一时半会又…

解决视口动画插件jquery.aniview.js使用animate.css时无效的问题(最新版本网页视口动画插件的使用及没作用、没反应)

当网站页面元素进入视口时自动应用过渡效果。CSS过渡效果可以为网页添加动画效果&#xff0c;并提供了一种平滑的转换方式&#xff0c;使元素的变化更加流畅和生动。而通过jQuery插件来获取页面滚动位置决定合适调用动画效果。 一、官网 animate.css官网 一款强大的预设css3动…

Linux的基本指令(四)

目录 前言 时间相关的指令 date指令 时间戳 日志 时间戳转化为具体的时间 cal指令 find指令&#xff08;十分重要&#xff09; grep指令&#xff08;行文本过滤工具&#xff09; 学前补充 什么是打包和压缩&#xff1f; 为什么要打包和压缩&#xff1f; 怎么打包和…

【数据结构】二叉树oj题

在处理oj题之前我们需要先处理一下之前遗留的问题 在二叉树中寻找为x的节点 BTNode* BinaryTreeFind(BTNode* root, int x) {if (root NULL)return NULL;if (root->data x)return root;BTNode* ret1 BinaryTreeFind(root->left, x);BTNode* ret2 BinaryTreeFind(ro…