数据库作业学习

2019-11-20  本文已影响0人  Butter_can_fly

存储和缓冲管理

实验目的

实现一个简易的存储和缓冲管理器


缓冲区和页面

缓冲区Buffer代表了在主存中的空间
缓冲区由frame组成
frame由下面的数据结构表示

#define FRAMESIZE 4096
    struct bFrame{
        Char field[FRAMESIZE];
    };

缓冲区buffer数组(array)会存储一系列frame(存储已装载的page),这个array如下所示:

    #define DEFBUFSIZE 1024
    bFrame buf[DEFBUFSIZE]

页面Page格式

在这个项目中,我们不需要提及page的具体结构。只关心页面id和页面大小,所以不需要设计页面格式。

文件File格式

我们建议使用基于目录的结构区组织数据库文件。每个文件都有一个起始页(它包含了指向文件所有页的指针),使用基于目录的好处在于当指定某一个特定页面时,这样更加快捷。

缓冲技术(Buffer Technique)

我们选择LRU作唯一的置换算法,好处自然不必多说

哈希技术(Hashing Technique)

对于缓冲中的每个frame,都必须要有一个BCB被保存(buffer control block)。它包含了一个page_id,frame_id,fix_count,dirty_bit.
两个哈希表需要被保存,第一个是page_id对应frame_id和BCB,第二个是frame_id对应page_id.
我们建议使用简单的静态哈希技术。
哈希函数会像是
H(K)=(page_id)%buffer_size
对于page_id到BCB的哈希表会像是:BCB hTable[BufferSize]
对于frame_id到page_id的哈希表会像是:int hTable[BufferSize]

struct BCB{
    BCB();
    int page_id;
    int frame_id;
    int count;
    int dirty;
    BCB *next;
};

文件存储

在此项目中,我们只需要磁盘上的一个物理文件,所有数据库中的数据都会存在这一个文件中,命名为data.dbf.

类设计

<font color="green">数据存储管理类</font>

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 *currFile;
        int numPages;
        int Pages[MAXPAGES];
}

<font color="green">缓冲区管理</font>

class BMgr{
    public:
        BMgr();
        int FixPage(int page_id, int prot);
        void 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();
        PrintFrame(int frame_id);
    private:
        int ftop[DEFBUFSIZE];
        BCB * ptof[DEFBUFSIZE];
}

对类中函数的解释(顶奥)

缓冲类接口函数


数据存储类接口函数


草图.png
上一篇 下一篇

猜你喜欢

热点阅读