CMU 15-445/645 Lab1-BUFFER POOL

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的时候,就在本地一直过不去。
CMU 15-445/645 Lab1-BUFFER POOL_第1张图片
(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真的非常棒啊,啥都有。你遇到过的问题基本上都能在上面找到。这个问题是语法兼容上的问题。有些写法会导致测评机不识别。
CMU 15-445/645 Lab1-BUFFER POOL_第2张图片

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;

CMU 15-445/645 Lab1-BUFFER POOL_第3张图片

Task2 - BUFFER POOL MANAGER

在lecture5中有理论基础。

1.1 实验目的

这个实验的主要目的是让我们更好的理解在buffer pool中数据的传递是如何的。

1.2 实验分析

BufferPoolManager负责从DiskManager获取数据库Page,并将它们存储在内存中。
在内存中都是Page为数据单位进行传递。
在这里涉及到Page table,Buffer Pool,disk中的交互,同时也会运用到上面的LRU算法。
每个函数的逻辑操作在空白的模版中几乎都有,可以按照思路进行code即可。
CMU 15-445/645 Lab1-BUFFER POOL_第4张图片
在FQA:https://15445.courses.cs.cmu.edu/fall2020/faq.html
中有邀请码和 Gradescope的地址,注册完之后,进行提交。
CMU 15-445/645 Lab1-BUFFER POOL_第5张图片

你可能感兴趣的:(CMU-15/445,CMU15-445,database,数据库,bufferpool)