专题实验 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的指针.

image

个人感觉: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 版本和可滚段构造前镜像返回给用户.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值