第
第
6
6
章
章
Buffer Cache
Buffer Cache
与
与
Shared Pool
Shared Pool
原
原
理
理
Buffer Cache 与 Shared Pool 是 SGA 中的最重要和最复杂的两个部分,在此我们拿出一点
篇幅来对 Buffer Cache 和 Shared Pool 进行一点深入探讨。
6.1 Buffer Cache 原理
Buffer Cache 是 Oracle SGA 中一个重要部分,通常的数据访问和修改都需要通过 Buffer
Cache 来完成。当一个进程需要访问数据时,首先需要确定数据在内存中是否存在,如果数
据在 Buffer 中存在,则需要根据数据的状态来判断是否可以直接访问还是需要构造一致性
读取;如果数据在 Buffer 中不存在,则需要在 Buffer Cache 中寻找足够的空间以装载需要的
数据,如果 Buffer Cache 中找不到足够的内存空间,则需要触发 DBWR 去写出脏数据,释
放 Buffer 空间。
这样一个过程,描述起来并不复杂,但是在数据库的处理过程中实际上是相当复杂的。
在以上的描述中,有几个问题是我们需要考虑的,首先,Oracle 如何才能快速定位到 Buffer
中是否存在需要的数据呢?如果请求的数据在 Cache 中不存在,那么 Oracle 又是如何去
Buffer Cache 中快速寻找内存空间呢?
6.1.1 LRU 与 LRUW List
我们知道,在 Buffer Cache 中,Oracle 通过几个链表进行内存管理,其中最为熟知的是
LRU List 和 LRUW List(也经常被称为 Write/Dirty List),各种 List 上存放的是指向具体的
Buffer 的指针等信息。
从 Oracle8 开始,为了实施增量检查点,Oracle 还引入了检查点队列- Checkpoint Queue
和文件队列 – File Queue;从 Oracle8i 开始,由于异步 DBWn 的引入,现在关于各种 List
以及 Queue 的更为精确的概念是工作集(WS - Working Sets), 在 每 个 WS 中包含几个不同
功能的 List,每 个 List 都通过 Cache Buffers LRU CHAIN Latch 进行保护,当 使 用 多 个 DBWR
进程时(通过 DB_WRITER_PROCESSES 参数可以设置数据库使用多个 DBWR 进程),数
据库中会存在多个 WS,同时当使用 Buffer Cache 的多缓冲池技术时,每个独立的缓冲池也
会存在各自独立的 WS。
LRU List 用于维护内存中的 Buffer,按照 LRU 算法进行管理(在不同版本中,管理方
式有所不同),数据库初始化时,所有的 Buffer 都被 Hash 到 LRU List 上管理。当需要从数
据文件上读取数据时,首先要在 LRU List 上寻找 Free 的 Buffer,然 后 读 取 数 据 到 Buffer Cache
评论