首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何分析这个FIFO程序?

如何分析这个FIFO程序?
EN

Stack Overflow用户
提问于 2018-02-11 03:28:40
回答 1查看 90关注 0票数 1

下面是一些完成FIFO缓冲池的程序。我不知道它是怎么完成的。有人能帮我分析一下吗?

这是一个FlameHandle的结构,这个结构存储全部火焰,第一个框架和最后一个框架。

代码语言:javascript
复制
typedef struct FlameHandle{
    PageFlame *first;
    PageFlame *last;
    PageFlame *totalFlames;
    int numWriteIO;
    int numReadIO;
} FlameHandle;

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

代码语言:javascript
复制
typedef struct PageFlame{
    char *data;
    PageNumber pageNum;
    bool isDirty;
    int fixCount;
    struct PageFlame *next;
    struct PageFlame *prev;
} PageFlame;

这是BM_BufferPool的一个结构

代码语言:javascript
复制
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的一个结构

代码语言:javascript
复制
typedef struct BM_PageHandle {
    PageNumber pageNum;
    char *data;
} BM_PageHandle;

这是一个函数pinPage

代码语言:javascript
复制
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序列。我真的无法理解以下代码的语义:

代码语言:javascript
复制
if(FH->last->next == NULL){
    FH->first = FH->totalFlames;
}else
{
  (FH->first) = (FH->last)->next;
}

有人能帮我吗?

以下是GitHub:mgr.c上整个项目的链接

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-11 07:58:07

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

您可以使用您的笔运行代码。

initBufferPool函数中,创建一个名为PageFlameDoubly linked listPageFlame有N个totalPageFlames

PageFlame的第一拳指向totalPageFlames[0]last指向终点。

FIFO排在第一位。

假设您有一个PageFlame(长度4),类似于a,b,c,d

这是你的代码片段。

FH->last = FH->firstlast->nextb,不是NULL,所以是(FH->first) = (FH->last)->next;。这意味着,last指向a而first指向b。

下一次运行时,last指向b,而first指向c。

首先读取A,然后first移动到下一个b

我觉得这很清楚。

当只有一个元素dd->nextNULL时。因此,首先将从最后一个out元素c移到d。当下一个元素e进入队列时,首先将移动到e,最后在d中停留。

RS_FIFO,先到先出。就是这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48728003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档