以下是完成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
答案 0 :(得分:0)
请记住,您粘贴的代码是RS_FIFO
。
您可以使用笔运行代码。
在initBufferPool
功能中,您可以创建名为Doubly linked list
的{{1}}。
PageFlame
有N PageFlame
。
totalPageFlames
的拳头指向PageFlame
,totalPageFlames[0]
指向结束。
last
先进先出。
假设您有FIFO
(长度为4),例如PageFlame
。
这是您的代码段。
a,b,c,d
,FH->last = FH->first
是last->next
,不是NULL,因此转到b
。
这意味着,(FH->first) = (FH->last)->next;
指向一段时间last
指向b。
接下来,first
指向b,而last
指向c。
,然后first
移至下一个first
。
我认为这很清楚。
当只有一个元素b
且d
为d->next
时。
因此,首先将从最后一个元素NULL
移到c
。当下一个元素d
进入队列时,首先会移至e
并最后一次停留在e
。
d
,先进先出。就是这样。