ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:166.17KB ,
资源ID:7312697      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7312697.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据库系统实现技术实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据库系统实现技术实验报告.docx

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