欢迎来到天天文库
浏览记录
ID:13282962
大小:105.50 KB
页数:19页
时间:2018-07-21
《小型数据库设计-minisql -buffer manager模块文说明》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、MINISQL:BufferManager模块文说明一.设计思想:由于数据库对磁盘文件的读写非常频繁,且每次所读的数据内容较小,若每次数据库的读文件都访问磁盘将导致I/O效率的低下。此BUFFER即为提高磁盘I/O操作的效率,实现缓冲区与文件系统交互的单位是块,块的大小应为文件系统与磁盘交互单位的整数倍,此次实验中设定为4096byte,即4K,并且整个Buffer占100个BLOCK块。每个磁盘文件都被分割成4k大小的块。二.Buffer的具体数据结构设计与实现:1.Block的具体数据结构:classblockMini{charBlock[BLOCKSIZE];
2、stringFileName;intNum;//blocknuminthefileboolDirty;boolWriten;CTimeTime;public://构造函数blockMini();//blocknuminthefile~blockMini();//外部接口booladdRecord(char*,intsize);booldeleteRecord(intindex);char*getRecord(intindex);…..};内部接口在此省略,详细可参看代码区如上所示,每个block的数据结构包含了数据块charBlock[BLOCKSIZE],所存文件
3、名:stringFileName,在此文件上block数:intNum;,以及标志位boolDirty;boolWriten;CTimeTime为记录最后访问时间,用于实现LRU的替换准则。数据区的具体结构如下示意图:总共record个数指向空余空间结束的下标空余空间记录大小在数据区Block数组的前端是储存记录信息的地方,每个int型数据在此block中占八个单位的byte。整个block有两个int型的信息数据,即第一:总共record个数。第二:指向空余空间结束的下标。每条record在Block头部也占有两个数据头信息,一个为此记录的大小,一个为此记录的起始
4、下标。所有记录都以char*格式传给buffermanager。Buffermanager以char*格式写到内存或文件。2.Buffer数据结构:包含了100个block和对外一些接口。三.外部接口buffermanager提供给recordmanager的接口:blockMini::deleteRecord(intindex)//recordmanager用此函数执行delete语句blockMini*bmMini::getBlock(stringtable,intnum);//为recordmanager提供一个表的第num个block,从而让其可对该bloc
5、k上的record操作char*blockMini::getRecord(intindex);//在对某一个块,可使用该函数得到这个块中的每个block。Recordmanager可以通过这个包装好的接口直接得到各个record数据,不用熟悉buffer的具体结构voidbmMini::drop(stringtable);//recordmanager调用此函数执行drop语句boolbmMini::addRecord(stringtable,char*record,intsize);//recordmanager调用此函数向“table”表中插入大小为size的r
6、ecord,内容在char*record;四.内部接口实现1.操作硬盘的函数:boolblockMini::readBlockFromDisk(stringtable,intnum);//从硬盘读取指定的文件的某个BLOCKboolblockMini::writeBlockToDisk(stringtable,intnum);//向硬盘写...这两个函数负责所有的对硬盘的读写操作,以block为单位。在操作数据时,若对应的操作对象在buffer中存有拷贝,则只对buffer的数据进行操作,不会直接操作硬盘,因此,buffer中的内容有可能比硬盘文件更新的早,因而在某
7、个block被替换以及程序推出时整个buffer的析构时,对每个block都会调用writeBlockToDisk(stringtable,intnum)函数进行文件的写操作,以将所有的block更新到磁盘文件。2.boolbmMini::addRecord(stringtable,char*record,intsize)的实现:{for(inti=0;igetFileName()==table){if(BufBlock[i]->addRecord(record,size))returntrue;
此文档下载收益归作者所有