中科大高级数据库实验二—buffer的存储与管理.docx
- 文档编号:143135
- 上传时间:2022-10-04
- 格式:DOCX
- 页数:26
- 大小:311.33KB
中科大高级数据库实验二—buffer的存储与管理.docx
《中科大高级数据库实验二—buffer的存储与管理.docx》由会员分享,可在线阅读,更多相关《中科大高级数据库实验二—buffer的存储与管理.docx(26页珍藏版)》请在冰豆网上搜索。
高级数据库第二次试验
姓名:
张先荣 学号:
SA16225439 班级:
软件系统设计6班
一.实验目的
为了了解数据库Buffer的工作原理,对数据库底层有个更加深入的了解,实现一个简单的模拟的缓冲管理器,本次试验涉及到缓冲管理器,缓冲技术,散列技术,文件存储结构,磁盘空间等。
详细步骤如下:
(1)模拟实现一个块在磁盘和缓冲区之间的交互。
(2)要求创建一个data.dbf,然后创建存储管理器对文件的读写进行操作。
(3)建立一个缓冲区管理器与存储管理器交互、
(4)测试500000条数据库请求的txt文件,读取指定的页号到页面缓冲区,计算磁盘IO次数与命中率。
二.实验环境
硬件环境:
联想G470笔记本
内存:
8G
软件环境:
开发系统:
Windows7
开发工具:
VisualStudio2013
开发语言:
C++版本:
.NET4.5
三.实验思路
由题目描述我们可以设计出以下几个主要类:
1.File_Create类:
用来创建指定的data.dbf文件;
2.DSMgr类:
用来读写data.dbf文件,实现指定page_id的page
的读写;
3.BMgr类:
用来管理Buffer中bframe,维护数组ptof[]、ftop[],还有对buffer空间不够用时挑选置换bframe的LRU算法;
4.BCB类:
用来维护与缓冲区Buffer关联的page信息
5.bFrame类:
定义Buffer中的bFrame,即page在缓冲区中的存在形式;
6.LRU类:
最近最少使用算法,当Buffer空间已满时用来挑选置换的bFrame,里面维护一个frameid;
这里我们先假设页面的大小为4096,缓冲区一共有1024个页面,开始在磁盘上存储了50000个页,按照目录进行存储。
然后用哈希表映射页框号到页号,页号到页框号。
如图表1所示:
图表1磁盘与内存
其中,BCB类和bFrame类按照buffer2.txt文件定义,LRU类是包含了一个LRUNode类,定义了LRU节点信息,用于维护被关联的frameID。
我们在
LRU定义双向链表,因此,在置换的时候直接从尾节点找到并删除即可。
因为我们page一共定义了50000个(pageid范围0-49999),而缓冲区大小只有1024个(frameid范围0-1023),所以pageid不能和frameid等值对应,因此需要一个哈希函数将pageid映射到一个对应的frameid,这里采取最简单的做法frameid=pageid%1024,那么在查找的时候,ptof[pageid%1024]表示已经存在的page应该存放的位置,直接去里面找;如果是新读进来的块,则更新BCB块信息,再将BCB块挂到这个位置的链表上去。
这个数组主要还是用于查找已存在的page所属的BCB块。
为实际Buffer中维护的只有1024个page,每次需要将空闲的一个
bFrame找一个出来并且读page到这个frameid的bFrame中,令ftop[frameid]
=pageid,表示当前页框号为frameid的bFrame中关联着页号为pageid的
page。
同时创建一个BCB块包含pageid和这个找到的空闲的frameid等信息,并挂到ptof[pageid%1024]的位置上去。
这种情况只适用于Buffer中的1024个bFrame还有空闲的情况。
四.实验流程
流程图如图2所示。
图表2流程图
五.实验类图
实验类如图3所示:
图表3类图
六.概要设计。
1.BufferManager,用来管理Buffer中bframe,维护数组ptof[]、ftop[],还有对buffer空间不够用时挑选置换bframe的LRU算法.
2.DSManager,用来读写data.dbf文件,实现指定page_id的page的读写;
3.其他一些类:
4.将对应page_id的page读入到buffer中。
如果buffer已满,则需要选择换出的frame
5.设置特定bcb中的dirty值为1
七.实验结果
1.如图所示,当buffersize=1024,操作总页数是500000,此时的IO总次数是362321,命中率是27.5%,程序运行总时间是29.3s
图表4buffersize=1024
2.如图所示,当buffersize=2048,操作总页数是500000,此时的IO总次数是325001,命中率是34.9%,程序运行总时间是29.8s
图表5buffersize=2048
3.如图所示,当buffersize=5049,操作总页数是500000,此时的IO总次数是271259,命中率是45.7%,程序运行总时间是42.79s
图表6buffersize=5049
4.如图所示,当buffersize=10000,操作总页数是500000,此时的IO总次数是225925,命中率是54.8%,程序运行总时间是49.8s
图表6buffersize=10000
统计的I/O次数、命中buffer次数和命中率。
可以发现随着BufferSize
的增加,磁盘I/O数越小,命中次数越多,命中率越高。
八.详细代码
#include"BufferManager.h"#include"DSManager.h"#include"Operate.h"
#include
classBufferManager
{
public:
BufferManager();
intFixPage(intpage_id);
NewPageFixNewPage(bFramebuf[]);//NewPageintUnfixPage(intpage_id);
intNumFreeFrames();intSelectVictim();intHash(intpage_id);
voidRemoveBCB(BCB*ptr,intpage_id);voidRemoveLRUEle(intfrid);
voidSetDirty(intframe_id);voidUnsetDirty(intframe_id);voidWriteDirtys();
boolFindFrame(intpage_id);voidPrintFrame(intframe_id);
voidcalcLRUList(BCB*ptr,intfrid);intftop[DEFBUFSIZE];
BCB*ptof[DEFBUFSIZE];
bFramebuf[DEFBUFSIZE];
};
classDSManager
{
public:
DSManager();
intOpenFile(stringfilename);intCloseFile();
bFrameReadPage(intpage_id);
intWritePage(intpage_id,bFramefrm);intSeek(intoffset,intpos);
FILE*GetFile();voidIncNumPages();intGetNumPages();
voidSetUse(intindex,intuse_bit);intGetUse(intindex);
private:
FILE*file;intnumPages;
intpages[MAXPAGES];
};
#pragmaonce
#defineDEFBUFSIZE2048
#defineFRAMESIZE4096
#defineMAXPAGES 100000
#defineCOUNT500000structbFrame{
charfield[FRAMESIZE];
};
structNewPage{
intpage_id;intframe_id;
};
structBCB{
BCB();
intpage_id;intframe_id;intlatch;intcount;intftime;intstime;intdirty;BCB*next;
};
structLRUEle{
LRUEle();
intfid;
doubleb2dtime;LRUEle*less_recent;LRUEle*more_recent;
};
classOperate
{
public:
Operate(void);
~Operate(void);
};
#pragmaonce
#include"BufferManager.h"#include"DSManager.h"#include
#include
DSManagerds;
BufferManagerbm;
LRUEle*lru;
LRUEle*mru;
BufferManager:
:
BufferManager()
{
inti=0;
for(i=0;i { ptof[i]=NULL;//初始化BCB数组 ftop[i]=-1; } ds.OpenFile("data.dbf"); } intBufferManager: : FixPage(intpage_id) { intfid=-1; intframe_id=Hash(page_id);BCB*bcb=ptof[frame_id];while(bcb! =NULL) { if(bcb->page_id==page_id) { break; } bcb=bcb->next; } if(bcb! =NULL) { if(bcb->stime! =-1) { bcb->ftime=bcb->stime; } } else { calcLRUList(bcb,bcb->frame_id);returnbcb->frame_id; bcb=ptof[frame_id];fid=SelectVictim(); buf[f
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中科大 高级 数据库 实验 buffer 存储 管理