资源简介
Storage and Buffer Manager C++ code.在别人的基础上做的,应该说除了lru都是重做的.模拟数据库文件的实现.

代码片段和文件信息
#include “StdAfx.h“
#include “BMgr.h“
#include “DSMgr.h“
//Implementation of BMgr
DSMgr dss;
//LRU Element List
struct LRUEle * lru;
struct LRUEle * mru;
//
LRUEle::LRUEle()
{
frameid = -1;
time = 0.0;
less = nullptr;
more = nullptr;
}
BCB::BCB()
{
next = NULL;
latch = -1;
count = -1;
page_id = -1;
frame_id = -1;
stime =-1;
ftime=-1;
dirty=-1;
}
//
BMgr::BMgr(void)
{
int i = 0;
for(i = 0; i < BUFFERSIZE; i++)
{
//
ptof[i] = nullptr;
ftop[i] = -1;
}
dss.OpenFile(“data.dbf“);
}
BMgr::~BMgr(void)
{
}
//If the page is not resident in the buffer yet it selects a victim page
int BMgr::FixPage(int page_id int prot)
{
//prot means protection
int fid = -1;
int num=Hash(page_id);
BCB * bcb =ptof[num];
while(bcb!=nullptr)
{
if(bcb->page_id == page_id)
{
break;
}
bcb = bcb->next;
}
if(bcb != nullptr)
{
if(bcb->stime != -1)
{
bcb->ftime=bcb->stime;
}
DoLRUList(bcb bcb->frame_id);
return bcb->frame_id;
}
else
{
bcb = ptof[num];
fid = SelectVictim();
buf[fid] = dss.ReadPage(page_id);
ftop[fid] = page_id;
if(bcb != nullptr)
{
while(bcb->next != nullptr)
{
bcb = bcb->next;
}
bcb->next = new BCB();
bcb = bcb->next;
}
else
{
bcb = new BCB();
ptof[num] = bcb;
}
//重新设置bcb//
bcb->next = nullptr;
bcb->page_id = page_id;
bcb->frame_id = fid;
bcb->latch = 0;
bcb->count = 0;
bcb->ftime = static_cast(time(0));
//cout<ftime< bcb->stime = -1;
DoLRUList(bcb fid);
}
return fid;
}
NewPage BMgr::FixNewPage()
{
//find a newpage;
int offset=0;
int i=0;
while(i {
dss.Seek(offsetSEEK_SET);
if(dss.GetUse(i)!=0)break;
i++;
offset+=frameSIZE;
}
if(i==MAXPAGES){
printf(“\t$> error:disk is fullpress enter to exit“);
getchar();
exit(0);
}
NewPage np;
np.page_id=i;
//
np.frame_id=FixPage(i0);
return np;
}
int BMgr::UnfixPage(int page_id)
{
int num=Hash(page_id);
if(ptof[num]->count>0)
ptof[num]->count--;
if(ptof[num]->count==0)
ptof[num]->latch=0;
return ptof[num]->frame_id;
}
int BMgr::NumFreeframes()
{
//return the num of free frame
int i = 0j = 0num = 0Free = 0;
BCB * bcb = nullptr;
for(i = 0; i < BUFFERSIZE; i++)
{
j = ftop[i];
if(j == -1)
{
Free++;
}
else
{
num = Hash(j);
int frame_id = num;
bcb = ptof[num];
while(bcb != nullptr && bcb->frame_id != j)
{
bcb = bcb->next;
}
if(bcb != nullptr && bcb->frame_id == j)
{
if(bcb->count == 0 && bcb->latch == 0)
{
Free++;
}
}
}
}
return Free;
}
int BMgr::SelectVictim()
{
int vframe = 0pid = 0fid=0;
BCB * bcb = nullptr;
bool found = false;
LRUEle * temp = lru;
if(temp == nullptr)
{
return 0;
}
for(int i = 0; i < BUFFERSIZE; i++)
{
if(ftop[i] == -1)
{
return i;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 7681 2013-11-23 22:30 dbprj\BMgr.cpp
文件 1291 2013-11-23 19:28 dbprj\BMgr.h
文件 3690270 2013-11-23 20:59 dbprj\data-5w-50w-zipf.txt
文件 3194 2014-03-23 13:31 dbprj\dbprj.cpp
文件 4512 2013-10-31 19:37 dbprj\dbprj.vcxproj
文件 1659 2013-10-31 19:37 dbprj\dbprj.vcxproj.filters
文件 143 2013-10-27 22:23 dbprj\dbprj.vcxproj.user
文件 2045 2013-11-23 19:25 dbprj\DSMgr.cpp
文件 1159 2013-11-23 19:25 dbprj\DSMgr.h
文件 1354 2013-11-23 22:10 dbprj\ReadMe.txt
文件 245 2013-11-23 22:18 dbprj\stdafx.cpp
文件 927 2013-11-23 21:45 dbprj\stdafx.h
文件 234 2013-10-27 22:25 dbprj\targetver.h
目录 0 2014-03-23 13:31 dbprj
----------- --------- ---------- ----- ----
3714714 14
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
评论
共有 条评论