Chinaunix首页 | 论坛 | 博客
  • 博客访问: 771437
  • 博文数量: 185
  • 博客积分: 7434
  • 博客等级: 少将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-29 14:01
文章分类

全部博文(185)

文章存档

2013年(1)

2012年(2)

2011年(17)

2010年(25)

2009年(36)

2008年(104)

分类: Oracle

2010-02-08 09:18:18

简述buffer cache管理的过程

我们先来看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如此循环往复,生生不息!

阅读(1326) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~