数据库
来源:互联网 发布:淘宝达人合作平台 编辑:程序博客网 时间:2024/06/04 23:36
#ifndef STRUCTURE_H_INCLUDED#define STRUCTURE_H_INCLUDED#define FRAMESIZE 4096#define MAXPAGES 100000#define DEFBUFSIZE 1024#include <string>#include <cstdio>#include "structure.h"using namespace std;struct NewPage//buffer中空闲的frame的信息 { int page_id; int frame_id; };struct bFrame//frame { char field [FRAMESIZE]; };struct BCB//每个page进入buffer,将会产生BCB,frame的相关信息存储在其相应的BCB中 { //BCB(); int page_id; int frame_id; int latch; int count; int dirty; BCB * next; BCB * previous; };struct BUFFER {bFrame bframe[DEFBUFSIZE]; bool used[DEFBUFSIZE]; int freeFrames; };class DSMgr//数据存储管理控制器{public: DSMgr(); int OpenFile(string filename); int CloseFile(); bFrame ReadPage(int page_id); int WritePage(int frame_id, bFrame frm); int Seek(int offset, int pos); FILE * GetFile(); void IncNumPages(); int GetNumPages(); void SetUse(int index, int use_bit); int GetUse(int index); int WriteBackPage(int page_id, bFrame frm);//自创函数,写回函数 int FileSeek(int offset);//移动文件指针private: FILE *currFile; int numPages; int pages[MAXPAGES];};DSMgr::DSMgr(){int flag=OpenFile("data.dbf");if(-1==flag) throw "没有找到数据库文件";}int DSMgr::OpenFile(string filename)//打开文件{currFile=fopen(filename.c_str(),"rb+");if(currFile==NULL) return -1;else return 0;}int DSMgr::CloseFile(){ return fclose(currFile);}bFrame DSMgr::ReadPage(int page_id){FileSeek((page_id+1)*FRAMESIZE);bFrame bframe;int getByteCount=fread(bframe.field,1,FRAMESIZE,currFile);if(getByteCount!=FRAMESIZE) throw "读页面失败";return bframe;}int DSMgr::WritePage(int frame_id, bFrame frm){return 0;}int DSMgr::WriteBackPage(int page_id, bFrame frm){FileSeek((page_id+1)*FRAMESIZE); int writeSuccessCount=fwrite(frm.field,1,FRAMESIZE,currFile); fflush(currFile); if(writeSuccessCount!=FRAMESIZE) throw "写回页面失败";return 0;}int DSMgr::Seek(int offset, int pos)//三种模式{if(1==pos)fseek(currFile,offset,SEEK_SET);if(2==pos)fseek(currFile,offset,SEEK_CUR);if(3==pos)fseek(currFile,offset,SEEK_END);return 0;}int DSMgr::FileSeek(int offset){fseek(currFile,offset,SEEK_SET);return 0;}FILE* DSMgr::GetFile(){return currFile;}void DSMgr::IncNumPages(){numPages++;}int DSMgr::GetNumPages(){return numPages;}void DSMgr::SetUse(int index, int use_bit){}int DSMgr::GetUse(int index){return 0;}#endif // STRUCTURE_H_INCLUDED
#include "structure.h"#include<fstream>#include<iostream>#include<cstring>#include<string>#include <sstream>#include <list>using namespace std;int count=0;class BMgr//buffer控制管理器 { public: BMgr(); // Interface functions int FixPage(int page_id, int prot); NewPage 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 UpdateLRUEle(int frid); void SetDirty(int frame_id); void UnsetDirty(int frame_id); void WriteDirtys(); void PrintFrame(int frame_id); void getFrameData(char storage [],int frameID) {for(int i=0;i<FRAMESIZE;i++) {storage[i]=buffer.bframe[frameID].field[i]; } } BUFFER getBuffer(); int getIdleFrame()//找到第一个空闲的frame返回id {for(int i=0;i<DEFBUFSIZE;i++)//初始化标记frame数组 {if(!buffer.used[i]) return i; } return -1; } void decreaseLatch(int frameID) {BCBassemble[frameID]->latch--; } DSMgr getDSMgr() {return dsm; } private: // Hash Table int ftop[DEFBUFSIZE];// BCB* ptof[DEFBUFSIZE];// BCB * BCBassemble[DEFBUFSIZE]; BUFFER buffer; list<int> lrulist; DSMgr dsm; }; BMgr::BMgr() { for(int i=0;i<DEFBUFSIZE;i++)//初始化标记frame数组 {buffer.used[i]=false; ptof[i]=0; } buffer.freeFrames=DEFBUFSIZE;//空闲的frame的数量 } int BMgr::FixPage(int page_id, int prot)//it returns a frame_id. {// for(int i=0;i<DEFBUFSIZE;i++)//初始化标记frame数组// {if(buffer.used[i])//被使用了// {BCB * bcb=BCBassemble[i];//获得i对应的bcb// if(bcb->page_id==page_id)//在buffer中找到page// {// UpdateLRUEle(bcb->frame_id);//命中,更新LRU表//// bcb->latch=bcb->latch+1;// return bcb->frame_id;//返回// }//// }//// }//*****************************new way****************************** BCB *tempBCBPointer=ptof[page_id%DEFBUFSIZE]; if(0!=tempBCBPointer) {while(tempBCBPointer->page_id!=page_id) {cout<<tempBCBPointer<<" "; tempBCBPointer=tempBCBPointer->next; if(0==tempBCBPointer) break; } cout<<endl; if(0!=tempBCBPointer) {UpdateLRUEle(tempBCBPointer->frame_id);//命中,更新LRU表 tempBCBPointer->latch=tempBCBPointer->latch+1; return tempBCBPointer->frame_id; } }//*****************************new way****************************** //页面不在缓存 if(0==buffer.freeFrames)//没有空余frame,需要替换 {int victimFrameID=SelectVictim(); BCB *bcbVcitim =BCBassemble[victimFrameID]; if(1==bcbVcitim->dirty)//需要写回 { dsm.WriteBackPage(bcbVcitim->page_id,buffer.bframe[bcbVcitim->frame_id]); count++; } //hashtable更新 if(0!=bcbVcitim->previous) {bcbVcitim->previous->next=bcbVcitim->next; if(0!=bcbVcitim->next) bcbVcitim->next->previous=bcbVcitim->previous; } else //bcbVcitim是链上第一个元素 {ptof[(bcbVcitim->page_id)%DEFBUFSIZE]=bcbVcitim->next; if(0!=bcbVcitim->next) bcbVcitim->next->previous=0; } buffer.used[victimFrameID]=false; buffer.freeFrames++; //从文件中读数据到buffer frame victimPageID bFrame abframe=dsm.ReadPage(page_id); for(int i=0;i<FRAMESIZE;i++) {buffer.bframe[victimFrameID].field[i]=abframe.field[i]; //cout<<buffer.bframe[victimFrameID].field[i]<<"****************"<<endl; } count++; buffer.used[victimFrameID]=true; buffer.freeFrames--; delete bcbVcitim; BCB * bcb=new BCB; //bcb更新 bcb->dirty=0; bcb->frame_id=victimFrameID; bcb->page_id=page_id; bcb->next=0; bcb->previous=0; BCB * tempBCBPointer=ptof[page_id%DEFBUFSIZE]; if(0==tempBCBPointer) {ptof[page_id%DEFBUFSIZE]=bcb; bcb->previous=0;//第一个父指针为空 bcb->next=0; } else { bcb->next=tempBCBPointer->next; if(0!=tempBCBPointer->next) tempBCBPointer->next->previous=bcb; tempBCBPointer->next=bcb; bcb->previous=tempBCBPointer; } UpdateLRUEle(victimFrameID);//更新LRU表 bcb->latch=bcb->latch+1;//数据即将要提交到主存,需要加锁 BCBassemble[victimFrameID]=bcb;//增加bcb //返回ID return victimFrameID; } else //有空闲,找到第一个一个空闲的frame读入 { int idleFrameID=getIdleFrame(); //从文件复制数据到这个frame idleFrameID bFrame abframe=dsm.ReadPage(page_id); for(int i=0;i<FRAMESIZE;i++) buffer.bframe[idleFrameID].field[i]=abframe.field[i]; count++; buffer.used[idleFrameID]=true; buffer.freeFrames--; //生成bcb; BCB * bcb=new BCB; bcb->dirty=0; bcb->frame_id=idleFrameID; bcb->page_id=page_id; bcb->next=0; bcb->previous=0; UpdateLRUEle(idleFrameID);//更新LRU表 cout<<"LRU队首"<<lrulist.front()<<endl; BCBassemble[idleFrameID]=bcb;//增加bcb BCB * tempBCBPointer=ptof[page_id%DEFBUFSIZE]; if(0==tempBCBPointer) {ptof[page_id%DEFBUFSIZE]=bcb; bcb->previous=0;//第一个父指针为空 } else { bcb->next=tempBCBPointer->next; if(0!=tempBCBPointer->next) tempBCBPointer->next->previous=bcb; tempBCBPointer->next=bcb; bcb->previous=tempBCBPointer; } bcb->latch=bcb->latch+1;//加锁 //返回ID return idleFrameID; } } NewPage BMgr::FixNewPage()// {for(int i=0;i<DEFBUFSIZE;i++) {if(!buffer.used[i]) {NewPage newpage; newpage.frame_id=i; newpage.page_id=ftop[i]; return newpage; } } NewPage newpage; newpage.frame_id=-1; newpage.page_id=-1; return newpage; } int BMgr::UnfixPage(int page_id) { } int BMgr::NumFreeFrames() { return buffer.freeFrames; } int BMgr::SelectVictim() { for(list<int> ::reverse_iterator riter=lrulist.rbegin();riter!=lrulist.rend();riter++) if(0==BCBassemble[*riter]->latch) {return *riter; } return -1; } int BMgr::Hash(int page_id) { return (page_id)%DEFBUFSIZE; } void BMgr::RemoveBCB(BCB* ptr, int page_id) { } void BMgr::UpdateLRUEle(int frid) { lrulist.remove(frid);//—————————————— lrulist.push_front(frid);//放入开始头 } void BMgr::SetDirty(int frame_id) { BCBassemble[frame_id]->dirty=1; } void BMgr::UnsetDirty(int frame_id) { } void BMgr::WriteDirtys() { } void BMgr::PrintFrame(int frame_id) { for(int i=0;i<FRAMESIZE;i++) {cout<<buffer.bframe[frame_id].field[i]; } cout<<endl; } BUFFER BMgr::getBuffer() {return buffer; } int main() {int datacount=0; ifstream infileStream; string str; infileStream.open("data.txt",ios::in); char requestdata[30]; BMgr bMgr; while(!infileStream.eof()) {datacount++; cout<<"datacount:*************"<<datacount<<endl; infileStream.getline(requestdata,20,'\n');//字符数组中包含"\n" //cout<<"****"<<strlen(requestdata)<<"***"<<endl; str=string(requestdata); if(str[str.size()-1]=='\n') str=str.substr(0,str.size()-1);//去掉\n,最后一列没有\n // cout<<"**"<<str<<"**"<<endl; int pos=str.find(',',0); string strRorW=str.substr(0,pos); string strPage=str.substr(pos+1,str.length()); stringstream ss; int flagWorR=-1; int pageAccessID=-1; // cout<<"**"<<strRorW<<"****"<<endl; // cout<<"**"<<strPage<<"****"<<endl; ss<<strRorW; ss>>flagWorR; ss.clear(); ss<<strPage; ss>>pageAccessID; cout<<flagWorR<<","<<pageAccessID<<endl; int frameID=bMgr.FixPage(pageAccessID,flagWorR);//获得frameid char contentPage[FRAMESIZE]; //strncpy(contentPage,bMgr.getBuffer().bframe[frameID].field,FRAMESIZE);//读进内存 //bMgr.PrintFrame(frameID); bMgr.getFrameData(contentPage,frameID); cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"<<strlen(contentPage)<<endl; for(int i=0;i<FRAMESIZE;i++) {cout<<contentPage[i]; } cout<<endl; //数据操作处理 //××××××××××× //如果是写操作 //设置写标志 if(flagWorR==1) {bMgr.SetDirty(frameID);//设置frameID对的frame写污染 } //读操作不管 //操作完成处理之后,然后将锁减一; bMgr.decreaseLatch(frameID); } infileStream.close(); bMgr.getDSMgr().CloseFile(); cout<<"buffer和磁盘之间的IO次数是"<<count<<endl; return 0; }// list<int>::iterator contain (list<int> listTemp,int elem)// {for(list<int>::iterator iter=listTemp.begin();iter!=listTemp.end();iter++)// {if(*iter==elem)// return iter;// }// return listTemp.end();//////// }//// list<int> getLRUList()// {return lrulist;// }
0 0
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 数据库
- 分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句
- vim中实现多行缩进
- MVP模式
- Android Studio Gradle的一些总结
- ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用
- 数据库
- byte[]到short、int、long的相互转换
- 在树莓派/ArchlinuxArm上安装yaourt
- Material Design设计之Tinting(着色)和Clipping(裁剪)
- Git分支的前世今生
- 扫盲:字符编码与字符集的区别
- 用git下载代码很慢的问题解决
- node.js websocket+html5实现的简单联网tank大战的游戏模型
- 【Java+OpenCV】安装与配置