1、数据库系统实现技术实验报告数据库实现实验报告 题目:存储&缓冲管理器姓名:XXXXXXXXXXXXXXX学号:SCXXXXXXXXXXX 院系:计算机科学与技术学院 完成日期:6/6/20121 系统说明 31.1 术语说明 31.1.1 缓冲区 31.1.2 基于结构的目录文件 31.2 关键技术 31.2.1 内存页面替换策略 31.2.2 页面&存储帧的转换 31.2.3 文件存储格式 41.3 系统需求 42 系统设计 42.1 Hash链表的设计 42.2 系统性能 52.2.1 系能测试方法 52.2.2 性能指标 52.3 系统总体架构 62.4 系统模块 62.4.1 数据存储
2、管理器 62.4.2 缓冲区管理器 72.4.3 LRU管理器 83 模块接口 83.1 缓冲区管理器接口 83.1.1 FixPage(int page_id, int prot) 83.1.2 FixNewPage() 83.1.3 UnfixPage(int page_id) 83.1.4 NumFreeFrames() 93.1.5 SelectVictim() 93.1.6 Hash(int page_id) 93.1.7 RemoveBCB(BCB* ptr, int page_id) 93.1.8 RemoveLRUEle(int frid) 93.1.9 SetDirty(in
3、t frame_id) 93.1.10 UnsetDirty(int frame_id) 93.1.11 WriteDirtys() 93.1.12 PrintFrame(int frame_id) 93.2 数据存储管理器 93.2.1 OpenFile(string filename) 93.2.2 CloseFile() 93.2.3 ReadPage(int page_id) 93.2.4 WritePage(int frame_id, bFrame frm) 103.2.5 Seek(int offset, int pos) 103.2.6 GetFile() 103.2.7 Inc
4、NumPages() 103.2.8 GetNumPages() 103.2.9 SetUse(int page_id, int use_bit) 103.2.10 GetUse(int page_id) 103.3 LRU管理器 103.3.1 RemoveLRUEle(int frmid); 103.3.2 ResetFstNode(int frame_id); 103.3.3 Modify(int frame_id); 104 核心算法 104.1 替换页面选择伪代码SelectVictim() 104.2 LRU链表更新Modify(int frame_id) 115 测试结果 126
5、 参考文献: 131 系统说明1.1 术语说明1.1.1 缓冲区缓冲区是指系统的主存中的空间。CPU只能够访问主存中的内容。缓冲区包含一组帧片。当一个页面被请求时,就会被装载到缓冲区中。大部分的商业数据库管理系统设置帧片的大小与系统的页大小一致以确保不会产生额外的碎片。本实验采用相同的策略。缓冲区的大小默认的设置为1024.缓冲区是由被称之为帧片的逻辑分区组成。这些帧片被存储在全局的定义的结构当中,通常描述为如下形式:#define FRAMESIZE 4096 struct bFrame Char field FRAMESIZE ; ;缓冲区将会存储一系列的存有或者装有页面的帧片。其数组将如
6、下图#define DEFBUFSIZE 1024 bFrame bufDEFBUFSIZE; /或者用户通过参数自定义大小当页面被请求的时候,这些被分配给缓冲区的空间将会被缓冲区管理器文件等访问。1.1.2 基于结构的目录文件每一个文件都有一个包含文件中每一页面指针的基础页面。每一个在基础页面当中的指针都代表一个页面。数据页面仅仅包含数据而不存储指针。因此基础页面(也即目录)在文件访问的时候必须被访问。当记录被查询时候,能够很好地找寻文件是这种基于目录式的文件格式被采用的主要原因。这种组织方式使得可以快速通过指针访问相应页面而不需要搜索一个长的页面列表。1.2 关键技术1.2.1 内存页面替
7、换策略采用LRU算法作为替换策略。通过最近访问时间组织的缓冲区页面构成LRU队列,使用该种策略换出最近最少使用的页面。总是在LRU的位置选出替换页面。有一个常系数的时间复杂性是LRU算法的主要优点。而且,LRU的性能因好的时间局部性而别被人称道。比如:当前被访问的页面很可能将不久得将来访问。对于缓冲区的每一帧片,管理着块的缓冲区必须被保存。每一个缓冲区控制块(BCB),包含page_id, frame_id,page_latch(页面锁),dirty_bit(脏数据位)。page_ids作为将page_id作为哈希映射给BCB的关键码。两个哈希表被需要:一个是将page_ids映射到frame
8、_id和BCB,一个是将frame_id映射为page_id.1.2.2 页面&存储帧的转换采用静态的哈希方法。在静态的哈希方法种种,桶的容量是固定的。假如一个桶装满,一个溢出的链表将连接性的额外数据。使用关键值,哈希函数将其映射为一个桶,同时也是访问当个桶的手段。在程序运行期间,桶的容量不会发生改变。静态的哈希方法将采用类似相面的函数H(k) = (page_id)%buffer_size每一个缓冲区控制块(BCB),page_id, frame_id,计数,dirty_bit(脏数据位)。将page_id映射到BCB的哈希表如下 BCB hTableBufferSize.将frame_id
9、映射为page_id的哈希表如下int hTableBufferSize.1.2.3 文件存储格式为保证可以快速通过指针访问相应页面而不需要搜索一个长的页面列表,每一个文件都有一个包含文件中每一页面指针的基础页面。每一个在基础页面当中的指针都代表一个页面。数据页面仅仅包含数据而不存储指针。因此基础页面(也即目录)在文件访问的时候必须被访问。1.3 系统需求 完成数据的读写更新; 能够展示实验结果; 实现LRU对缓冲区页面的控制; 具有一定的容错能力; 实验测试的时间; 读写命中率以及缺失率。2 系统设计2.1 Hash链表的设计在实验当中,两处使用hash链表,其中一条链表将page_id映射
10、为frame_id,在实验当中称为ptof;另外一条将frame_id映射为page_id,在实验中成为ftop。Figure 1 page_id 映射frame_id图Figure 2 frame_id 映射page_id图2.2 系统性能2.2.1 系能测试方法系统以跟踪驱动文件为主要手段,在该文件由Zipf分布器生成,其中包括500,000个页面,页面号0到49,999。其形式如“x, #”,其中x是读写标志,0表示读操作,1表示写操作,#表示页面号。另外假设开始时,内存为空,所有的文件(名为data.dbf)都已经通过目录文件的形式存在物理硬盘。 2.2.2 性能指标i) 总I/O次数
11、ii) 缓冲区的命中率iii) 驱动测试文件的运行时间2.3 系统总体架构2.4 系统模块2.4.1 数据存储管理器class DSMgrpublic: DSMgr(); int OpenFile(char* filename); int CloseFile(); int AddPage(int page_id); bFrame ReadPage(int page_id); int WritePage(int page_id, bFrame frm); int Seek(int offset, int pos); FILE * GetFile(); void IncNumPages(); vo
12、id DecNumPages();/? int GetNumPages(); void SetUse(int page_id, int use_bit); int GetUse(int page_id); int GetRecOffset(int page_id);private: FILE *currFile; int numPages; int pagesMAXPAGES; void IsOk(char * filename,int rtn,int exprtn);2.4.2 缓冲区管理器class BMgrpublic: BMgr(); BMgr(); / Interface funct
13、ions int FixPage(int page_id,int rwflag); void FixNewPage(); int UnfixPage(int page_id); int NumFreeFrames(); / Internal Functions int SelectVictim(); int Hash(int page_id); void RemoveBCB(BCB * ptr, int page_id); void AddBCB(int frame_id,int rwflag); void RemoveLRUEle(int frid); void SetDirty(int f
14、rame_id); void UnsetDirty(int frame_id); void WriteDirtys(); void PrintFrame(int frame_id); void IsOk(char * filename,int rtn,int exprtn); int GetHits(); int GetIO();private: /void ChgPgHash(int page_id,int frame_id,int outpgid); int PageIsUsed(int frame_id); int ChgPgHash(int page_id,int frame_id);
15、 / Hash Table int ftopDEFBUFSIZE;/frame_id hash BCB* ptofDEFBUFSIZE; /page hash LRUMgr lrumgr; DSMgr dsmgr; bFrame frmsDEFBUFSIZE;/? int wtPgid;/page max index write on disk int wrtFlag;/O int rdFlag;/I int hits; int sumIn; int sumOut; 2.4.3 LRU管理器class LRUMgrpublic: LRU *header; LRU *tail; int used
16、; LRUMgr(int lruNum); LRUMgr(); /int SelectVictim(); int RemoveLRUEle(int frmid); void ResetFstNode(int frame_id); void Modify(int frame_id); void IsOk(char * filename,int rtn,int exprtn); void DebugShow();3 模块接口3.1 缓冲区管理器接口3.1.1 FixPage(int page_id, int prot)该函数返回值是frame_id,文件和存储管理器将通过在记录record_id中
17、的page_id找到该页面。当页面在缓冲区中,函数返回相应的frame_id。否则调入页面,并且是需要的时候会替换页面。3.1.2 FixNewPage()该函数原型返回page_id,frame_id。当因为插入,索引分离,对象创建一个新页面被需要的时候就会调用这个函数,被返回的page_id主要用于被分配给记录record_id和元数据。找到的新页面将会被文件存储管理器存储新的页面。3.1.3 UnfixPage(int page_id)该函数原型返回frame_id,这个函数有一次FixPage 或者 FixNewPage调用。这个函数会减少帧片上的固定数量。如果count减少到0,且页
18、面的锁已被移除,帧片会被移除。page_id被翻译成frame_id,并且可能没有锁以便能够在count为0时被选为一个替换页面。3.1.4 NumFreeFrames()该函数原型在缓冲区中查询空闲和可用的帧片,这对于N-way排序的查询处理特别有效。返回一个从0 到 BUFFERSIZE-1(1023)的整数。3.1.5 SelectVictim()该函数挑选一个替换的帧片。假如被选择的帧上面dirty_bit被设置那么就需要被写到硬盘。3.1.6 Hash(int page_id)该函数返回frame_id.3.1.7 RemoveBCB(BCB* ptr, int page_id)从一
19、个缓冲区控制块数组中移除page_id的页面。该函数仅仅在SelectVictim()需要替换页面时被调用。3.1.8 RemoveLRUEle(int frid)从列表中移除LRU元素。3.1.9 SetDirty(int frame_id)函数原型设计帧片的脏数据位。这个脏数据位表示是否有数据写到缓冲区。当内容被更改,帧就会被写。这个包含任何的目录页面和数据页面。假如bit是1,哪儿表示有数据写入;否则为0。3.1.10 UnsetDirty(int frame_id)函数原型将相应的frame_id的脏数据置为0,调用这个函数的主要原因是SetDirty被调用时但是页面实际是临时的部分相
20、关。在这种情况下,这个页面实际上不需要被写。3.1.11 WriteDirtys()函数在系统关闭时候调用。主要目的是将buffer中的脏数据帧写到文件。3.1.12 PrintFrame(int frame_id)打印frame_id里面的内容。3.2 数据存储管理器3.2.1 OpenFile(string filename)函数在文件被打开或者读取的时候调用。返回值为一个错误返回码。3.2.2 CloseFile()函数在文件关闭时被调用。返回值是错误码。这个函数仅当数据库改变或者程序关闭时候调用。3.2.3 ReadPage(int page_id)函数会被缓冲区的FixPage函数调
21、用。返回的是读取的数据。这个函数调用fseek()和fread()得到数据。3.2.4 WritePage(int frame_id, bFrame frm)函数在任何时候从缓冲区中取出数据时调用。返回被写入的数据字节数。函数调用fseek()和fwrite()去存储数据。3.2.5 Seek(int offset, int pos)函数移动指针3.2.6 GetFile()函数返回当前文件。3.2.7 IncNumPages()函数增加页面的计数.3.2.8 GetNumPages()函数返回文件的计数.3.2.9 SetUse(int page_id, int use_bit)函数找到页数
22、组中的设置位,这个数组跟中被使用的页面。如果一个页面当中所有的记录都被删除,那么页面就没有实际利用价值并且能够被重新使用。为了检查页面是否能够被使用,当所有的use_bits被置0。fixNewPage 首先会检查use_bits数组中是否0。如果有一个0,则可以被重用;否则重新使用。3.2.10 GetUse(int page_id)函数返回相应页面的use_bit位。3.3 LRU管理器3.3.1 RemoveLRUEle(int frmid); 将帧标识为frmid的LRU单元移除3.3.2 ResetFstNode(int frame_id); 把LRU链表当中第一个元素的frame_
23、id重置为传入的参数值;3.3.3 Modify(int frame_id);将标识为frame_id的LRU单元移到链表首部4 核心算法4.1 替换页面选择伪代码SelectVictim()当页面不再内存就需要调用替换页,需要根据LRU是否有空闲的单元两种情况进行具体设计。尤其是当将其他页面换出内存的时候要根据其是否为脏而重写硬盘文件。 pLRU = lrumgr.tail;/指向链表的最后一个元素 priorLRU = lrumgr.tail;/指向链表的最后一个元素 frame_id = pLRU-frame_id;/获取最后元素存放的帧ID;. if(frame_id != -1)/链
24、表中元素已经全部被用完 while(pLRU != lrumgr.header)/寻找未被锁定的帧缓存 flag = PageIsUsed(frame_id);/判断该帧是否锁定 if( flag = 1) frame_id = pLRU-frame_id ; pLRU = pLRU-prior;/trans from tail to header else /找到可用的帧 frame_id = pLRU-frame_id ; pLRU = lrumgr.header;/fake while /break; lrumgr.Modify(frame_id);/将找到的元素放到链表头部,表示最近被
25、访问 else/ 链表当中还有元素未被分配 lrumgr.Modify(-1);/将最后空闲的元素移动到链表首部 if(lrumgr.used RemoveBCB(pBCB,ftopframe_id);/移除替换出去页面的元素 return frame_id; 4.2 LRU链表更新Modify(int frame_id)在更新LRU链表过程当中,当要被移动的元素是首元素或者尾元素的时候,需要认真仔细的调整首部或尾部指针,否则会将链表元素丢失 LRU *tmp = this-tail; LRU *tmpFirst = NULL,*tmpLast = NULL; while( (tmp != N
26、ULL) & (!(tmp-frame_id = frame_id) )/寻找要移动元素 tmp = tmp-prior; if(tmp != NULL)/要移动的元素存在 tmpFirst = tmp-prior; tmpLast = tmp-next; if(tmpFirst)/被移动的不是首元素 this-header-prior = tmp; tmp-next = this-header; tmp-prior = NULL; /调整链表的头指针 this-header = tmp;/ tmpFirst-next=tmpLast; if(tmpLast != NULL)/被移动的不是尾元
27、素 tmpLast-prior = tmpFirst;/ modify the next LRUElement分情况 重置尾指针 if(tmpLast = NULL)/ frame_id = -1? or last node replaced . this-tail = tmpFirst; this-tail-next = NULL; 5 测试结果测试环境:linux Ubuntu 10.04(LTS)驱动测试文件的记录数目: 500000总I/O次数 502821命中率 33.9130%运行时间 16 min 51 secFigure 3 实验测试结果6 参考文献:1 Database System Implementation(2th) ,H. Garcia-Molina, J.D. Ullman, J. Widom. 机械工业出版社
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1