0.写在前面
GitHub同步更新,欢迎star~ https://github.com/kaniel-outis/CMU15-445
写这篇文章的时候看到 lecture 5:Buffer Pool. 写完homework 1,然后准备动手Lab1。
Lab1的地址:https://15445.courses.cs.cmu.edu/fall2020/project1/
本文主要总结一下在写Lab1遇到的几个问题,然后是Task的解决思路(不公开代码,如果有问题可以留言)。
1.问题汇总
1.1 关于2020与2021的lab
首先就是我在写的时候,git上的lab已经更新到2021了,在2021中有些类的设计发生了变化(Andy Pavlo教授上课说每年都会有些区别,为了防止抄袭),所以我在第一次写的时候没注意到,直接pull了2021的项目,而且因为Task1(LRU)在本地测试也通过了(这个2020与2021没有产生变化),在写Task2的时候,就在本地一直过不去。

(buffer_pool_manager_instance.cpp是2021的)
然后就去网上找资源,看一下2020的空白模版。然后在这位同学这里找到了:https://github.com/TYBisok/bustub
1.2 测试细节
在测试时候需要把所有*_test.cpp中的,DISABLED_SampleTest改成SampleTest。(note:一个cpp文件中可能有多个DISABLED)

1.3 Autograder 错误-1

这个问题大概率是文件提交的格式不正确。
应该是:src/include/buffer/lru_replacer.h(类似这样)
1.4 Autograder 错误-2

这个问题真的困扰了我很久。之后我发现在discord真的非常棒啊,啥都有。你遇到过的问题基本上都能在上面找到。这个问题是语法兼容上的问题。有些写法会导致测评机不识别。

Task1 - LRU REPLACEMENT POLICY
这一部分的Lab在 lecture 5:Buffer Pool中有一些讲解,还有一些预备知识,需要提前了解。
1.1 实验目的
这部分的任务更多的还是对LRU替换算法的理解,已经如何用数据结构表示。
最早接触LRU是在本科学OS的时候,了解算法的原理但是从来没有手动实现过。这一次写发现LRU的思想非常好理解,但是实现起来却遇到不少困难。实践真的很重要!
1.2 实验分析
LRU算法最简单的思路是仅维护一个List,只要知道每个frame的距离上次的访问时间即可。
但是这样查询的时间复杂度是O(n),在这个基础之上我们可以引入一个hash表,来提高访问的效率。
unordered_map<frame_id_t, list<frame_id_t> > Hashmap_t;

Task2 - BUFFER POOL MANAGER
在lecture5中有理论基础。
1.1 实验目的
这个实验的主要目的是让我们更好的理解在buffer pool中数据的传递是如何的。
1.2 实验分析
BufferPoolManager负责从DiskManager获取数据库Page,并将它们存储在内存中。
在内存中都是Page为数据单位进行传递。
在这里涉及到Page table,Buffer Pool,disk中的交互,同时也会运用到上面的LRU算法。
每个函数的逻辑操作在空白的模版中几乎都有,可以按照思路进行code即可。

在FQA:https://15445.courses.cs.cmu.edu/fall2020/faq.html
中有邀请码和 Gradescope的地址,注册完之后,进行提交。

这篇博客主要介绍了CMU 15-445课程的Lab1,内容涉及LRU替换策略的实现及其在缓冲池管理中的应用。作者分享了在完成Lab1过程中遇到的问题,如2020与2021版本的区别、测试细节、Autograder错误及解决方法。Lab1任务包括理解并实现LRU算法,以及缓冲池管理,这两个任务都需要对数据结构和数据库管理有深入理解。

2348

被折叠的 条评论
为什么被折叠?



