如何分析这个FIFO程序?

时间:2018-02-11 03:28:40

标签: c buffer pool fifo

以下是完成FIFO缓冲池的一些程序。我不知道它是如何完成的。有人帮我分析一下吗?

这是FlameHandle的结构,此结构存储总火焰,第一帧和最后一帧。

typedef struct FlameHandle{
    PageFlame *first;
    PageFlame *last;
    PageFlame *totalFlames;
    int numWriteIO;
    int numReadIO;
} FlameHandle;

这是PageFlame的结构,此结构存储每个火焰的信息。

typedef struct PageFlame{
    char *data;
    PageNumber pageNum;
    bool isDirty;
    int fixCount;
    struct PageFlame *next;
    struct PageFlame *prev;
} PageFlame;

这是BM_BufferPool

的结构
typedef struct BM_BufferPool {
    char *pageFile;
    int numPages;   
    ReplacementStrategy strategy;
    void *mgmtData; // use this one to store the bookkeeping info your buffer
    // manager needs for a buffer pool
} BM_BufferPool;

这是BM_PageHandle

的结构
typedef struct BM_PageHandle {
    PageNumber pageNum;
    char *data;
} BM_PageHandle;

这是一个函数pinPage

RC pinPage(BM_BufferPool *const bm, BM_PageHandle *const page, const PageNumber pageNum)
{
    FlameHandle *FH;
    FH = bm->mgmtData;
    page->data = (char*)malloc(sizeof(char)*PAGE_SIZE);
    SM_FileHandle fh;
    PageFlame *pf;
    openPageFile(bm->pageFile,&fh);
    page->pageNum = pageNum;
    for(int i=0; i<bm->numPages;i++)
    {
        pf = &(FH->totalFlames)[i];
        if((FH->totalFlames[i]).pageNum == NO_PAGE)
        {
            FH->totalFlames[i].pageNum = pageNum;
            pf->fixCount++;
            ensureCapacity(pageNum+1,&fh);

            //Reads new flame from fh and stores it to (FH->first)->data).
            readBlock(pageNum,&fh,(FH->first)->data); 
            FH->numReadIO++;
            strcpy(page->data,(FH->first)->data);
            FH->last = FH->first;
            if(FH->last->next == NULL)
            {
                FH->first = FH->totalFlames;
            }
            else
            {
                (FH->first) = (FH->last)->next;
            }
            return RC_OK;
        }
    }
}

在此功能中,它需要在空火焰(pageNum == NO_PAGE)中存储新火焰,同时需要保留FIFO序列。我真的无法理解下面代码的语义:

if(FH->last->next == NULL){
    FH->first = FH->totalFlames;
}else
{
  (FH->first) = (FH->last)->next;
}

有人可以帮助我吗? 这是GitHub上整个项目的链接: https://github.com/randywhisper/assign_cs525/blob/master/assign2/buffer_mgr.c

1 个答案:

答案 0 :(得分:0)

请记住,您粘贴的代码是RS_FIFO

您可以使用笔运行代码。

initBufferPool功能中,您可以创建名为Doubly linked list的{​​{1}}。 PageFlame有N PageFlame

totalPageFlames的拳头指向PageFlametotalPageFlames[0]指向结束。

last先进先出。

假设您有FIFO(长度为4),例如PageFlame

这是您的代码段。

a,b,c,dFH->last = FH->firstlast->next,不是NULL,因此转到b。 这意味着,(FH->first) = (FH->last)->next;指向一段时间last指向b。

接下来,first指向b,而last指向c。

首先阅读

,然后first移至下一个first

我认为这很清楚。

当只有一个元素bdd->next时。 因此,首先将从最后一个元素NULL移到c。当下一个元素d进入队列时,首先会移至e并最后一次停留在e

d,先进先出。就是这样。