什么是CBC latch和buffer pin

68次阅读
没有评论

共计 2092 个字符,预计需要花费 6 分钟才能阅读完成。

本篇内容介绍了“什么是 CBC latch 和 buffer pin”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

CBC 全称 cache buffer chain。要了解 CBClatch 和 buffer pin 之前,首先我们要了解的是当一个进程想要查询或者修改数据时,oracle 都做了一些什么工作。

当一外部服务向数据库申请数据的时候,oracle 内部进程首先在 buffer cache 中寻找相关数据,如果 buffer cache 中没有相关数据时,就要从相对应的数据文件中找到相对的 block,随后发生物理 IO,将其写入 buffer cache 中的 cache 中。这时候,就会出现一个新的问题?buffer cache 中有那么多 buffer,oracle 怎么才能准确的找到自己需要 buffer 呢?

hash 算法中有个重要的概念 bucket,例如 oracle 想要读取 1 号文件第 23 块数据的时候,它将根据文件号和块号计算出 hash 值为 x,然后根据 hash 值 x 直接定位到 bucketx,然后 oracle 便可以读取该 bucket 的内容。为了避免 hash 冲突,这个 bucket 后面一定是一个链表,所以在 bucket 中存在的一定是 cbc 链表头。当进程根据文件号和块号找到 bucketx 后,进行遍历,在每个 bh 中寻到 ba,然后就可以准确的找到相对的 buffer 了。

了解以上的知识后,当一个进程访问 buffer 时,由于 sga 是公共内存,所以一定要有锁机制对 sga 进行保护。上述进程对 BH,Bucket 访问时,就会有相对应的锁进行保护,这个 latch 就是 CBC latch。当甲进程找到了 bucketx 后,甲进程必须申请 latch,才可以获得对于 BH 的访问权。由于 latch 也是占用空间的,所以每个 latch 管理多个 bucket,并不是简单的 1 对 1 的关系。

当甲进程获得了这个 latch 之后,它就可以对 BH 进行访问或者修改,当对 BH 进行修改时,此时会在 BH 中加上一道 buffer pin 的锁。buffer pin 常用的状态有两种:共享 S 和独占 X,简单来说,当你进行逻辑读时状态便是 S,进行 DML 操作时,便是 X 状态。当无人访问的时候,buffer pin 默认的状态是 0,当该状态被修改时,CBC latch 的使命便达成了。甲进程这个时候就可以释放掉该 CBC latch,转而由 buffer pin 锁陪同进行下一步的操作。当甲进程对 buffer 操作完成之后,在释放该 buffer pin 时,这个时候 CBC latch 会陪同甲进程走完最后的行程。

我们要了解 CBC latch 的两种模式,一种独占模式一种共享模式。因为 CBC latch 保护的是 BH 和链表。如果没有对相关的 BH 和链表进行修改,便可以以共享模式申请 CBC latch。如果对 BH 中的 buffer pin 状态进行修改的话,便会使用独占模式。在修改好相关状态时,便会将 CBC latch 释放

以上都是基于 CBC latch 处于独占模式,但是当乙进程也要访问该 latch 负责的 bucket 时,便会进行排队。这样就会造成大量的竞争。

当 CBC latch 处于共享模式的时候,该 latch 便会一直陪甲进程直到释放 buffer pin 后,自己才会释放。这样便是增加了 latch 加载时间来解决大量竞争的问题。

对于 buffer pin 来说。我们都知道读会获得共享的 bufferpin 锁,写会获得独占的 buffer pin 锁。对于 buffer pin 锁的阻塞来说。只要有独占锁的时候,便会出现堵塞。

例如

写写:甲进程获得了独占 buffer pin 锁,乙进程此时也想进行写操作,这时候只能等待甲进程释放

写读:甲进程获得了独占 buffer pin 锁,乙进程此时想进行读操作,这时候需要等待甲进程释放锁

先讨论一下共享状态下的 BH:

甲进程在 CBClatch 的陪同下,将 BH 中的 buffer pin 状态修改成了 S 状态。此时乙进程也在 latch 的陪同下,也想访问该 BH,但是发现它的状态是 S 共享。乙进程会在该 BH 中留下一个 S 状态的 buffer pin

,在该 buffer pin 状态下,将 buffer 复制到另一个 buffer 中,同时生成一个新的 BH 指向该 buffer,完成后释放 CBC latch。此时 buffer 中多出来一个相同的 buffer,但是原 buffer 的 BH 中会多出一个 status=XCUR 列。克隆出的 BH status 是没有值的。此时乙进程再次获得 latch,将原 BH 的 status 改为 CR,也就是 CR 块;新克隆的 status 便为 XCUR,将 buffer pin 设置为 X 独占,开始修改 buffer。所以这就是读不会堵塞写的原因。

如果此时又有一个丙进程想要读该 buffer,但是 buffer pin 是状态是 x,所以丙进程只能等待,也就是常见的 buffer busy waits。

“什么是 CBC latch 和 buffer pin”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-26发表,共计2092字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)