首页 > 数据库 >Oracle为什么写阻塞读导致Buffer Busy Waits

Oracle为什么写阻塞读导致Buffer Busy Waits

时间:2023-09-07 17:13:43浏览次数:38  
标签:Busy Waits Buffer 阻塞 buffer BP CR copy

 

Oracle为什么写阻塞读导致Buffer Busy Waits

 

这之前需要了解在内存中定位并读取一个buffer的流程,先看看为什么读不阻塞写。

 

读不阻塞写:

假设会话s1在读取db buffer cache中读取需要的buffer过程中,会获取CBC Latch后查找定位buffer后,以共享S模式获取BH(Buffer Header)的Buffer Pin(以下简称BP锁)。

此时,如果会话s2需要修改同样的buffer的话,在发现BH上S模式的BP锁后,由于S模式的BP锁是互相兼容的,于是s2在BH上同样留下一个S模式的BP锁,然后在共享S模式BP锁下通过BH访问实际buffer后,将buffer直接copy一个新的buffer出来。

而原来的buffer变为CR块,新的buffer则是XCUR状态,s2则在新的buffer上进行写操作,避免了Buffer Busy Waits的争用。因为s1是在读取,这个场景下的copy就是安全的。

 

写阻塞读:

那么反过来,如果s1会buffer的BH以独占的X模式进行写操作,此时s2想要读这个buffer的BH加S模式的BP锁,但是发现了已经有X模式的SP锁了,由于S和X模式互不兼容,那么s2进程进入等待,等待事件就是Buffer Busy Waits。

 

几年前看吕海波的《Oracle内核技术揭秘》的时候,在读到Buffer Busy Waits产生原理的时候,曾经有过这样的疑问:

1.为什么不构造新的CR块

2.为什么不去读已有的CR块

对于第一个问题,前边说过读不阻塞写的时候因为s1是在读取那么copy就是安全的。反过来写阻塞读,s1是在修改,你无法判断buffer是否已经被修改那么copy则不安全。

当然你也可以想,无非就修改和未修改两种状态,Oracle可不可以做个判断,

        如果是未修改那么和读不阻塞写一样你直接copy就行,

        如果是已经修改了那么也copy一样的buffer然后将copy后的buffer做CR还原。

其实有点想当然了,首先想要实现能不能判断是否修改这个操作需要花费的消耗就不好预估,因为修改过程就可以分成好几个步骤(比如涉及undo和redo等),这几个步骤完成算修改完那么其实BP锁都释放了也有可能。总不能是其中某个步骤吧?

其次所谓的CR还原是需要undo中的修改前的数据的,进行CR还原还要读取undo块消耗更大。

更何况既然s1的X模式BP锁没释放说明写操作正在进行,undo数据是否生成可用还不好说。

因此,修改状态下X模式的BP锁写copy是不安全的。

https://www.cnblogs.com/PiscesCanon/p/17685492.html

 

而第二个问题,那么更不现实。CR块是有版本的,哪个会话构造的CR块就哪个会话用。

假设某个被block修改很频繁,t1,t2,t3,t4,t5时刻的值各不相同。

所谓的CR块即可能是t1时刻的映像,也可能是t4时刻的,也可能同时存在同个block块的多个CR块,你用哪个CR?该进行怎样的判断?想想就特别麻烦且不可靠。

因此CR块是不共享的。

防偷防爬。

标签:Busy,Waits,Buffer,阻塞,buffer,BP,CR,copy
From: https://www.cnblogs.com/PiscesCanon/p/17685492.html

相关文章

  • buffer pool如何管理page页
    要了解bufferpool如何管理page页,首先要了解page页的分类Page页的分类page页根据状态可以分为三种类型,如下图:freepage:空闲page,未被使用过cleanpage:被使用page,数据没有被修改过dirtypage:脏页,被使用的page,数据被修改过。数据和磁盘数据不一致Page页如何管理针对三种不同......
  • MySql中 BufferPool 的基本概念介绍
    MySQL的BufferPool是MySQL数据库引擎用来缓存数据页(页是磁盘上的一块固定大小的数据单元)的内存区域。BufferPool在MySQL服务器启动时被初始化,然后在整个数据库生命周期中用于高效地管理数据库页的读取和写入。BufferPool是MySQL性能的关键组成部分之一,因为它可以显著减少与磁盘I......
  • 如果您在集成H.265视频流媒体播放器EasyPlayer.js时遇到了"SourceBuffer"报错,您可以采
    EasyPlayer是由青犀视频公司推出的一款功能强大且高度开放的H.265视频流媒体播放器。它支持播放H.264和H.265视频格式,具有出色的稳定性和流畅的播放效果。此外,EasyPlayer还提供多个版本供用户选择,包括EasyPlayer-RTSP、EasyPlayer-Pro和EasyPlayer.js等版本。每个版本都具有自己的......
  • 20230626 java.nio.CharBuffer
    介绍java.nio.CharBufferpublicabstractclassCharBufferextendsBufferimplementsComparable,Appendable,CharSequence,Readablechar缓冲区,内部是char[]APIstaticallocate分配wrap包裹publicgetputcompact压缩将缓冲区当前位置(position)与......
  • 20230626 java.nio.ByteBuffer
    介绍java.nio.ByteBufferpublicabstractclassByteBufferextendsBufferimplementsComparable最常用的Buffer子类APIstaticallocateDirect直接使用本地内存,而不是通过JVM堆空间allocatewrappublicgetputcompact压缩将缓冲区当前位置(positi......
  • 20230621 java.nio.Buffer
    介绍java.nio.BufferpublicabstractclassBuffer缓冲区都具有mark,可选的标记,用于重复一个读入或写出操作,默认-1position,读写位置,下一个值将在此进行读写,默认0limit,界限,超过它进行读写是没有意义的capacity,容量,它永远不能改变这些值满足下面的条件:0<=......
  • 【muduo】TCP分包和Buffer类的设计
    文章目录一、TCP分包问题1、长连接和短连接2、长连接和短连接的分包方法3、长连接和短连接的应用场景二、TCP粘包问题三、Buffer类的设计与使用1、为什么需要应用层buffer?2、如何设计并使用应用层Buffer?3、Buffer类的设计一、TCP分包问题在TCP这种字节流协议上做应用层分包是网络......
  • Linux 中的内存(cache,buffer,)
    在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。内存查看当我们使用free-h命令时,会显示如下的信息t......
  • 在集成H.265视频流媒体播放器EasyPlayer.js时遇到"SourceBuffer"报错,应该如何解决?
    EasyPlayer,是由TSINGSEE青犀视频推出的一款功能强大且开放性很高的H.265视频流媒体播放器。它支持H.264和H.265视频格式的播放,并具有稳定性强、流畅播放等特点。此外,EasyPlayer还有多个版本可供选择,例如EasyPlayer-RTSP、EasyPlayer-Pro、EasyPlayer.js等。有用户反馈,在使用播放器......
  • 20230622 java.io.BufferedOutputStream
    介绍java.io.BufferedOutputStreampublicclassBufferedOutputStreamextendsFilterOutputStreamwrite方法写入的字节先存入内部的bytebuf[],填满后再写入文件API构造器BufferedOutputStream(OutputStreamout)BufferedOutputStream(OutputStreamout,intsize)......