lab1
终于开始做 cmu15445 了, 之前就一直想做,但碍于英语和 C++ 一直没下去手,这次逼自己一把,开始受苦之路。其实 lab1 不难,每个函数都给出了逻辑结构,按照指示走,大体的代码就搞定了,但也有几个 tricky 的细节没有指示到,导致 debug 了很久。
值得注意的 C++ 语法
当给指针赋值时
*frame_id = _frame_order.back();
这是给 frame_id 这个指针的指向的地址改变值。frame_id = &_frame_order.back();
这是更改 frame_id 指针指向的地址。锁 不建议使用
mutex
。强烈建议使用std::lock_guard<std::mutex>
,省去许多并发引起的错误。dynamic_cast
用于类继承层次间的指针或引用转换用于子类,可以安全的向下转化。
Hints
LRU 没什么好说的,unordered_map + list 就行了,其实这样实现代码也简单,逻辑也清楚,效率也好。
大部分坑在 BPM,注意
UnpinPgImp
不能写入磁盘,只改变page
的脏位。这是我遇见最大的坑点,我想的是我既然要 unpin 一个 page 了,不就是放入 LRU 内嘛,如果脏了,直接写入磁盘即可。但其是达咩,写入磁盘的任务交给其他的函数,这里只更新脏位。还有强烈建议使用
std::lock_guard<std::mutex>
,说不定你用std::mutex
,哪里就出问题了。优化点,当
FlushAllPgsImp
时,判断一下是不是脏位,可以优化很多时间。PBPM 的话,维护一个 index,来便于 newpage。
最后更新于