数据库

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值