CMU_15445_P2_PageGuard
我将页面守护部分与多线程调用部分放在一起写在这篇博客中了, 页面守卫的本质是更加优雅方便的使用内存中的页(Pages). 我们知道Buffer_Pool_Manager实际上是管理页面, BPM 管理的是页面在内存中的组织形式与磁盘交互等, PageGuard
为其他进程包装了使用页面的方法, 其中主要封装了页面读写锁的获取与释放, 以及配合 BPM PIN或者 UNPIN 页面.
举例来说就是:
某个进程想使用页面的时候, 可以初始化一个 BPM 的实例, 将一个键值对写进页面, 首先调用 BPM 的
NewPage()
函数新建一个使用的页面, 然后获取页面的读写锁, 然后写完释放这个页面的读写锁, 这样本身没什么问题, 但是我们经常容易忘记 UNPIN 这个页面, 以及将读写锁与释放锁写进代码中容易被忽略, 因此使用 PageGaurd 来优雅的使用页面.
BasicPageGuard
Basic PageGuard 的定义如下:
private:
friend class ReadPageGuard;
friend class WritePageGuard;
BufferPoolManager *bpm_{nullptr}; // 管理内存的BPM
Page *page_{nullptr}; // 这个 PageGuard 守护的页面
bool is_dirty_{false}; // 当前页面是否被修改, 是否为 Dirty
标签:P2,PageGuard,读写,BPM,CMU,页面
From: https://www.cnblogs.com/wevolf/p/18534006