| 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 | 
测试使用。返回已经从内存申请的个数