下面是一些完成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:mgr.c上整个项目的链接
发布于 2018-02-11 07:58:07
请记住,您粘贴的代码是RS_FIFO。
您可以使用您的笔运行代码。
在initBufferPool函数中,创建一个名为PageFlame的Doubly linked list。PageFlame有N个totalPageFlames。
PageFlame的第一拳指向totalPageFlames[0],last指向终点。
FIFO排在第一位。
假设您有一个PageFlame(长度4),类似于a,b,c,d。
这是你的代码片段。
FH->last = FH->first,last->next是b,不是NULL,所以是(FH->first) = (FH->last)->next;。这意味着,last指向a而first指向b。
下一次运行时,last指向b,而first指向c。
首先读取A,然后first移动到下一个b。
我觉得这很清楚。
当只有一个元素d和d->next是NULL时。因此,首先将从最后一个out元素c移到d。当下一个元素e进入队列时,首先将移动到e,最后在d中停留。
RS_FIFO,先到先出。就是这样。
https://stackoverflow.com/questions/48728003
复制相似问题