data storage manager和buffer manager实现

本文详细介绍了数据库系统中的Buffer Manager和Data Storage Manager的设计与实现,包括BCB类、DSMgr和BMgr类的功能,以及LRU算法在缓冲策略中的应用。通过不同buffer size的实验,分析了命中率、I/O次数和运行时间的关系,结果显示增大buffer size能有效提升性能。

中国科学技术大学软件学院  亦歌 原创作品版权所有转载请注明出处

一、  实验目的

为了了解数据库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类主要是实现快速的查找功能,既查找给定的文件号是否在缓存中。

3.2 Data Storage Manager设计

 

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];

};

 

3.3 Buffer Manager

 

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次数不断地减小,命中的次数经过计算也是不断增加的。

下载链接:点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值