checkpoint queue 和 write list

原创 2004年08月01日 15:04:00

在oracle中存在 dirty list(也就是write list)的说法,但是同时又有checkpoint queue 。这两个东西往往让人容易混淆。他们是同一个东西吗?之间关系如何?

在阐述之前,我们先来看一段大师的描述

http://www.ixora.com.au/q+a/0103/07160329.htm

That information is not quite right. It is more accurate to say that there are 10 lists, because there are 5 types of buffers and there is a MAIN and AUXILIARY list for each type. Also, there is no separate hot list. The hot list is a sublist of the main replacement list. Of course, there are separate lists for each working set (LRU latch set) of buffers.

You can see all these structures in BUFFERS dumps. Here is an extract ...

(WS) size: 10000 wsid: 1 state: 0 (WS_REPL_LIST) main_prev: 32aefbc main_next: 32ae51c aux_prev: 32c94a0 aux_next: 32c94a0 curnum: 10000 auxnum: 0 cold: 32a307c hbmax: 5000 hbufs: 5000 (WS_WRITE_LIST) main_prev: 32c94b4 main_next: 32c94b4 aux_prev: 32c94bc aux_next: 32c94bc curnum: 0 auxnum: 0 (WS_PING_LIST) main_prev: 32c94d0 main_next: 32c94d0 aux_prev: 32c94d8 aux_next: 32c94d8 curnum: 0 auxnum: 0 (WS_XOBJ_LIST) main_prev: 32c94ec main_next: 32c94ec aux_prev: 32c94f4 aux_next: 32c94f4 curnum: 0 auxnum: 0 (WS_XRNG_LIST) main_prev: 32c9508 main_next: 32c9508 aux_prev: 32c9510 aux_next: 32c9510 curnum: 0 auxnum: 0


Other than the replacement lists, the other lists are for different types of write buffers. From the bottom up they are buffers that have to be written for a checkpoint range call, a checkpoint object call, a ping, or merely because they are dirty. In each case the main list holds buffers which have yet to be written, and the auxiliary list holds buffers for which a write is pending. The auxiliary replacement list holds unpinned buffers for which a write has been completed, and any other buffers that are immediately reusable. The main replacement list is what is commonly called the LRU list. The operation of the LRU list was explained under the heading The 8i buffer cache in the October issue of Ixora News. You may also be interested in the section on DBWn's new tricks in the September issue.

These 10 lists are mutually exclusive. Each buffer can only be on one of the lists at a time. For completeness it should also be mentioned that dirty buffers are also on a thread checkpoint queue and a file checkpoint queue. These queues are maintained in first modification (low RBA) order and are used to optimize checkpoint processing.

也就是说,在oracle 8 中,buffer cache 中实际存在着5大类lists,加辅助的lists共10小类。其中的4大类(8小类lists)统称write list。他们记录了dirty buffer 的各种状态信息。而通常的LRU list 只有一个大类,实际共两小类lists。也就是 replacement lists 。实际上,在9i开始版本,lists又有所增加,大致是12小类lists,这里就不过多的阐述了。(注意这里都说的是类而不是条数,因为条数实际上和 db_block_lru_latches参数有关,9i中这是隐藏参数)

在4大类的write lists 中,记录了buffer的状态(they are buffers that have to be written for a checkpoint range call, a checkpoint object call, a ping, or merely because they are dirty) 。由于write lists 中的buffer 的状态可能是转换的,也是没有时间顺序的,也就是说,如果按照这个lists写buffer到磁盘,其顺序和buffer变化发生的时间顺序并不是一致的。这也直接造成在oracle 8以前版本中,检查点都是 完全刷新 dirty buffer 的,也就是说检查点发生的时候,所有dirty buffer都要被写入磁盘,而且这个时候是不能有dirty buffer产生的,否则oracle将无法知道是否将所有的检查点时刻之前的dirty buffer 都写入了磁盘。

从oracle 8开始,出现了checkpoint queue 。checkpoint queue 是按照buffer的 low RBA 排序的,也就是说按照buffer 第一次发生变化的时候的时间点排序的。同一个dirty buffer ,既存在与 write lists中(记录着buffer的状态)又存在于checkpoint queue 中,记录着buffer 第一次发生变化的时间顺序。这样dbwr根据checkpoint queue中顺序写出dirty buffer 就一定能保证是按照 buffer 首次发生变化的时间顺序写到磁盘的。这样的一个机制,就支持了oracle的增量检查点的功能的实现。也就是说,当增量检查点发生的时候,只确定写的buffer的结束时间点,在这个检查点过程中,可以继续产生dirty buffer,dbwr也不是一次要把 所有dirty buffer 全部写到磁盘。这样大大地提高了检查点的效率。

实际上,checkpoint queue 与 write list 的配合,更是可以在实现增量检查点的同时模拟异步IO。这个问题就留待以后进行讨论了。

 

关于checkpoint的更多的内容,请参考

http://blog.csdn.net/biti_rainy/archive/2004/07/12/learn_oracle_20040712_1.aspx


 

第十八讲--检查点队列(checkpoint queue)

Buffer cache的左边是buffer右边是链,用来记录buffer。 链的类型有LRU、LRUW。LRU是将干净可用的块串起来,将来从buffer cache找可用块的时候就从LRU链中找。...
  • chengonghao
  • chengonghao
  • 2016年03月22日 12:03
  • 811

vector,map,list,queue的区别详细解析

1。vector  (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,...
  • litter_star
  • litter_star
  • 2016年09月03日 15:26
  • 874

STL中queue,list,vector频繁访问效率

针对STL中的queue,list,vector频繁访问,即插入(尾部)与取出(头部)操作时的效率进行了对比,从时间消耗上来看,queue最少,list与vector消耗相对较大,二者之间差别不大。附...
  • dydm_13128
  • dydm_13128
  • 2014年03月16日 14:50
  • 1989

C++9.5 vector/list/queue容器的区别与选用

简介==================================================================================================...
  • hlsdbd1990
  • hlsdbd1990
  • 2015年06月08日 14:45
  • 1099

将list集合进行切割 转换为队列进行处理

将一段list集合的数据进行切割,分段进行处理 public static void main(String[] args) { final LinkedBlockingQueue testQu...
  • u010256177
  • u010256177
  • 2015年10月22日 09:08
  • 1440

【Java】容器类学习之路(二)Collection详解:List、Set和Queue

先简单看一下Colleciton的结构: 1.List 特点: 按照插入的顺序保存元素,List接口在Collection的基础上添加了大量方法使得程序员可以在List中间插入和移除元素。 类别:...
  • u014255299
  • u014255299
  • 2016年03月12日 17:14
  • 457

Map、Set、List、Queue、Stack的特点与用法1

1. Java集合类基本概念 在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量。一旦在数组初始化时指定了这个数组...
  • u011860731
  • u011860731
  • 2015年09月24日 20:14
  • 4802

Java集合体系总结—Map、Set、List、Queue

首先上来一张自己画的图,主要根据《疯狂Java讲义》一书中的两个图整合而来。主要讲解重要的集合及其特点。 0x01 Collection 接口 Collection接口比较宽泛,该集合就是单一对象...
  • csp277
  • csp277
  • 2015年06月11日 22:09
  • 1124

深入理解容器系列之三--------LinkedList、Stack、Queue、PriorityQueue的总结

1、这几种容器的特点 都是按照顺序来存储元素。取元素的时候的不同点: LinkedList:按照下标随意取元素Stack:后进先出取元素Queue:先进先出取元素PriorityQue...
  • E01014165
  • E01014165
  • 2016年05月15日 13:33
  • 699

JAVA Map、Set、List、Queue、Stack的特点与用法

https://github.com/helen-x/AndroidInterview/blob/master/java/%5BJava%5D%20Map%E3%80%81Set%E3%80%81Li...
  • YaphetZhao
  • YaphetZhao
  • 2017年03月23日 20:53
  • 436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:checkpoint queue 和 write list
举报原因:
原因补充:

(最多只允许输入30个字)