./Shiroko.jpg

CMU15-445 (2022fall) project实现笔记

数据库系统实现技术大作业 这是CMU 15-445 2022fall 的配套项目 bustub 2022fall,也是《数据库系统实现技术》这门选修课的大作业。这里简单记录一下作业的思路。 Project #0 - C++ Primer 这个项目是做一个简单的Trie树,不属于bustub的主体部分,实现起来也很简单。核心数据结构就是TrieNode, 表示树中的一个顶点,is_end_成员表示该单词是否结束。整体没啥难的。 class TrieNode{ protected: char key_char_; /** whether this node marks the end of a key */ bool is_end_{false}; /** A map of all child nodes of this trie node, which can be accessed by each * child node's key char. */ std::unordered_map<char, std::unique_ptr<TrieNode>> children_; } 主要是熟悉C++以及bustub的编码风格,以及一些工具的使用,包括用CMake\Make构建项目、用Clang-tidy来优化编码风格、用GDB来debug、用第三方库GoogleTest来进行单例测试等。 Project #1 - Buffer Pool 从这个部分开始,就进入Bustub的主体部分了。目标就是实现一个Buffer Pool Manager, 分成了3个小任务。 Task #1 Extendible Hash Table 这一部分是实现一个可扩展哈希表, 所谓可扩展,就是避免传统哈希表的rehash的开销(rehash就是传统的不可扩展的哈希表的加载因子比较高的时候,会进行扩容+rehash来减少冲突,开销很大)。

MIT 6.824 2020 (1) lab1 MapReduce实现笔记

MIT 6.824 2020 (1) lab1 MapReduce实现笔记 花了几天时间做了这个lab, 算是入了分布式的门。一开始没啥头绪,但想明白Master需要维护哪些元信息,Master和Worker何时需要进行的rpc通信这些基本问题后,思路就渐渐明朗。得益于Go语言的简洁、方便的gorountine、GC、自带的RPC框架(虽然不知道为什么*Arg和*Reply不能传nil指针,传nil指针会导致RPC调用的结果有问题,关键是不提示有问题),实现起来也非常轻松,几乎没有心智负担。 以下是我的一些笔记,这门课不允许在网上公开代码,但是为了便于描述,我还是将一部分核心代码贴了出来。 Master和Worker的定义 命名方式随意了点:) 看变量名大概就能知道什么意思,需要补充的是,TaskStatus的Start表示未被分配,Processing表示有worker正在处理,而Done表示该任务已经完成。 另外,Master会维持一个全局的global_phase变量,用来指示现在所处的阶段,lifetime是 MapPhase -> ReducePhase -> CompletedPhase。并通过维护done_cnt计数器来知晓现在完成的Map/Reduce Task的数量,在全部完成时,进行Phase的转换。 type Phase int8 type TaskType int8 type TaskStatus int8 // global phase const ( MapPhase Phase = iota ReducePhase CompletedPhase ) // TaskType const ( Map TaskType = iota Reduce Wait Exit ) // TaskStatus const ( Start TaskStatus = iota Processing Done ) type MapTask struct { // machine_id int NReduce int TaskId int InputFile string Status TaskStatus // iter_files []string Time time.