MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
管理页面Frame 更多...
#include <disk_buffer_pool.h>
类 | |
class | BPFrameIdHasher |
Public 成员函数 | |
BPFrameManager (const char *tag) | |
RC | init (int pool_num) |
RC | cleanup () |
Frame * | get (int file_desc, PageNum page_num) |
获取指定的页面 更多... | |
std::list< Frame * > | find_list (int file_desc) |
列出所有指定文件的页面 更多... | |
Frame * | alloc (int file_desc, PageNum page_num) |
分配一个新的页面 更多... | |
RC | free (int file_desc, PageNum page_num, Frame *frame) |
int | purge_frames (int count, std::function< RC(Frame *frame)> purger) |
size_t | frame_num () const |
size_t | total_frame_num () const |
Private 类型 | |
using | FrameLruCache = common::LruCache< FrameId, Frame *, BPFrameIdHasher > |
using | FrameAllocator = common::MemPoolSimple< Frame > |
Private 成员函数 | |
Frame * | get_internal (const FrameId &frame_id) |
RC | free_internal (const FrameId &frame_id, Frame *frame) |
Private 属性 | |
std::mutex | lock_ |
FrameLruCache | frames_ |
FrameAllocator | allocator_ |
管理页面Frame
管理内存中的页帧。内存是有限的,内存中能够存放的页帧个数也是有限的。 当内存中的页帧不够用时,需要从内存中淘汰一些页帧,以便为新的页帧腾出空间。 这个管理器负责为所有的BufferPool提供页帧管理服务,也就是所有的BufferPool磁盘文件 在访问时都使用这个管理器映射到内存。
Frame * BPFrameManager::alloc | ( | int | file_desc, |
PageNum | page_num | ||
) |
分配一个新的页面
file_desc | 文件描述符 |
page_num | 页面编号 |
std::list< Frame * > BPFrameManager::find_list | ( | int | file_desc | ) |
列出所有指定文件的页面
file_desc | 文件描述符 |
RC BPFrameManager::free | ( | int | file_desc, |
PageNum | page_num, | ||
Frame * | frame | ||
) |
尽管frame中已经包含了file_desc和page_num,但是依然要求 传入,因为frame可能忘记初始化或者没有初始化
Frame * BPFrameManager::get | ( | int | file_desc, |
PageNum | page_num | ||
) |
获取指定的页面
file_desc | 文件描述符,也可以当做buffer pool文件的标识 |
page_num | 页面号 |
int BPFrameManager::purge_frames | ( | int | count, |
std::function< RC(Frame *frame)> | purger | ||
) |
如果不能从空闲链表中分配新的页面,就使用这个接口, 尝试从pin count=0的页面中淘汰一些
count | 想要purge多少个页面 |
purger | 需要在释放frame之前,对页面做些什么操作。当前是刷新脏数据到磁盘 |
当前还在frameManager的锁内,而 purger 是一个非常耗时的操作 他需要把脏页数据刷新到磁盘上去,所以这里会极大地降低并发度
|
inline |
测试使用。返回已经从内存申请的个数