一、 实验目的
为了了解数据库buffer管理器的工作原理,对数据库底层结构有进一步的了解,编写一个data storage manager和buffer manager。该试验涉及储存和缓冲管理器。缓冲技术,散列技术,文件储存结构,磁盘空间和缓冲模块的接口功能。
二、 实验环境
硬件平台:acer v5笔记本
软件平台:code::blocks
语言:C++
三、 实验设计
3.1 BCB类设计
Struct BCB
{
BCB();
int page_id;//page号
int frame_id;//存放文件号的buffer地址下标
int latch;//锁
int count;
int dirty;//是否脏
double first_time;
double last_time;
BCB * next;
}
BCB类主要是实现快速的查找功能,既查找给定的文件号是否在缓存中。
class DSMgr
{
public:
DSMgr();
int OpenFile(string filename);
int CloseFile();
bFrame ReadPage(int page_id);
int WritePage(int frame_id, bFrame frm);
int Seek(int offset, int pos);
FILE * GetFile();
void IncNumPages();
int GetNumPages();
void SetUse(int index, int use_bit);
int GetUse(int index);
private:
FILE *file;
int numPages;
int pages[MAXPAGES];
};
class BMgr
{
public:
BMgr();
int FixPage(int page_id);
NewPage FixNewPage();
int UnfixPage(int page_id);
int NumFreeFrames();
int SelectVictim();
int Hash(int page_id);
void RemoveBCB(BCB * ptr, int page_id);
void RemoveLRUEle(int frid);
void SetDirty(int frame_id);
void UnsetDirty(int frame_id);
void WriteDirtys();
bool FindFrame(int page_id);
void PrintFrame(int frame_id);
void LRUProcess(BCB *bcb);
int ftop[DEFBUFSIZE];
BCB* ptof[DEFBUFSIZE];
bFrame buf[DEFBUFSIZE];
private:
LRU* head;
LRU* tail;
DSMgr ds;
};
Buffer Manager的基本功能
FixPage(int page_id) 将对应page_id的page读入到buffer中。如果buffer已满,则需要选择换出的frame。FixNewPage()
在插入数据时申请一个新page并将其放在buffer中。SelectVictim()
选择换出的frame_id
FindFrame(int page_id)
查找给定的page是否已经在某个frame中了
SetDirty(int frame_id)
文件被修改时使用
3.4 LRU算法的带有头尾指针的双向链表数据结构
struct LRU{
LRU();
int frame_id;//帧号
double b2dtime; //前后两次间隔时间
LRU *prior;//前指针
LRU *next;//后指针
};
四、 设计实现
五、 运行结果及分析
当buffersize=1024的时候,结果如上图。总时间:8s,总I/O次数:262321,命中率:47.5358%。
当buffersize=2048的时候,结果如上图。总时间:9.157s,总I/O次数:225001,命中率:54.9998%。
当buffersize=4096的时候,结果如上图。总时间:12.028s,总I/O次数:184428,命中率:63.1144%。
结论:随着buffermanager的增加,命中率和消耗时间不断地增加,I/O次数不断地减小,命中的次数经过计算也是不断增加的。
下载链接:点击打开链接
本文详细介绍了数据库系统中的Buffer Manager和Data Storage Manager的设计与实现,包括BCB类、DSMgr和BMgr类的功能,以及LRU算法在缓冲策略中的应用。通过不同buffer size的实验,分析了命中率、I/O次数和运行时间的关系,结果显示增大buffer size能有效提升性能。
2541

被折叠的 条评论
为什么被折叠?



