首页 > 其他分享 >Project#1: Buffer Pool

Project#1: Buffer Pool

时间:2023-10-31 20:36:21浏览次数:44  
标签:10 Buffer Page id Project frame test page Pool

撰写本文的目的:记录本人在不参考其他任何形式的解决方法(思路/源码)、仅靠课程提供的资源(课本/参考资料)和Discordhigh level的讨论的情况下,独立完成该课程的过程。

欢迎大家和我讨论学习中所遇到的问题。

ZiHao's Blog

由于gradescope中对non-cmu students仅开放了Project#0,本文方法仅通过了本地测试,极有可能有错误(并发访问)

目前通过了GradeScope所有测试并且拿到了100.0/100.0,但是性能较差(与Leaderboard上第一名有十倍的性能差距),打算在下一篇文章记录一下对BPM的性能进行优化,例如本文中提到的DiskScheduler创建的对Request的处理Thread实际上是串行的,后续再保证顺序正确的情况下对其进行适当的并行处理。

Task#1 - LRU-K Replacement Policy

思路:

  • 基本可以参考源码中给出的注释,一步一步实现
  • 每次RecordAccess一个Frame时,都会使得leu_replacercurrent_timestamp_自增1,方便挑选被evictframe
  • 在计算k backwrad distance时,使用UINT32_MAX代替题目中所述的+inf
  • 由于LRUNode的成员变量都是私有成员,题目规定不能更改函数或者成员的signature,因此需要自己定义多个settergetter方法
  • 为了方便Evict方法的实现,可以在LRUNode中实现GetKDistance方法

Size

直接返回维护的curr_size_

RecordAccess

  • 判断frame_id是否有效
  • 判断node_store中是否已经存在对应该frame_id的LRUNode
    • 若未存在,则创建临时LRUNode,并更新node的访问历史,将其插入node_store_
    • 若已经存在,则只是更新访问历史
  • lru_replacer的current_timestamp自增1

SetEvictable

按照注释一步一步实现,需要注意更新curr_size_

Evict

  • 定义两个临时变量记录最大的time stamp difference和对应的frame id
  • 定义一个vector,记录所有k backward distance为+inf的frame id
  • 遍历一遍frame node
  • 通过最大的time stamp difference,若为+inf,则遍历vector找到earliest access history以及对应的frame id

Remove

按照注释实现即可

Bugs

- [✅] 未给方法中任意位置加锁时能够通过测试,可能本地测试并没有涉及到对某个成员变量的竞争。但是加锁后测试就会卡住

相关文章

  • [20231023]备库与alter system flush buffer_cache.txt
    [20231023]备库与altersystemflushbuffer_cache.txt--//测试遇到的问题,在备库执行altersystemflushbuffer_cache;刷新数据缓存命令无效.--//通过例子验证:1.环境:[email protected]:1521/orcl>@[email protected]:1521/orcl>@pr==============================P......
  • 开启大页与否对CacheBuffer的影响的学习
    开启大页与否对CacheBuffer的影响的学习背景最近遇到数据库压力较高的场景.原厂工程师到位后修改了几个参数(自己以为参数没问题)然后最近一周环境就比较正常了.这个地方很打脸,自己没有进行详细的调查.分析思考问题的思路和方向出现了问题.基于这个情况,自己特别想......
  • MicroSIP-3.21.3+pjproject-2.13.1+ opus-1.3.1+VS2019
    本文记录了我通过VS2019编译MicroSIP-3.21.3开源项目的过程。Microsip:MicroSIPsourcecodepjproject:DownloadPJSIP-OpenSourceSIP,Media,andNATTraversallibraryopus:Downloads–OpusCodec(opus-codec.org)下载并解压后如图: 用vs2019将microsip的平......
  • Python:爬取某软件站数据报错requests.exceptions.SSLError: HTTPSConnectionPool(hos
    使用Python爬取某网站数据时候,之前一直是好好的。突然就报错:requests.exceptions.SSLError:HTTPSConnectionPool(host='api.***.cn',port=443):Maxretriesexceededwithurl:/accounty1/login?analysis............检查发现,可能是IP地址存在代理导致网络环境一场。可以检......
  • 【Azure Batch】在中国区批处理服务(Mooncake Batch Account)上实验自动池(Auto Pool)
    问题描述在AzureBatch的介绍文档中,提出了自动池的概念,它可以在任务完成后,自动删除Pool资源,详细介绍:https://docs.azure.cn/zh-cn/batch/nodes-and-pools#autopools& https://learn.microsoft.com/zh-cn/rest/api/batchservice/job/add?tabs=HTTP#autopoolspecification自动池是......
  • Chromium Command Buffer原理解析
    CommandBuffer 是支撑Chromium多进程硬件加速渲染的核心技术之一。它基于OpenGLES2.0定义了一套序列化协议,这套协议规定了所有OpenGLES2.0命令的序列化格式,使得应用对OpenGL的调用可以被缓存并传输到其他的进程中去执行(GPU进程),从而实现多个进程配合的渲染机制。1. Com......
  • String和StringBuffer的区别
    String和StringBuffer是Java中两种用于处理字符串的不同类,它们之间有一些重要的区别。 可变性:String 是不可变的(immutable):一旦创建了一个 String 对象,就不能更改它的内容。每次对 String 进行修改操作(例如拼接字符串),都会创建一个新的 String 对象。这可能会导致......
  • 数据序列化协议 Protocol Buffers(Protobuf) 认知
    写在前面需要存大数据,同事推荐,了解一下理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧——赫尔曼·黑塞《德米安》ProtocolBuf......
  • c# 读取project 内容代码demo
    1.安装安装office,需要使用其中的dll,或者直接使用下面的dll  2.引用添加此dll引用到项目中,并且嵌入互操作类型设置为false,否则代码中使用MSProject.ApplicationClass 会报错   3.读取demo:  public  ActionResultImport(HttpPostedFileBasefile)    ......
  • eslint提示 xxx should be listed in the project's dependencies
    有时候手动安装了一个npm包A,npm包A里面包含了npm包B,这时候如果importxxxfrom'npm包B';eslint会报错,提示npm包B不在package.json里面 解决方法:在eslintrc.js增加配置module.exports={rules:{'import/no-extraneous-dependencies':[0,......