烈火灼冰 - 实验
type: channel
link: https://blog.4c43.work/index.php/tag/%E5%AE%9E%E9%AA%8C/
items: 【USTCStudy】高级数据库系统课程实验Storage and Buffer Manager

【USTCStudy】高级数据库系统课程实验Storage and Buffer Manager
type: item
date: 2023-02-21T13:21:00+00:00
description: 开头先吐槽一下： 然后考试就考到了！！！（悲 题目说明 Lab 1：根据下面的设计要求，实现一个Storage and Buffer Manager。 设计具体要求：adbs-lab.pdf（课程网站下载） 按文档要求实现一个Storage and Buffer Manager，要求至少实现LRU算法。 底层文件默认采用目录式堆文件。 建议先构建一个5万个page（页号从0到49999）的堆文件（使用自己实现的FixNewPage()接口），然后再运行trace文件：data-5w-50w-zipf.txt（包含了50万次满足Zipfan分布-0.8的页面请求，即80%的请求集中在前20%的页号上），根据设计文档要求统计磁盘IO、Buffer命中率、运行时间等数据。 *下面的实验为选做内容，不做强制要求。如果完成了选做实验（一个或者多个），最后实验成绩会根据完成的情况适当加分： （1）实现CLOCK、LRU-2、LIRS等其它缓存置换算法（至少一种），并与LRU算法的性能进行对比； （2）加入缓存请求时的并发控制，通过内存锁(latch)解决缓存访问时的冲突；要求通过多线程方式执行trace并给出测试结果。 以下为实验报告内容。 实验背景 在这个项目中，我们将实现一个简单的存储和缓冲区管理器。该文档涉及存储和缓冲区管理器。将讨论缓冲区和帧大小、缓冲区和帧存储结构、页面格式、页面存储结构、文件格式、缓冲技术、散列技术、文件存储结构以及磁盘空间和缓冲模块的接口函数。特定技术选自课程中与缓冲区和存储管理器相关的材料。 实验环境 开发环境： 操作系统：Windows 11 专业教育版 开发语言：C++ 开发环境：VS2022 运行环境： 硬盘为机械硬盘 实验设计 本项目需要实现一个简单的Storage and Buffer Manager(存储和缓冲区管理器)。 根据文档要求和课程知识，本管理器将分为缓冲区管理和存储管理两部分程序，其中，缓冲区管理程序向更上一层提供接口，并负责调用存储管理器以及对缓冲区进行操作；存储管理程序则向缓冲区管理程序提供接口，并负责对文件存储进行操作。 由文档要求和DBMS架构可知，存储管理器类DSMgr需要实现以下接口函数，从而对数据库文件进行操作： class DSMgr { public: DSMgr();//当前数据文件将保存在 DSManager 类中。该文件将被命名为 data.dbf int OpenFile(string filename);//打开由文件名指定的文件 int CloseFile();//关闭当前正在使用的文件。只应在数据库更改或程序关闭时调用。 bFrame ReadPage(int page_id);//由缓冲区管理器中的 FixPage 函数调用，原型是 ReadPage(page_id, bytes) 并返回它读入的内容，调用 fseek() 和 fread() 从文件中获取数据 int WritePage(int frame_id, bFrame frm);//每当从缓冲区中取出一页时，都会调用 WritePage 函数。原型是 WritePage(frame_id, frm) 并返回写入了多少字节。此函数调用 fseek() 和 fwrite() 将数据保存到文件中 int Seek(int offset, int pos);//移动文件指针 FILE * GetFile();//返回当前文件 void IncNumPages();//递增页面计数器 int GetNumPages();//返回页面计数器 void SetUse(int index, int use_bit);//用于设置页面数组中的位。该数组跟踪正在使用的页面。如果页面中的所有记录都被删除，那么该页面就不再真正使用，可以在数据库中再次使用。为了知道页面是否可重用，检查数组中是否有任何设置为零的use_bit。fixNewPage函数首先检查此数组的use_bit是否为零。如果找到，则重新使用该页面。如果不是，则分配一个新页面。 int GetUse(int index);//返回相应 page_id 的当前 use_bit private: FILE *currFile;//当前文件 int numPages;//页面计数器 int pages[MAXPAGES];//根据文档说明，MAXPAGES设为50000 } 而缓冲区管理器类需要实现以下接口函数： class BMgr { public: BMgr(std::string filename, int choice, int input_frame_num = FRAME_NUM);//传入数据库文件名用于传递给存储管理器，传入choice…