小型数据库设计-MINISQL -Buffer Manager模块文说明

上传人:飞*** 文档编号:32989844 上传时间:2018-02-13 格式:DOC 页数:19 大小:105.50KB
返回 下载 相关 举报
小型数据库设计-MINISQL -Buffer Manager模块文说明_第1页
第1页 / 共19页
小型数据库设计-MINISQL -Buffer Manager模块文说明_第2页
第2页 / 共19页
小型数据库设计-MINISQL -Buffer Manager模块文说明_第3页
第3页 / 共19页
小型数据库设计-MINISQL -Buffer Manager模块文说明_第4页
第4页 / 共19页
小型数据库设计-MINISQL -Buffer Manager模块文说明_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《小型数据库设计-MINISQL -Buffer Manager模块文说明》由会员分享,可在线阅读,更多相关《小型数据库设计-MINISQL -Buffer Manager模块文说明(19页珍藏版)》请在金锄头文库上搜索。

1、MINISQL : Buffer Manager 模块文说明一设计思想:由于数据库对磁盘文件的读写非常频繁,且每次所读的数据内容较小,若每次数据库的读文件都访问磁盘将导致 I/O 效率的低下。此 BUFFER 即为提高磁盘 I/O 操作的效率,实现缓冲区与文件系统交互的单位是块,块的大小应为文件系统与磁盘交互单位的整数倍,此次实验中设定为 4096byte,即 4K,并且整个 Buffer 占 100 个BLOCK 块。每个磁盘文件都被分割成 4k 大小的块。二Buffer 的具体数据结构设计与实现:1Block 的具体数据结构:class blockMinichar BlockBLOCKSI

2、ZE;string FileName;int Num; /block num in the filebool Dirty;bool Writen;CTime Time;public:/构造函数blockMini(); /block num in the fileblockMini();/外部接口bool addRecord(char*,int size);bool deleteRecord(int index);char * getRecord(int index);.;内部接口在此省略,详细可参看代码区如上所示,每个block的数据结构包含了数据块char BlockBLOCKSIZE,所存

3、文件名:string FileName,在此文件上block数:int Num; ,以及标志位bool Dirty; bool Writen; CTime Time 为记录最后访问时间,用于实现LRU的替换准则。数据区的具体结构如下示意图: 指向空余空间结束的下标空余空间记录大小在数据区 Block数组的前端是储存记录信息的地方,每个 int型数据在此block中占八个单位的 byte。整个 block有两个 int型的信息数据,即第一:总共 record 个数。 第二: 指向空余空间结束的下标。每条 record 在 Block 头部也占有两个数据头信息,一个为此记录的大小,一个为此记录的起

4、始下标。所有记录都以 char *格式传给 buffer manager。Buffer manager 以 char *格式写到内存或文件。2Buffer 数据结构:包含了 100 个 block 和对外一些接口。三外部接口buffer manager 提供给 record manager 的接口:blockMini:deleteRecord(int index)/record manager 用此函数执行 delete 语句blockMini * bmMini:getBlock(string table, int num);/为 record manager 提供一个表的第 num个 blo

5、ck,从而让其可对该 block上的 record操作char * blockMini:getRecord(int index);/在对某一个块,可使用该函数得到这个块中的每个 block。Record manager可以通过这个包装好的接口直接得到各个 record数据,不用熟悉 buffer的具体结构void bmMini:drop(string table);/record manager调用此函数执行 drop 语句bool bmMini:addRecord(string table,char *record,int size);/record manager 调用此函数向“table

6、”表中插入大小为 size的 record,内容在 char * record;四内部接口实现总共 record 个数1操作硬盘的函数:bool blockMini:readBlockFromDisk(string table,int num);/从硬盘读取指定的文件的某个BLOCKbool blockMini:writeBlockToDisk(string table, int num);/向硬盘写.这两个函数负责所有的对硬盘的读写操作,以 block为单位。在操作数据时,若对应的操作对象在 buffer中存有拷贝,则只对 buffer的数据进行操作,不会直接操作硬盘,因此,buffer 中

7、的内容有可能比硬盘文件更新的早,因而在某个 block被替换以及程序推出时整个 buffer的析构时,对每个 block都会调用 writeBlockToDisk(string table, int num)函数进行文件的写操作,以将所有的 block更新到磁盘文件。2bool bmMini:addRecord(string table,char *record,int size)的实现:for(int i=0;igetFileName()=table)if(BufBlocki-addRecord(record,size)return true;/不能加在BUF中int Position=ge

8、tFreeBlock();HANDLE hFile;CString FileName=table.c_str();hFile=CreateFile(FileName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile=INVALID_HANDLE_VALUE)coutinitial();BufBlockPosition-addRecord(record,size);BufBlockPosition-setFile

9、Name(table);BufBlockPosition-setNum(FileSize);BufBlockPosition-setDirty();BufBlockPosition-setWriten();BufBlockPosition-setTime(CTime:GetCurrentTime();BufBlockPosition-writeBlockToDisk(table,FileSize);CloseHandle(hFile); return true;在插入某个 record时:首先在 buffer中搜索是否存在有足够空余的相同文件的 block。若存在则直接加到该 block中。若

10、没有,则:在文件的末尾添加一个 block,并把该记录加到此 block位置,再将此 block加载到内存中的某个空余 block。因此,每次判断文件的长度都是准确的,虽然每个 block中可能有部分空着,但可以用于下次的插入操作的实现。3替换准则:当 buffer中的 block都已满,但要加入一个 record到数据文件时,由于要加载添加后的 block,须选择合适的块进行替换,替换准则为 LRU:int bmMini:getFreeBlock()/从BUFFint ToReplace=0;/为BUFF空的情况CTime Tm=BufBlock0-getTime();for(int i=0

11、;iisWriten()=false)return i;/找到空闲block,直接返回if(BufBlocki-getTime()writeBlockToDisk(BufBlockToReplace-getFileName(),BufBlockToReplace-getNum();BufBlockToReplace-initial();return ToReplace;在 addRecord中,均有更新访问时间的部分:见上面代码中红色突出的语句五模块测试:测试内容:主要测试为 五个提供给外部的接口。方法添加 main函数测试如下:int main()bmMini bm1;char *Recor

12、d=hello; for(int i=1;igetRecordCount();/删除record前的record个数mp-deleteRecord(1);int numAfter=mp-getRecordCount();/删除record后的record个数coutTime;inline void blockMini:setTime(CTime t1)this-Time=t1;inline bool blockMini:isWriten()return this-Writen;inline void blockMini:setWriten()this-Writen=true;#endifbm.

13、cpp:#include windows.h#include#include atltime.h#include stdio.h#include atlstr.h#include math.h#include CString#include using namespace std;#includebm.hint getNumOfBlock(string table)/global methodHANDLE hFile;CString FileName=table.c_str();hFile=CreateFile(FileName,GENERIC_READ | GENERIC_WRITE,FIL

14、E_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if(hFile=INVALID_HANDLE_VALUE)coutinitial();blockMini:blockMini()string table=this-getFileName();int num=this-getNum();this-writeBlockToDisk(table,num);void blockMini:initial()for(int i=8;igetBlockHead();int * Begin=(int *)

15、content;int Count=this-getRecordCount();int Final=Count;/record的剩余个数int NewEnd=this-getFreeSizeEnd();/新的空空间的下标int MoveSpaceForRecord=0;int RecordDeleted=0;for(int i=1;igetRecordSize(i);if(!TmpSize)/TMPSIZE=0Final-;RecordDeleted+;if(TmpSizegetRecordPosition(Count)-(this-getRecordPosition(Count+1)+this-getRecordSize(Count+1)-1);else/不用再计算move的空间else/移动内容int OldPosition=this-getRecordPosition(Count);int NewPosition=OldPosition+MoveSpaceForRecord;this-move(NewPosition,OldPosition,TmpSize);this-setRecordSize(Count-RecordDeleted,TmpSize);this-setRecordPosition(Count-RecordDeleted,NewPosition);Ne

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号