缓冲池管理器

开发环境搭建

克隆
git clone https://github.com/cmu-db/bustub.git
cd bustub/
切换分支
git checkout -b branchname v20221128-2022fall
创建docker镜像
docker build . -t bustub_img
创建容器
docker create -it --name bustub_container -v “E:/cmu/bustub”:“/bustub” bustub_img bash
启动容器
docker start -ia bustub_container
查看有哪些已经启动的容器
docker ps
进入指定容器
docker exec -it 30eb49a811aa /bin/bash

Project0

编译

在/bustub/build生成makefile:cmake …

报错:CMake Warning at CMakeLists.txt:47 (message):
!! We recommend that you use clang-12 for developing BusTub. You’re using
GNU 11.4.0, which is not clang.
解决:在主目录的CMakeLists下增加2行 set(CMAKE_C_COMPILER “/usr/bin/clang-12”)
set(CMAKE_CXX_COMPILER “/usr/bin/clang+±12”)
或者:加编译选项:-DCMAKE_C_COMPILER=usr/bin/clang-12和-DCMAKE_CXX_COMPILER=/usr/bin/clang+±12
设置失效:ctrl+ship+p cmake配置 选择clang-12,然后重新打开一个终端

编译:make starter_trie_test

调试

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug",
            "program": "${workspaceFolder}/build/test/starter_trie_test",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "make starter_trie_test"
        },
    ]
}

make starter_trie_test任务:这里使用-C指定makefile文件的路径在当前目录的build目录下

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "make starter_trie_test",
			"command": "make",
			"args": [
				"-C",
				"build",
				"starter_trie_test"
			]
		}
	]
}

Project1:缓冲池管理器

task1:可扩展哈希

目录大小:2^全局深度
全局深度: 取元素的低多少位 进行分类,放入不同的桶中
桶的局部深度:当有其它桶进行分裂使得目录扩张(全局深度增加),会导致未分裂的桶局部深度低于全局深度。这种情况下,如果该桶发生溢出,那么只进行桶分裂,全局深度不增加。
全局深度>局部深度 发生桶溢出时:只分裂不扩张 全局深度=局部深度 发生桶溢出时:既分裂又扩张

关键:扩张是把所有桶全部尾插到目录中,桶分裂时使用局部深度形成的掩码来找到指向当前桶的所有idx,将它们重新指向新的桶
,最后重新分配当前桶中的所有元素。

task2: LRU-K替换策略

  • 力扣146.LRU缓存
    std::list<std::pair<int,int>> ls;//k,v
    std::unordered_map<int, decltype(ls.begin())> lru_map;//k,list

    get:要将查看的这个key再次put
    put:先判断put的key是否已经存在,如果已经有了,就将当前旧的key删除,重新插入到头部。

  • LRU-K

    std::list<std::pair<frame_id_t, Frameinfo>> ls1;//frame_id 访问次数
    std::list<std::pair<frame_id_t, Frameinfo>> ls2;//frame_id 访问次数
    //使用map,可以O(1)时间复杂度 根据frame_id直接访问到list上各页面的访问次数
    //同时,可以直接操作list节点进行移动
    std::unordered_map<frame_id_t, decltype(ls1.begin())> m;//frame_id list1/list2的迭代器
    

    使用map保存{frame_id:list迭代器},就可以通过frame_id直接找到链表上的该页面对应信息,使用如下Frameinfo结构体保存每个页的信息。
    struct Frameinfo { size_t visits = 0;//访问次数 bool evictable_{false};//是否可驱逐 };

task3:缓冲池管理器

功能:系统向缓冲池管理器请求某指定page_id的页面,缓冲池管理器经过一系列操作,返回页面在内存中的地址。
具体操作:先在可拓展哈希中找该页面,可拓展哈希的list中存储的是(page_id,frame_id),根据得到的frame id即可在pages_数组中找到该页。如果可拓展哈希中没有该页面,就先看free_list还有没有空位,如果有,直接调用WritePage把Disk上的页面读取到内存,否则先调用LRU-K驱逐一个内存块。
在这里插入图片描述
原子变量的使用

  • 由于不允许拷贝,只能使用值初始化
    头文件#include
    atomic_int m(0);

size_t转int:
static_cast<int>(i)

变量意义
page_table_可拓展哈希,保存(page_id,frame_id)
replacer_LRU-K,主要是在需要驱逐页面时使用,传出frame_id
pages_以frame_id为下标,保存所有页面的数组
free_list_保存pages_中空闲页面的frame_id,一开始就被初始化为从0开始的int
page页面,保存有该页面的page_id,实际数据是一个char数组

NewPgImp
在缓冲池中新增一个空白页面,并指定好页面的id。如果free_list已满,就尝试驱逐页面(如果页面是脏,需要写回磁盘),如果都无法驱逐,就返回nullptr

frame_id的获取:首先检查空闲链表free_list_,如果有空闲frame_id就直接取出一个使用,然后添加新页面信息。如果没有空闲,就驱逐页面得到一个frame_id,然后添加新页面信息。
怎么驱逐页面:调用Evict得到驱逐页面的frame_id后,需要检查该页是否为脏页,如果是,则需要写回磁盘。此外,还需要把该页信息从可拓展哈希中删除。
怎么添加新页面信息:AllocatePage函数会在定义的next_page_id上依次+1.每次只需要调用它获取新的page_id。由于所有页面都保存在pages_数组中,因此设置pages[frame_id]的信息即可。此外,还需要把页面信息写入可拓展哈希和LRU-K

FetchPgImp

读一个页面,先看是不是在缓冲池中,如果不在,需要从磁盘上读入

Project2:B+树

数据库支持多种索引方式:

哈希索引 全文索引 B+树索引

mysql数据库为什么使用B+树作为索引的数据结构

为了加快记录的查找,必须使用索引来避免对全表进行顺序查找。
二叉树:如果数据关键字恰好有顺序,会导致形成特别深的二叉树
平衡二叉树:避免了二叉树中形成线性链表的情况,但一个节点所保存的信息太少,无法有效利用到磁盘预读机制
多路平衡查找树(B树):很好利用了磁盘预读机制,但每个非叶子节点记录自己存储的数据,不利于区间查找,且导致可存储的节点数目大大减少。
B+树:所有数据存储在叶子节点中,且叶子节点被串成有序的双向链表,便于区间查找。关键设计在于,让一个节点的大小恰好等于一个块的大小(4K),这样减少了磁盘IO。内部节点只存储key和维持树形结构的指针,叶子节点只存储key和对应数据。

磁盘
A是磁道,C是扇区,D是磁盘块(簇)由多个扇区组成

区分磁盘预读与cpu预取机制

磁盘预读:由于内存比磁盘的读写速度快,需要尽量减少磁盘IO次数。现在常见磁盘扇区大小为4K个字节,因此每次磁盘读取都至少将1页数据加载进内存。
cpu预取:内存的读写速度太慢,为了减小其与cpu的差距,在cpu内部引入了3级缓存,从内存读取数据时,cpu会试图预取64字节数据到缓存。

对于频繁写而不是频繁读的场景,使用LSM树比B+树更适合:例如日志系统

因为B+树的数据都存储在叶子节点中,叶子节点一般存储在磁盘中。每次写入数据都是要随机写入磁盘。
LSM树简介:至少由2棵树组成,1棵较小,存储在内存中,1棵较大,存储在磁盘中。内存中的树变大到某阈值,就批量写入到磁盘的树中(相当于有序链表的归并)

数据库存储引擎
mysql有2种常用的存储引擎:MyISAM、InnoDB
存储引擎的作用:数据先传输到存储引擎,再按照其规定存储格式保存到数据文件中。

MyISAMInnoDB
不支持事务支持事务
存储速度快存储速度慢些
不支持外键支持外键

InnoDB默认定义的块大小是16KB,即每次磁盘IO,读取数据都是16KB的倍数

柔性数组成员
结构体的最后一个元素可以是大小未定的数组,被称作柔性数组

#include <iostream>
using namespace std;
struct A
{
    int x;//4
    int str[];//大小未定
};
int main()
{
	cout<<sizeof(A)<<endl;//4
    A* p = new A;
    for (size_t i = 0; i < 10; i++)
    {
        p->str[i] = 1;
    }
	return 0;
}

std::lower_bound()和std::upper_bound()

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(){
  	vector<int> num = {1,2,4,7,15,34}; 
	sort(num.begin(), num.end());//从小到大排序 
	int pos1=lower_bound(num.begin(), num.end(),7)-num.begin();    //返回数组中第一个大于或等于被查数的值 
	int pos2=upper_bound(num.begin(), num.end(),7)-num.begin();    //返回数组中第一个大于被查数的值
	cout<<pos1<<" "<<num[pos1]<<endl;//3 7
	cout<<pos2<<" "<<num[pos2]<<endl;//4 15
	return 0;	
}

叶子的查找与非叶子的查找

叶子:0开始找,只有等于和不等于两种情况
非叶子:1开始找(0处没保存值),使用lower_bound查找的最终位置t,如果结果大于当前数,则返回array_[t-1],如果等于当前数,则返回array_[t+1],如果小于,那么返回array_最后一个元素。

B+树

内部节点的key是其下叶子节点的最小值,

find
对于非叶子节点,

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

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

相关文章

自然语言处理课程论文:《Attention is all you need》复现与解读

目录 1.背景介绍 1.1 文献介绍 1.2 研究背景 1.3 知识概述 1.3.1 机器翻译 1.3.2 attention机制与self-attention机制 2.数据来源与处理 2.1 数据集描述 2.2 数据处理 3. 模型架构 ​​​​​​​3.1 Positional Embedding ​​​​​​​3.2 Multi-Head Attention ​​​​​…

[UE虚幻引擎] DTSpeechVoice 文字转语音播放 插件说明

本插件可以在UE中使用蓝图把文本转成语音播放&#xff0c;播放的声音引擎是使用Windows自带的语音引擎&#xff0c;支持Win10&#xff0c;Win11。 系统设置 首先确认电脑是否有语音系统&#xff0c;一般正常安装的电脑都是自带的。 如果要播放多语言的&#xff0c;请自己下载其…

突发!OpenAI停止不支持国家API,7月9日开始执行

6月25日凌晨&#xff0c;有部分开发者收到了OpenAI的信&#xff0c;“根据数据显示&#xff0c;你的组织有来自OpenAl目前不支持的地区的API流量。从7月9日起&#xff0c;将采取额外措施&#xff0c;停止来自不在OpenAI支持的国家、地区名单上的API使用。” 但这位网友表示&am…

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

文献阅读:通过双线性建模来破译神经元类型连接的遗传密码

文献介绍 文献题目 Deciphering the genetic code of neuronal type connectivity through bilinear modeling 研究团队 Mu Qiao&#xff08;美国加州理工学院&#xff09; 发表时间 2024-06-10 发表期刊 eLife 影响因子 7.7 DOI 10.7554/eLife.91532.3 摘要 了解不同神经元…

【C++STL】Vector扩容机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

“Hello, World!“ —— 初学者进入编程世界的第一步

布莱恩W.克尼汉&#xff08;Brian W. Kernighan&#xff09;—— Unix 和 C 语言背后的巨人 布莱恩W.克尼汉 布莱恩W.克尼汉在 1942 年出生在加拿大多伦多&#xff0c;他在普林斯顿大学取得了电气工程的博士学位&#xff0c;2000 年之后取得普林斯顿大学计算机科学的教授教职。…

SpringBoot开启事务日志

一般框架开启日志的方式&#xff1a; 开启某个包下的日志就写该包路径&#xff0c;开启某个类下的日志就写该类路径。

3d渲染软件有哪些(1),渲染100邀请码1a12

3D渲染是把三维模型转成2D图像的过程&#xff0c;领域不同常用的软件也不一样&#xff0c;今天我们就简单介绍几个。 在介绍前我们先推荐一个设计人员常用到的工具&#xff0c;就是网渲平台渲染100&#xff0c;通过它设计师可以把本地渲染放到云端进行&#xff0c;价格也不贵&a…

PCL笔记二 之VS环境配置(不同版本Debug+Release编译)

PCL笔记二 之VS环境配置&#xff08;不同版本DebugRelease编译&#xff09; PCL官网&#xff1a;https://github.com/PointCloudLibrary/pcl/releases众所周知&#xff0c;PCL是一个用于点云处理并且依赖不少三方库的一个算法库&#xff0c;同时在编译配置环境时也很复杂&…

【嵌入式DIY实例】-Nokia 5110显示BME280传感器数据

Nokia 5110显示BME280传感器数据 文章目录 Nokia 5110显示BME280传感器数据1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板(ESP12-E 模块)和 BME280 气压、温度和湿度传感器构建一个简单的本地气象站。 NodeMCU 从 BME280 传感器读取温度、湿度和压力值…

轻松打造分班查询系统,这个工具助您一臂之力!

新学期伊始&#xff0c;老师们知道该如何快捷制作并发布分班查询系统吗&#xff1f;面对繁杂的学生名单和班级分配&#xff0c;无疑是一项巨大的麻烦。传统的纸质通知效率低下&#xff0c;容易出错&#xff0c;更别提在信息传递过程中可能出现的混乱和误解了。 现在有一个工具可…

枚举的使用(enum)

文章目录 前言一、枚举是什么&#xff1f;二、枚举的使用 1.使用枚举设置常量2.操作枚举类型成员的方法3.枚举类型中设置构造方法&#xff08;给枚举常量赋值&#xff09;4.枚举常量中设置方法总结 前言 枚举类型可以将常量封装在类或接口中&#xff0c;提供了安全检查的功能。…

开源网安参与编制的《代码大模型安全风险防范能力要求及评估方法》正式发布

​代码大模型在代码生成、代码翻译、代码补全、错误定位与修复、自动化测试等方面为研发人员带来了极大便利的同时&#xff0c;也带来了对安全风险防范能力的挑战。基于此&#xff0c;中国信通院依托中国人工智能产业发展联盟&#xff08;AIIA&#xff09;&#xff0c;联合开源…

什么是CDN?CDN的工作原理是怎样的?

1.什么是CDN&#xff1f; CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。CDN是构建在网络之上的内容分发网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&am…

分压电路 ADC计算电压 【老板再也不能开除我了 】

经典分压电路 一个电压过来 adc这里的电压等于&#xff1a; 如是12位adc 那么他最大值就是4095 如参考电压是5v 则&#xff1a;5v/4095 实际电压V*(R2/(R1R2)&#xff09;/adc值 转化&#xff1a;实际电压V 5v*(adc值/4095)/(R2/(R1R2)) &#xff1a;老板再也不能 因为不会…

word文档怎么加密?电脑文件加密的详细步骤【分享4个】

为了保护Word文档不被未经授权的人员访问或修改&#xff0c;我们通常会采用加密的方式来增加其安全性。那么Word文档怎么加密&#xff1f;电脑文档安全成为了大家所关心的话题。 本文针对不同的情况&#xff0c;本文分享了4种电脑文件加密的方法&#xff0c;每一种加密方法都比…

2-自动驾驶关键技术框架

框架 来自《自动驾驶汽车决策与控制》这本书 三大技术 车载平台的关键技术&#xff1a; 环境感知技术&#xff1a;这是自动驾驶车辆能够“看”和“感知”周围世界的技术。它包括使用摄像头、雷达、激光雷达&#xff08;Lidar&#xff09;和超声波传感器来检测和识别道路、障…

js实现数据加密,jwt加密方式

一个简单的数据加密 const crypto require("crypto");// 普通的数据加密 function sign(msg,key){ // 原始信息&#xff0c;密钥 String// "sha256" :加密的算法&#xff0c;key :密钥&#xff0c;msg :要加密的信息&#xff0c;"hex" :转成16…

【unity笔记】六、UI实现下拉列表切换视角

具体步骤如下 1. 创建UI下拉列表&#xff1a; 在Unity场景中右键点击并选择UI -> 下拉列表 来创建一个新的下拉列表。 2. 添加摄像机选项&#xff1a; 在Dropdown的Options属性中添加新的选项&#xff0c;通过点击按钮来添加选项&#xff0c;并为每个选项设置一个显示名…