中科大软院金老师的数据库实验2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

另外我们可以看到在图 4.1 中,命中 buffer 的次数是 169565 次,IO 次数是 341570,两者加起来大于 500000 次操作,原因很简单。我们把操作分为下面四 种情况:
先读再读:这样第二次读写时页面在 buffer 中节省 io 先写再写:这时两次写操作合并为对磁盘的一次写节省 io 先写再读:第二次读操作在 buffer 中节省 io 先读再写:这种情况下还是 2 次 io 操作没有节省 io 故所有的操作结果要大于 500000 次
USTC——School of Software Engineering
1 实验背景
ZhangYue
In this project, we will implement a simple storage and buffer manager. The document addresses the storage and buffer manager. Buffer and frame sizes, buffer and frame storage structures, page formats, page storage structures, file formats, buffering techniques, hashing techniques, file storage structures, and interface functions for the disk space and buffer modules will be discussed . The particular technique is chosen from the material covered in class that are relevant to buffer and storage manager.
USTC——School of Software Engineering
ZhangYue
4 概要设计
根据设计思路,我们设计了如下的数据结构:
bFrame:就是一个1024大小的页面 struct bFrame {
char field[FrameSize]; }; BCB:用来记录页框信息的结构体 struct BCB {
图 4.1 实验结果 根据上图我们可知 LRU 算法,对文件进行给定操作,命中率大概在 33.9%,其 中 IO 次数 341570,Buffer 命中次数 169565。总共执行实验时间 4s(在 CPU 为 I7-3520 条件下) 扩展性测试,如果把 buffer 大小改大一倍,即 buffersize=2048,此时 LRU 算法的命中率应该明显上升,如图 4.2 所示:
图 2.1 buffer 和 disk 映射关系示意图
USTC——School of Software Engineering
ZhangYue
我们用两个哈希表来映射页框号到页号,页号到页框号。方便系统的查找,其概
要设计图 2.2 所示:
图 2.2 Hash Table 设计图 其中 Ftop 是一个一维数组,完成页框到页号的映射。 Ptof 是一个哈希链表,用来完成页号到页框的映射,上面的 BCB 是用来保存页 框的信息的。 置换的策略采用 LRU: 用 recentused 这个数据项记录最近使用的时间,遍历哈希表,找到最久没有使用 的页框,把他的内容换成新的页面,挂到相应的链表上去。 最后我们读入所指定操作,然后将所需要的数据打印到屏幕上。操作分两种,读 和写,分别用 0 和 1 表示,指定了页号。通过遍历哈希表找到相应页号对应的页 框,直接从内存中读取数据,并且修改使用时间和是否为脏。如果指定页号没有 相应的页框,证明数据并不在内存中,我们需要从硬盘上读取数据,如果 buffer 没有满,直接计算槽号,挂到相应的队列中。如果页框已用完,通过 recentused 数 据,置换最近最久没有使用的页面,把新页面挂到相应的哈希链表上去,用 BCB 记录该页框的信息。 操作完成后我们需要计算从磁盘上读取的次数和从 buffer 中读取的次数,依此来 计算 buffer 命中率。
图 4.2 buffersize=2048 时
USTC——School of Software Engineering
ZhangYue
结果分析:
我们不难发现,当 buffersize 设置为 2048 时,LRU 的命中率达到了 41.91%, 不难知道,LRU 在 buffer 变大时,页面的置换没有那么频繁,不容易产生缺页, 所以命中率明显提高。
void WriteDirtys();//将脏位为1的页框内容写回对应页
};
详细函数实现代码见附录
USTC——School of Software Engineering
5 实验结果及分析
ZhangYue
我们先调用 File 类的 create 方法,使其生成一个 50000 页的文件,在文件的第一页 写入了目录。之后我们注释掉 create 语句,直接读取文件内容进行实验,执行结 果如图 4.1 所示:
目录
ZhangYue
1 实验背景 .............................................. 3 2 实验平台 .............................................. 3 3 设计思路 .............................................. 3 4 概要设计 .............................................. 5 5 实验结果及分析 ........................................ 7 6 总结及致谢 ............................................ 8 7 附录: ................................................ 9
void WritePage(int page_id, bFrame* frm);//将页框中的内容写到 磁盘中
int get_DiskIOCount();//返回命中次数 }; class BMgr { private:
DSMgr dsmgr; int num_free_frames;//记录空闲页框数 int ftop[BufferSize];//页框到页号的哈希表 BCB* ptof[BufferSize];//页号到页框号的哈希表 bFrame buf[BufferSize];//buffer缓存,装1024个页面 int hitCount;//命中次数 public: BMgr(); int get_hitCount();//返回命中次数 int get_diskIoCount();//返回磁盘IO次数 bFrame& Read(int page_id);//返回页号对应的页框 void RemoveBCB(BCB * ptr);//移除BCB块 void Write(int page_id,bFrame &input); BCB * SelectVictim();//选择要被置换出的页面 BCB* Hash(int page_id);//做页号到页框号的映射 int FixPage(int page_id,int RorW);//根据页号找到对应页框号,在内 存中读取文件
int dirsize;//文件目录大小 int pagesize; //页面大小 int posDataStart; //数据起始位置
int page_count; //页面数 File(){} File(const char * filename,int* dir); void create();//用来初始化创建一个50000页面的文件 void close(int* dir);//关闭时保存文件信息 }; DSMgr: class DSMgr { private: File* currFile;
6 总结及致谢
本次实验让我们从底层了解了一个 DBMS 的管理策略,包括目录式的存储数据, 读出写入数据,用 LRU 算法查找页面,以及算法的性能分析等等。感谢助教老 师和金老师提供的指导和帮助。 (代码部分见附录)
USTC——School of Software Engineering
7 附录:
int numPages; int pages[MAXPAGES]; int DiskIOCount; public: DSMgr(); int OpenFile(char* filename="data.dbf"); void CloseFile(); void ReadPage(bFrame* frame,int page_id) ; void WritePage(int page_id, bFrame* frm); int get_DiskIOCount(); }; class BMgr { private: DSMgr dsmgr; int num_free_frames; int ftop[BufferSize]; BCB* ptof[BufferSize]; //Buffer bFrame buf[BufferSize]; int hitCount; public: BMgr(); int get_hitCount(); int get_diskIoCount(); bFrame& Read(int page_id); void RemoveBCB(BCB * ptr); void Write(int page_id,bFrame &input); BCB * SelectVictim();
代码部分: #include<cstdio> #include<cstring> #include<cstdlib> #define FrameSize 4096 #define BufferSize 1024 #define MAXPAGES 50000
using namespace std;
inline unsigned __int64 GetCycleCount() { __asm _emit 0x0F __asm _emit 0x31 }
struct bFrame {
char field[FrameSize]; };
struct BCB {
int page_id; int frame_id; int count; int latch; unsigned __int64 usedtime; int dirty; BCB * next; }; class File { public: FILE* file;
int page_id;//页面号 int frame_id;//页框号 int count; int latch; unsigned __int64 usedtime;//该页最近的使用时间 int dirty;//是否为脏,脏就要写回 BCB * next;//;链向下一个BCB }; class File { public: FILE* file;
int dirsize; int pagesize; int posDataStart;
ZhangYue
USTC——School of Software Engineering
int page_count;
File(){} File(const char * filename,int* dir); void create(); void close(int* dir); }; class DSMgr { private: File* currFile;
USTC——School of Software Engineering
ZhangYue
数据库第二次实验
实验名称:Buffer 的存储及管理
姓 名:
张悦
学 号: SA12226141
实验时间: 2012.11.16
实验地点: 明德楼 Hale Waihona Puke Baidu08
USTC——School of Software Engineering
2 实验平台
本实验采用 Windows7 Home + Visual Studio 2012
3 设计思路
采用 4096 大小的页面,即 FrameSize=4096,buffer 中一共有 1024 个页面, 即 DefBufferSize=1024。开始在硬盘上存储 50000 个页,按目录形式存储,即第 一页包含目录大小,第一页的起始位置,每一页的逻辑偏移量。其中 buffer 和 disk 的映射关系如图 2.1 所示:
USTC——School of Software Engineering
ZhangYue
int numPages;//所含页面数 int pages[MAXPAGES]; int DiskIOCount;//记录磁盘IO数 public: DSMgr(); int OpenFile(char* filename="data.dbf");//打开文件,默认为 data.dbf void CloseFile();//关闭文件并保存信息 void ReadPage(bFrame* frame,int page_id) ;//从磁盘读取页面写到 页框中
相关文档
最新文档