【CMU 15-445】Proj1 Buffer Pool Manager

Buffer Pool Manager

  • 通关记录
  • Task1 LRU-K Replacement Policy
  • Task2 Disk Scheduler
  • Task3 Buffer Pool Manager
    • FlushPage
    • FlushAllPages
    • UnpinPage
    • NewPage
    • FetchPage
    • DeletePage
  • Optimizations

CMU-15445汇总
本文对应的project版本为CMU-Fall-2023的project1
由于Andy要求,本博客只提供思路,不会公开任何代码

通关记录

在这里插入图片描述

在这里插入图片描述
目前的rank还比较低,lru-k后续会优化下

Task1 LRU-K Replacement Policy

LRU-KLRU一样,都属于缓冲区的页面置换算法,不同的是,LRU-K考虑的是页面的之前第K次访问时间戳与当前时间戳的差(若不足K次则优先驱逐,若有多个访问不足K次的页面,则按LRU规则驱逐),而LRU考虑的是页面最近一次访问时间戳与当前时间戳的差。一个具体的例子如下图所示,假设K=3buffer大小为3,访问序列为1 2 3 2 3 2 3 1 1 4,当访问4时,会将1驱逐掉,图中当页面访问不足K次时,时间戳为最新访问时间戳,否则为前第K次的时间戳(蓝色数字为时间戳)。
在这里插入图片描述
Task1的要求是实现src/buffer/lru_k_replacer.cpp文件中的如下几个函数:

  • Evict(frame_id_t* frame_id):使用LRU-K算法驱逐一个frame,并使用参数返回frame_id;返回值类型为bool,若驱逐成功返回true,若当前可驱逐frame数量为0,则返回false
  • RecordAccess(frame_id_t frame_id):记录给定frame的访问历史
  • Remove(frame_id_t frame_id):将给定framebuffer中移除
  • SetEvictable(frame_id_t frame_id, bool set_evictable):设置frame可驱逐不可驱逐,若设置前后该属性不一致,则需要修改类内维护的可驱逐frame数量属性
  • Size():返回当前可驱逐frame数量

个人建议的实现顺序为Size->SetEvictable->RecordAccess->Evict->Remove
主要的难点在于RecordAccessEvict中各frameLRU-K信息维护与驱逐算法实现,目前我实现的版本为暴力版本,即在RecordAccess为每个frame维护一个大小为K的访问时间戳队列;在Evict中,遍历所有可驱逐的frame,找出LRU-K timestamp最小的那个,将其驱逐。(这个做法明显太慢了,后续优化一下)

Task2 Disk Scheduler

此部分需要实现一个简单的磁盘调度器,接收BufferPoolManager发来的读写磁盘请求放入一个请求队列中;然后启动一个新线程,不断从请求队列中获取请求,根据请求类型调用对应DiskManager的读写函数进行磁盘读写。主要实现文件src/storage/disk/disk_scheduler.cpp中的两个函数:

  • Schedule(DiskRequest r):接收请求并放入请求队列
  • StartWorkerThread():线程函数,从请求队列中获取新请求,并根据请求类型调用磁盘读写函数

个人建议的实现顺序为Schedule->StartWorkerThread
不需要考虑队列的线程安全性,已经有一个Channel类帮忙实现了生产者消费者模型;关于std::promise的用法,可参考disk_scheduler_test.cpp文件。

Task3 Buffer Pool Manager

这一部分需要实现一个BufferPoolManager,结合前两部分实现的LRU-K ReplacerDisk Scheduler进行缓冲区的管理物理页的开辟、获取与释放BufferPoolManager类维护的数据结构中包含一个Page类的数组(在BufferPoolManager的构造函数中会开辟空间),数组中的每个元素即为一个一个的framePage类主要包含以下几个成员:

  • page_id_t page_id_:表示该frame指向的物理页面id
  • char* data_:用于储存对应物理页面中的真实数据
  • int pin_count_:故名思意,该framepin count,表示被多少个进程pin住,当pin_count_不为0时,该frame不能被驱逐
  • bool is_dirty_:该frame是否被写过,如果被写过则需要将内容写回磁盘

在这个任务中,我们需要实现文件src/buffer/buffer_pool_manager.cpp中的以下方法:

  • FetchPage(page_id_t page_id)
  • UnpinPage(page_id_t page_id, bool is_dirty)
  • FlushPage(page_id_t page_id)
  • NewPage(page_id_t* page_id)
  • DeletePage(page_id_t page_id)
  • FlushAllPages()

个人建议的实现顺序为:FlushPage->FlushAllPages->UnpinPage->NewPage->FetchPage->DeletePage
接下来我介绍下我每个函数的实现思路

FlushPage

功能:将给定的缓存页写回磁盘,无视is_dirty_标志
参数:page_id表示给定的想要flush到磁盘的物理页id
返回值:bool,若page_id不存在,返回false;否则true
实现:BufferPoolManager类中需要维护一个page_table_,存放着每个已分配物理页对应的frame,通过page_table_查找到给定page_id对应的frame_id,然后调用Disk Scheduler提供的scheduler方法发出写请求即可,最后清空frameis_dirty_标志。

FlushAllPages

功能:将所有有效的缓存页写回磁盘,无视is_dirty_标志
参数:无
返回值:void
实现:遍历整个buffer的所有frame,若frame上的page_id不为空,则使用与FlushPage类似方法写回磁盘即可。

UnpinPage

功能:将指定的物理页对应的framepin_count减1
参数:page_id表示给定的物理页id,is_dirty表示在pin住frame时是否发生了写操作
返回值:bool,若指定的物理页id不存在,返回false;否则true
实现:首先根据page_id找到对应的frame,将framepin_count减1,此时若pin_count为0,还需调用LRU-K Replacer提供的SetEvictable函数设置frame的状态为可驱逐。然后,根据is_dirty参数设置frameis_dirty_成员即可。

NewPage

功能:找到一个空闲frame新分配一个物理页,并将该物理页的内容读取到刚找到的这个frame
参数:page_id_t *page_id分配的物理页id以参数形式返回
返回值:Page*表示新分配的物理页最终存放的frame地址
实现:找到空闲的frame首先从一个free list里面找,如果free list为空表明现在的buffer已满,需要使用LRU-K Replacer驱逐一个frame并将其作为新物理页的承载体(若该frameis_dirty_true,那么需要先将frame中的内容写回对应的物理页)。接着,调用AllocatePage函数分配新物理页,并设置frame中的相关成员即可。最后,需要调用LRU-K Replacer提供的RecordAccess函数记录下访问历史,并调用SetEvictable函数pin住frame

FetchPage

功能:给定物理页id,获取该物理页所对应的frame
参数:page_id表示给定的物理页id
返回值:Page*表示给定物理页所在的frame地址
实现:首先从page_table_中寻找给定物理页对应的frame,若未找到,则需要驱逐缓存页,这一块的处理与NewPage函数中驱逐的处理一致,代码可以复用;若找到则进行下一步。然后,将最终确定的frame记录访问历史pin住操作,也与NewPage中的操作一致。

DeletePage

功能:给定物理页id,将物理页对应的framebuffer中删除
参数:page_id表示给定的物理页id
返回值:bool,物理页不在buffer中或删除成功则返回true;物理页存在且对应的frame仍然被pin住(pin_count不为0)时,则返回false
实现:查找物理页对应的frame,将page_idpage_table_中移除,调用LRU-K ReplacerRemove函数将frame_idbuffer中移除,并将frame_id加入free_list_中,重置frame的成员,最后调用DeallocatePage将物理页回收

Optimizations

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

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

相关文章

JavaEE初阶学习:Linux 基本使用和 web 程序部署

1.Linux的基本认识 Linux 是一个操作系统.(搞管理的系统) 和Windows都是同类产品~~ Linux 实际的场景: 1.服务器 2.嵌入式设备 3.移动端(手机)Android 其实就是Linux 1991年,还在读大学的 芬兰人 Linus Benedict Torvalds,搞了一个Linux 这样的系统0.01版,正式发布了~ 后…

基于pytorch使用特征图输出进行特征图可视化

使用特征图输出进行特征图可视化 文章目录 前言效果展示获取某一层特征图输出原图方法一:使用IntermediateLayerGetter类方法二:使用hook机制(推荐) 总结 前言 提示:这里可以添加本文要记录的大概内容: 例…

【 云原生 | K8S 】kubectl 详解

目录 1 kubectl 2 基本信息查看 2.1 查看 master 节点状态 2.2 查看命名空间 2.3 查看default命名空间的所有资源 2.4 创建命名空间app 2.5 删除命名空间app 2.6 在命名空间kube-public 创建副本控制器(deployment)来启动Pod(nginx-wl…

大数据-之LibrA数据库系统告警处理(ALM-12036 license文件即将过期)

告警解释 系统每天零点检查一次当前系统中的license文件,如果当前时间距离过期时间不足60天,则license文件即将过期,产生该告警。 当重新导入一个正常license,告警恢复。 说明: 如果当前集群使用节点数小于等于10节…

RLHF的替代算法之DPO原理解析:从Zephyr的DPO到Claude的RAILF

前言 本文的成就是一个点顺着一个点而来的,成文过程颇有意思 首先,如上文所说,我司正在做三大LLM项目,其中一个是论文审稿GPT第二版,在模型选型的时候,关注到了Mistral 7B(其背后的公司Mistral AI号称欧洲…

049-第三代软件开发-软件部署脚本(一)

第三代软件开发-软件部署脚本(一) 文章目录 第三代软件开发-软件部署脚本(一)项目介绍软件部署脚本(一)其他方式 关键字: Qt、 Qml、 bash、 shell、 脚本 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object…

nfs配置

1.NFS介绍 NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操 作系统可以共享彼此的文件。 NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文 件系统中,而在本地端的系统中来看&#…

【Git】Gui图形化管理、SSH协议私库集成IDEA使用

一、Gui图形化界面使用 1、根据自己需求打开管理器 2、克隆现有的库 3、图形化界面介绍 1、首先在本地仓库更新一个代码文件,进行使用: 2、进入图形管理界面刷新代码资源: 3、点击Stage changed 跟踪文件,将文件处于暂存区 4、通过…

详解机器学习最优化算法

前言 对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中,小编将对机器学习中所使用的…

算法之路(一)

🖊作者 : D. Star. 📘专栏 :算法小能手 😆今日分享 : 如何学习? 在学习的过程中,不仅要知道如何学习,还要知道避免学习的陷阱。1. 睡眠不足;2. 被动学习和重读;3. 强调标记或画线&am…

使用Ruby编写通用爬虫程序

目录 一、引言 二、环境准备 三、爬虫程序设计 1. 抓取网页内容 2. 解析HTML内容 3. 提取特定信息 4. 数据存储 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法,遍历网页并提取所需的信息。使用Rub…

初识Linux:目录路径

目录 提示:以下指令均在Xshell 7 中进行 一、基本指令: 二、文件 文件内容文件属性 三、ls 指令拓展 1、 ls -l : 2、ls -la: 3、ls [目录名] : 4、ls -ld [目录名]: 四、Linux中的文件和…

串口通信(11)-CRC校验介绍算法

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

2023.11.10联赛 T3题解

题目大意 题目思路 感性理解一下,将一个数的平方变成多个数平方的和,为了使代价最小,这些数的大小应该尽可能的平均。 我们可以将 ∣ b i − a i ∣ |b_i-a_i| ∣bi​−ai​∣放入大根堆,同时将这个数划分的次数以及多划分一段减…

Xmake v2.8.5 发布,支持链接排序和单元测试

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好&#x…

java传base64返回给数据报404踩坑

一、问题复现 1.可能因为base64字符太长,导致后端处理时出错,表现为前端请求报400错误; 这一步debug进去发现base64数据是正常传值的 所以排除掉不是后端问题,但是看了下前端请求,猜测可能是转换base64时间太长数据过大导致的404 2.前端传…

FPGA设计过程中有关数据之间的并串转化

1.原理 并串转化是指的是完成串行传输和并行传输两种传输方式之间的转换的技术,通过移位寄存器可以实现串并转换。 串转并,将数据移位保存在寄存器中,再将寄存器的数值同时输出; 并转串,将数据先进行移位&#xff0…

AI:74-基于深度学习的宠物品种识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

OpenHarmony,奏响中国基础软件的“光辉岁月”

梦想需要多久的时间,多少血和泪,才能慢慢实现? 天地间任我展翅高飞,谁说那是天真的预言? 《光辉岁月》歌词中的这两个问题,恰好可以送给今天的中国基础软件事业。 曾几何时,我们认为中国基础软件…

使用jdk21预览版 --enable-preview

异常 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project sb3: Compilation failure [ERROR] --enable-preview 一起使用时无效 [ERROR] (仅发行版 21 支持预览语言功能) 解决…