简单描述一下buffer cache管理的过程

| 4 Comments

我们先来看buffer header的具体结构:

buffer_header_struc_resize.jpg

 

接着,我们再来看跟buffer cache的管理有关的5LIST,这些LIST可以简单的认为就是存储了上述buffer header结构的双向指针链表(doubly linked lists),这5LIST分别是:

LRU LIST

Buffers containing block images being used

 

LRU AUXILIARY LIST

Buffers ready to be used for I/O or CR build,在实例启动的时候,当前实例的buffer cache中的所有buffer都会被链接到LRU AUXILIARY LIST中,当oracle要从datafile中读一个blockbuffer cache中来的时候,首先就会去扫描LRU AUXILIARY LIST,如果此时LRU AUXILIARY LIST非空,则直接把从datafile中读到的那个block拷到LRU AUXILIARY LIST上那个buffer header所链接的buffer cache block中,同时把这个buffer header再挪到LRU LIST中;如果此时LRU AUXILIARY LIST为空,则表明当前没有free block,此时就需要去扫描LRU LIST

 

WRITE LIST

Dirty Buffers requiring I/O,当LRU AUXILIARY LIST为空的时候,oracle需要去扫描LRU LIST,当扫到一个block,发现它的Flagdirty的时候,oracle会把这个block所对应的buffer headerLRU LIST移到WRITE LIST

 

CHECKPOINT QUEUE LIST

Dirty Buffers requiring I/O,当buffer cache中的block第一次变为dirty的时候,它首先一定会在LRU LIST中存在,并且其Flag会被标记为dirty。同时,oracle会把这个block添加到CHECKPOINT QUEUE LIST中。

 

WRITE AUXILIARY LIST

Dirty Buffers with I/O in progress,当DBWR需要写dirty block的时候,oracle会把那些dirty blockWRITE LIST移到WRITE AUXILIARY LIST,然后开始写。写完了,会把已经写完的dirty blockCHECKPOINT QUEUE LIST中删掉,同时把这些block再从WRITE AUXILIARY LIST移到LRU AUXILIARY LIST

 

简单总结一下,oraclebuffer cache管理最简单的流程就是

oracle首先会去LRU LIST中找,看看要找的block是否已经缓存在buffer cache中,找到了就直接用;找不到就再去LRU AUXILIARY LIST中找free block,如果找到了(即LRU AUXILIARY LIST非空),就去datafile中把要读的那个block拷到LRU AUXILIARY LIST上那个buffer header所链接的buffer cache block中,同时把这个buffer header再挪到LRU LIST中;如果找不到(即此时LRU AUXILIARY LIST为空),则表明当前没有free block,此时就需要去扫描LRU LIST,因为要找一个buffer headerreuse。此时,在扫描LRU LIST的过程中,当扫到一个buffer header,且发现它的Flagdirty的时候,oracle会把这个buffer headerLRU LIST移到WRITE LIST;当WRITE LIST达到一定的阀值,DBWR会写这些buffer header所指向的dirty block,当DBWR需要写dirty block的时候,oracle会把那些dirty block所对应的buffer headerWRITE LIST移到WRITE AUXILIARY LIST,然后开始写。写完了,会把已经写完的dirty block所对应的buffer headerCHECKPOINT QUEUE LIST中删掉,同时把这些dirty block所对应的buffer header再从WRITE AUXILIARY LIST移到LRU AUXILIARY LIST如此循环往复,生生不息!

4 Comments

上面的图是来自哪个文档?有没有相关的文档发给邮件阅读一下了?
谢谢了~

这个图来源于DSI405,DSI系列大家应该都有。

补充一下
写完了,会把已经写完的dirty block所对应的buffer header从CHECKPOINT QUEUE LIST中删掉,
然后ckp进程 会把还没写的dirty block list中 最旧的那一个 所对应的rba更新到control file header中

koko,你用BBED仔细研究过control file header的结构吗?oracle这里不会把rba写到control file header里的,oracle这里写的是control file checkpoint SCN

Leave a comment

Recent Comments

  • cui hua: koko,你用BBED仔细研究过control file header的结构吗?oracle这里不会把rba写到control file header里的,oracle这里写的是control file checkpoint SCN read more
  • koko: 补充一下 写完了,会把已经写完的dirty block所对应的buffer header从CHECKPOINT QUEUE LIST中删掉, 然后ckp进程 会把还没写的dirty block list中 read more
  • cui hua: 这个图来源于DSI405,DSI系列大家应该都有。 read more
  • 旭日东升: 上面的图是来自哪个文档?有没有相关的文档发给邮件阅读一下了? 谢谢了~ read more

About this Entry

This page contains a single entry by cui hua published on January 25, 2010 5:09 PM.

详细解析ASSM的Segment Header的结构 was the previous entry in this blog.

如何确定被多次truncate后的data object id is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.