1.串行化 概述 
数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库, 多个用户同时在相同的物理位置上写数据时,不能发生互相覆盖的情况,这叫做串行化,串行化会降低系统的并发性,但这对于保护数据结构不被破坏来说则是必需的。在Oracle数据库中,通过闩锁(latch)和锁定(lock)来解决这两个问题。
闩锁和锁定既有相同点又有不同点。相同点在于它们都是用于实现串行化的资源。而不同点则在于闩锁(Latch)是一个低级别、轻量级的锁,获得和释放的速度很快,以类似于信号灯的方式实现。而锁定(Lock)则可能持续的时间很长,通过使用队列,按照先进先出的方式实现。也可以简单地理解为闩锁是微观领域的,而锁定则是宏观领域的。
注意 :latch是用于保护SGA区中共享数据结构的一种串行化锁定机制。它不仅仅用于buffer cache, 还用于shared pool以及log buffer等。

2.Latch 概述

Oracle数据库使用闩锁(latch)来管理SGA内存的分配和释放.Latch是用于保护SGA区中共享数据结构的一种串行化锁定机制。Latch的实现是与操作系统相关的,尤其和一个进程是否需要等待一个latch、需要等待多长时间有关。
Latch是一种能够极快地被获取和释放的锁,它通常用于保护描述buffer cache中block的数据结构。

3.SPIN与休眠

(1).SPIN 

spin 就是一个进程独占cpu time,直到运行的结束。这个期间其他进程不能获得这个cpu的运行时间。对于单CPU来说没有spin概念。
比如数据缓存中的某个块要被读取,我们会获得这个块的 latch,这个过程叫做spin,另外一个进程恰好要修改这个块,他也要spin这个块,此时他必须等待,当前一个进程释放latch后才能spin住,然后修改,如果多个进程同时请求的话,他们之间将出现竞争,没有一个入队机制,一旦前面进程释放所定,后面的进程就蜂拥而上,没有先来后到的概念,并且这一切都发生的非常快,因为Latch的特点是快而短暂。

(2).休眠
休眠意味着暂时的放弃CPU,进行上下文切换(context switch),这样CPU要保存当前进程运行时的一些状态信息,比如堆栈,信号量等数据结构,然后引入后续进程的状态信息,处理完后再切换回原来的进程状态,这个过程如果频繁的发生在一个高事务,高并发进程的处理系统里面,将是个很昂贵的资源消耗,所以Oracle选择了spin,让进程继续占有CPU,运行一些空指令,之后继续请求,继续spin,直到达到_spin_count值,这时会放弃CPU,进行短暂的休眠,再继续刚才的动作。初始状态下,一个进程会睡眠0.01秒。然后醒过来,并再次尝试获得latch。 进程一旦进入睡眠状态,则会抛出一个对应的等待事件,并记录在视图v$session_wait里,说明当前该进程正在等待的latch的类型等信息。

4. Latch 的种类

(1).Willing-To-Wait

任何时候,只有一个进程可以访问内存中的某一个数据块,如果进程因为别的进程正占用块而无法获得Latch时,他会对CPU进行一次spin(旋转),时间非常的短暂,spin过后继续获取,不成功仍然spin,直到spin次数到达阀值限制(这个由隐含参数_spin_count指定),此时进程会停止spin,进行短期的休眠,休眠过后会继续刚才的动作,直到获取块上的Latch为止。

(以下字段反映了 Willing-to-wait 类型请求)
GETS:成功地以 Willing-to-wait 请求类型请求一个 latch 的次数。
MISSES:初始以 Willing-to-wait 请求类型请求一个 latch 不成功的次数。

SLEEPS:初始以 Willing-to-wait 请求类型请求一个 latch 不成功后,进程等待获取 latch的次数。

(2).Immediate

这种类型的latch比较少,对于这种类型的latch来说,都会有很多个可用的latch。当一个进程请求其中的一个latch时,会以no-wait模式开始请求。如果所请求的latch不可用,则进程不会等待,而是立刻请求另外一个latch。只有当所有的latch都不能获得时,才会进入等待。

(以下字段反映了 Immediate 类型请求)
IMMEDIATE_GETS:以 Immediate 请求类型成功地获得一个 latch 的次数。

IMMEDIATE_MISSES:以 Immediate 请求类型请求一个 latch 不成功的次数。

5.Latch 获取过程

6.Latch 和 Lock的区别

- Latch 的访问,包括查询也是互斥的,任何时候,只能有一个进程能pin住内存的某一块

- latch只作用于内存,只能被当前实例访问,而Lock作用于数据库对象

- Latch是瞬间的占用,释放,Lock的释放需要等到事务正确的结束,他占用的时间长短由事务大小决定

- Latch是非入队的,而Lock是入队的
- Latch不存在死锁,而Lock中存在。

7. Latch的cleanup

因异常而长时间不能释放latch的session,pmon每隔3秒会进行清理。

8. Latch的级别

分为0~14 级别 , 当进程占用一个latch时,只能再请求比它级别高的latch,如果要请求低级别的latch,则需要释放当前latch。

9. Latch的资源争用

(1).SQL语句

如果没有使用绑定变量,很容易造成频繁读写shared pool里的内存块,如果存在大量的SQL被反复分析,就会造成很大的Latch争用和长时间的等待, 从而导致与解析SQL相关的共享池中的Latch争用 。与 shared pool共享池相关的latch有Library Cache Latch 和Shared Pool Latch。如果数据库出现了上述latch的争用,则有必要检查下是否有正确使用绑定变量

(2).cache buffer chain

当一个会话需要去访问一个内存块时,它首先要去一个像链表一样的结构中去搜索这个数据块是否在内存中,当会话访问这个链表的时候需要获得一个Latch,如果获取失败,将会产生Latch cache buffer chain 等待,导致这个等待的原因是访问相同的数据块的会话太多或者这个列表太长(如果读到内存中的数据太多,需要管理数据块的hash列表就会很长,这样会话扫描列表的时间就会增加,持有chache buffer chain latch的时间就会变长,其他会话获得这个Latch的机会就会降低,等待就会增加)。

(3).Buffer busy waits

当一个会话需要访问一个数据块,而这个数据块正在被另一个用户从磁盘读取到内存中或者这个数据块正在被另一个会话修改时,当前的会话就需要等待,就会产生一个buffer busy waits等待。
产生这些Latch争用的直接原因是太多的会话去访问相同的数据块导致热快问题,造成热快的原因可能是数据库设置导致或者重复执行的SQL 频繁访问一些相同的数据块导致。热块产生的原因不尽相同,按照数据块的类型,可以分成以下几种热块类型,不同热块类型处理的方式都是不同的:表数据块、索引数据块、索引根数据块和文件头数据块。

latch 深入理解(转载)相关推荐

  1. 对Lucene PhraseQuery的slop的理解[转载]

    所谓PhraseQuery,就是通过短语来检索,比如我想查"big car"这个短语,那么如果待匹配的document的指定项里包含了"big car"这个短语 ...

  2. 卷积神经网络VGG16权重数量的计算和理解(转载)

    VGG16网络结构是: _________________________________________________________________ Layer (type)           ...

  3. 对于超平面的理解[转载]

    转自:https://blog.csdn.net/dengheCSDN/article/details/77313758 1.引言 n 维空间中的超平面由下面的方程确定: 其中,w 和 x 都是 n ...

  4. WS_CLIPCHILDREN和WS_CLIPSIBLINGS的理解(转载)

    1.1 WS_CLIPCHILDREN WS_CLIPCHILDREN样式从字面上可以理解成ClipChildren,裁减子窗口. MSDN里的E文解释:Excludes the area occup ...

  5. 关于v$process与v$session中process的理解(转载)

    http://www.itpub.net/thread-1077321-1-1.html(出处) 关于v$process与v$session中process的理解 说明 v$session有个proc ...

  6. 简书上的大牛总结的 ServerSocket Accept() 的确是阻塞方法 与猜想一致 一些理解 转载如下

    当我们调用如下代码的时候,实际java封装了很多层调用 图1 new ServerSocket(9876) 这个构造函数的内部,会调用 bind() 以及 listen() 等系统调用,之后才是 ac ...

  7. 依赖注入和控制反转的理解(转载)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  8. 软件框架的理解(转载)

    如何去掌握Architecture的构建.但是这些发言纯粹是一种学术性的见解,和实际中的情况基本完全不符合,到不是我不联系实际,而是实际上国内的公司基本上还都处于一种很无知而盲目的境地. Archit ...

  9. 数据流和数据报的理解(转载)

    文章目录 1. TCP 2. UDP 3. 为什么 4. 参考文献 "TCP是一种流模式的协议,UDP是一种数据报模式的协议",这句话相信大家对这句话已经耳熟能详~但是," ...

  10. JavaScript中原型对象的彻底理解(转载)

    https://blog.csdn.net/u012468376/article/details/53121081 作者:做人要厚道2013  来源:CSDN  原文:https://blog.csd ...

最新文章

  1. 《你的灯亮着吗》读书笔记1
  2. Xamarin Android设置界面提示类型错误
  3. 刷题两个月,从入门到字节跳动offer,这是我的模板 | GitHub 1.2k星
  4. Qt中应用程序的打包与发布
  5. c++桥接模式bridge
  6. 深入Spring Boot:快速集成Dubbo + Hystrix
  7. Maven入门详解以及Eclisp的集成
  8. 面向接口编程 (噬菌体) 不错的接口
  9. 三大运营商一季度财报出炉:营收集体下降
  10. cf修复服务器,CF:“卡顿”问题终于得到重视!新版本宣布修复,玩家这下开心了...
  11. QEMU模拟mini2440开发环境
  12. 数据分析师培训班哪家好?
  13. CISCO三层交换机配置
  14. 手机连接ftp文件服务器,手机链接ftp服务器地址
  15. Java手机游戏新流星蝴蝶剑,网页最好玩的游戏
  16. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)
  17. Elsevier期刊投稿所遇到的问题及解决方案
  18. 神舟Z7本安装Linux系统,神舟战神Z7M U盘装系统win7教程
  19. 三维触控测试软件,解读苹果3D touch三维触控技术
  20. pat乙级1087C语言

热门文章

  1. org.apache.kafka.clients.consumer.CommitFailedException
  2. 《富爸爸穷爸爸》读书摘要
  3. TSC打印机使用教程终极版(转)
  4. iOS上线 ERROR ITMS-4238
  5. 多宽带联网(一) OpenWrt中使用Macvlan实现单线多拨上网
  6. 亮度对比度色调饱和度最佳_数码教程丨如何仿电影胶片色调与质感?
  7. 我的第一次diy装机记录——小白的装机篇
  8. 中国大学MOOC中国文化概论试题(含答案)
  9. python调用若快打码接口
  10. 基于开源软件打造企业网络安全