首页 > 代码库 > 专题实验 Buffer Cache 未完
专题实验 Buffer Cache 未完
Buffer Cache 原理
当一个进程需要访问数据时, 首先需要确定数据在内存中是否存在, 如果数据在Buffer中存在, 则需要根据数据的状态来判断是否可以直接访问还是需要构造一致性读取; 如果数据不在Buffer中, 则需要再Buffer Cache中寻找足够的空间来装载需要的数据, 如果Buffer Cache中找不到足够的内存空间, 则需要触发DBWR去写脏数据, 释放Buffer空间.
LRU 与 Dirty List
在 Buffer Cache中, oracle 通过几个链表进行内存管理, 其中最为熟知的是 LRU List 和 Dirty List(也叫Checkpoint queue), 各种List上存放的是指向具体Buffer的指针.
个人感觉:LRU List 和 整个buffer cache 是一一对应关系. Checkpoint Queue 和 Buffer cache中的脏数据一一对应.
1) 当一个server进程需要读数据到 Buffer Cache中时, 首先必须判断该数据在 Buffer 中是否存在, 如果存在且可用, 则获取该数据, 根据LRU算法在LRU List 上移动该 Block; 如果Buffer中不存在该数据, 则需要从数据文件上读取.
2) 在读取数据文件之前, server 进程需要扫描 LRU List 寻找 Free 的 Buffer, 扫描过程中 server 进程会把发现的所有已经被修改过的 Buffer 移动到 Checkpoint Queue上, 这些 Dirty Buffer 随后可以被写到数据文件.
3) 如果 Checkpoint Queue 超过了一个值, server 进程就会通知 DBWn 去写出脏数据, 这也是出发DBWn 写的一个条件, 这个值曾经提到是25%, 如果 server 进程扫描LRU超过一个值(40%)仍然不能找到足够的FreeBuffer, 将停止寻找, 转而通知DBWn 去写脏数据, 释放内存.
4) 找到足够的 Buffer 之后, server 进程就可以将 Buffer 从数据文件读入 Buffer Cache.
5) 如果读取的 Block 不满足读一致性要求, 则 server 进程需要通过当前 Block 版本和可滚段构造前镜像返回给用户.