【数据库】缓冲区管理器结构,几种常用替换策略分析,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
如有错误或者疏漏欢迎指出,互相学习。

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

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

相关文章

微软发布了Orca 2,一对小型语言模型,它们的性能超越了体积更大的同类产品

尽管全球目睹了OpenAI的权力斗争和大规模辞职&#xff0c;但作为AI领域的长期支持者&#xff0c;微软并没有放慢自己的人工智能努力。今天&#xff0c;由萨提亚纳德拉领导的公司研究部门发布了Orca 2&#xff0c;这是一对小型语言模型&#xff0c;它们在零样本设置下对复杂推理…

STK Components 二次开发-地面站传感器

上一篇我们说了创建地面站&#xff0c;那么这次我们在地面站添加一些特效。 1. 创建地面站 var locationPoint1 new PointCartographic(m_earth, new Cartographic(Trig.DegreesToRadians(117.17066), Trig.DegreesToRadians(31.84056), 240.359)); m_facility new Platfor…

计算机视觉面试题-01

计算机视觉面试通常涉及广泛的主题&#xff0c;包括图像处理、深度学习、目标检测、特征提取、图像分类等。以下是一些可能在计算机视觉面试中遇到的常见问题&#xff1a; 图像处理和计算机视觉基础 图像是如何表示的&#xff1f; 图像在计算机中可以通过不同的表示方法&…

以非常规思维去做一个嵌入式音视频开发项目!

前言&#xff1a; 大家好&#xff0c;在上周的文章里面&#xff0c;给大家介绍了一个音视频项目&#xff0c;本周继续来分享音视频项目&#xff0c;之前说过&#xff0c;如果你不知道做什么功能开发嘛&#xff0c;因为接触的少&#xff1b;我突然想到&#xff0c;可以去参考市面…

JVM的小知识总结

加载时jvm做了这三件事&#xff1a; 1&#xff09;通过一个类的全限定名来获取该类的二进制字节流 什么是全限定类名&#xff1f; 就是类名全称&#xff0c;带包路径的用点隔开&#xff0c;例如: java.lang.String。 即全限定名 包名类型 非限定类名也叫短名&#xff0c;就…

利用STM32和MFRC522 IC实现智能卡的读取和数据存储

利用STM32微控制器和MFRC522 RFID读写器芯片&#xff0c;可以实现智能卡的读取和数据存储功能。智能卡是一种集成了RFID技术和存储芯片的卡片&#xff0c;它可以用于身份验证、门禁控制、支付系统等应用场景。下面将介绍如何使用STM32和MFRC522芯片进行智能卡的读取和数据存储&…

【计算机视觉】【图像处理综合应用】路沿检测

实验内容&#xff1a;针对给定的视频&#xff0c;利用图像处理基本方法实现道路路沿的检测&#xff1b; 提示&#xff1a;可利用Hough变换进行线检测&#xff0c;融合路沿的结构信息实现路沿边界定位&#xff08;图中红色的点位置&#xff09;。 处理视频文件 处理视频文件的主…

Nginx(资源压缩)

建立在动静分离的基础之上&#xff0c;如果一个静态资源的Size越小&#xff0c;那么自然传输速度会更快&#xff0c;同时也会更节省带宽&#xff0c;因此我们在部署项目时&#xff0c;也可以通过Nginx对于静态资源实现压缩传输&#xff0c;一方面可以节省带宽资源&#xff0c;第…

GPT4测试 — 答题能力及文档处理能力

创建gdp.txt文件&#xff08;使用word 2013创建的文档测试了也可以&#xff0c;WPS建的不行&#xff09; 上传文件&#xff0c;输入prompt: 请帮我答题&#xff0c;把那个正确答案的选项的字母序号填在&#xff08;&#xff09;中&#xff0c;并返回文件blabla… 给我一个文件…

第二十三章 解析PR曲线、ROC曲线、AUC、AP(工具)

混淆矩阵Confusion Matrix 混淆矩阵定义 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表&#xff0c;以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值&#xff0c;矩阵的列表示预测值&#xff0c;下面我…

可燃气体监测仪助力燃气管网安全监测,效果一览

城市地下管线是指城市范围内供应水、排放水、燃气等各类管线及其附属设施&#xff0c;它们是保障城市正常运转的重要基础设施且影响着城市生命线。其中燃气引发的事故近些年不断增加&#xff0c;由于燃气管线深埋地下环境复杂&#xff0c;所以仅仅依赖人工巡查难以全面有效地防…

PCIE链路训练-状态机描述3

Configuration.Idle 1.当使用8b/10b编码时&#xff0c;non-flit模式下&#xff0c;在所用配置的lane上发送s Idle data Symbols&#xff0c;在flit mode下发送IDLE flit。 2.linkup 0 link两端的component均支持64.0GT/s的速率&#xff0c;根据进入此状态之前发送的8个TS2或…

2023/11/26总结

一些学习记录&#xff1a; 在对数据库进行一系列操作的时候&#xff0c;遇到一个问题&#xff0c;在插入数据的时候&#xff0c;我数据库对应的是自增id&#xff0c;但是插入后想获取到这个id去使用。我以为是不可以马上获取的&#xff0c;然后看到 项目进度 购物车&#xff…

springboot核心原理之@SpringbootApplication

1.SpringbootApplication Configuration标志的类 在spring ioc启动的时候就会加载创建这个类对象 EnableAutoConfiguration 中有两个注解 &#xff08;1&#xff09;AutoConfigurationPackage 扫描主程序包(主程序main所在包及其子包) 可以看到这个类 &#xff1a; static c…

Ubuntu:安装VSCode

参考博客Ubuntu下安装VSCODE_ubuntu安装vscode-CSDN博客中的第二种方式【安装包方式安装】&#xff0c;即可&#xff0c;安装非常easy~~~ 安装包方式安装&#xff1a; 1. 从VSCode官网下载最新版的deb安装包&#xff1a; https://code.visualstudio.com/Download&#xff0c;…

【论文解读】Real-ESRGAN:使用纯合成数据训练真实世界的超分辨率图像

图一是4种超分方法的对比效果 。 0 摘要 尽管在盲超分辨率方面已经进行了许多尝试&#xff0c;以恢复具有未知和复杂退化的低分辨率图像&#xff0c;但它们仍然远远不能解决一般的真实世界退化图像。在这项工作中&#xff0c;我们将强大的 ESRGAN 扩展到一个实际的恢复应用程序…

85基于Matlab的交通设施识别

基于Matlab的交通设施识别。 GUI设计图像处理, 基于数字图像处理&#xff0c;设计实现一个自然场景下公路交通限速标志分割和识别的程序。要求系统具有界面&#xff0c;并实现以下功能&#xff1a; 1&#xff09;读入自然场景下包含交通标志的图像&#xff1b; 2&#xff09;对…

Java多线程并发中部分不并发的问题

写Java实验发现个有意思的问题 三个线程&#xff0c;一个线程打印字符a&#xff0c;一个线程打印字符b&#xff0c;另一个线程打印数字&#xff0c;多次运行结果都是先打印混合输出的ab&#xff0c;完了再打印数字 有图有真相&#xff0c;我运行了10次 完整的代码是这个 clas…

win10下载Remix IDE桌面版以及空白页面的解决

文章目录 Remix IDE 的下载Remix IDE 空白页面的解决 Remix IDE 的下载 到 github 地址 https://github.com/ethereum/remix-desktop/releases 选择exe文件或根据自己电脑版本选择对应的zip文件进行下载&#xff0c;然后正常安装即可。 Remix IDE 空白页面的解决 有时打开Remix…

7 通用数字量输入输出GPIO

文章目录 7.0 GPIO概念7.1 GPIO工作原理7.2 GPIO寄存器以及编程7.2.5 GPIO寄存器编程设置与应用 7.3 GPIO跑马灯7.3.1 LED 输出初始化7.3.2 跑马灯输出实验7.3.3 按键输入实验 7.0 GPIO概念 GPIO&#xff08;general purpose intput output&#xff09;是通用输入输出端口的简…