首页 > Oracle > Oracle buffer cache理解之六——LRUW链表结构概述!
2014
01-12

Oracle buffer cache理解之六——LRUW链表结构概述!

在前面的文章中介绍了LRU链表的管理以及数据块在链表中是如何插入到内存中的,这篇文章我们来了解一下LRUW链表的管理,在介绍LRU链表的时候,只说明了查询的情况,如果一个数据块在内存中被修改了,那这个修改过程以及替换过程又是怎样处理的?接下来看一下LRUW链表结构。

LRUW链表表示脏数据块链表,只要是LRUW链表上的buffer header指向的都是已经从LRU链表上摘下来的,对应的内容就是内存数据块里的内容已经被修改,但是还没有写入磁盘数据文件的内存数据块,如果要重用这些脏数据块的话,必须要确保这些数据块已经写入到磁盘,此过程又DBWR进程操作。LRUW链表和LRU链表一样,都包含两个子链表:辅助LRUW链表和主LRUW链表,下面我们来看一下数据块是如何插入到LRUW链表上的:接着上一遍文章的例子,比如有用户发出一个DML语句,修改记录,假设此时这个数据块已在辅助LRU链表的BH2位置上:

1) oracle会将BH2从辅助LRU链表上摘下,同时插入主LRU链表的中间,也就是插入BH1和BH4中间,同时增加BH2的touch的数量。

2) 将该BH2的标记设置为钉住(ping)。

3) 更新BH2对应的内存数据块的内容。

4) 更新完以后,取消钉住的标记。

5) 将BH2从主LRU链表转移到主LRUW链表上。

6) 如果这个时候又有进程发出更新BH2所对应的内存数据块的内容,则BH2再次被钉住,更新,取消钉住。

7) DBWR启动以后,在扫描主LRUW链表时会将BH2转移到辅助LRUW链表上。

8) DBWR将辅助LRUW链表上的BH2对应的数据块写入数据文件。

9) 确认成功写入数据文件以后,将BH2从辅助LRUW链表上转移到辅助LRU链表上。

通过如上所述,主LRUW链表上包含的buffer header要么是已经更新完的数据块,要么就是被钉住正在更新的数据块,当DBWR写进程启动后,主LRUW链表就会被扫描,但是不会扫描正在被钉住更新的块,并将已经更新完了的buffer header从主LRUW链表上摘除,转移到辅助LRUW链表上去。当扫描到一定程度,一般是扫描完了整个主LRUW链表,或者扫描的buffer header的个数达到了一定限度,DBWR就会转移到辅助LRUW链表上,将上面的buffer header所对应的数据开写入到数据文件中。所以,对于辅助LRUW链表上的buffer header,要么是正在等待写入的,要么就是已经发出写入请求,正在写入还没写完的。此外这里还有一点需要注意,buffer header进入LRUW链表时,是从尾端进入的,而DBWR扫描LRUW链表时,是从首端开始扫描的。

这里oracle把链表分为主链表和辅助链表,为了就是提高DBWR的扫描效率。这里简单提到了DBWR写进程,以后再对这个进程作简单的介绍。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL