latch是ORACLE中锁的一种,它是一种低级锁,是保护SGA中的共享内存,它几乎不排队(latches wait list除外),不会产生死锁。

latch分为no-wait与willing-to-wait模式,以willing-to-wait请求的latch只有少数几个,而且他们一般都有多个子latch.

比如redo copy latch,我们知道redo 最开始产生于PGA中,之后会将redo记录copy到SGA中,要想copy,就需要获得一个

redo copy latch,防止copy过程中redo记录被破坏。而redo copy latch的获取方式是 no-wait方式的,如果请求没有获得,它不会在cpu上面自旋(spin,当然你需要有多个CPU),而是继续以no-wait方式继续请求,因为有多个redo copy latch,很容易获得一个redo copy latch,如果所有的redo copy latch都无法获得,那么就只好以willing-to-wait模式请求redo copy latch了。

以no-wait模式请求latch,会在v$latch.immediate_gets,immediate_misses中记录。

绝大多数的latch都是以will-to-wait模式请求的。他们的信息会记录在gets,misses列。

在多cpu系统中以willing-to-wait模式请求latch过程如下:

1.请求latch,如果没有别的进程拥有该latch,那么直接获得该latch.

2.如果latch被别的进程持有,请求该latch的进程在cpu上自旋一段时间,自旋的次数和时间长短由cpu决定。如果是单cpu,不会自旋,直接休眠。

3.从新尝试获得该latch,如果无法获取(_spin_count次自旋后),记录一个latch free等待事件,然后释放cpu,休眠。如果获得了该latch,则在spin_gets,misses列上加一,自旋的总的次数由_spin_count隐含参数决定。

4.睡眠结束后,继续尝试获取该latch,直到获得该latch为止,同时获得latch的时候会更新sleeps列的信息。

可以查看v$system_event.total_waits来查看latch无法获取的次数,v$system_event.total_waits应该等于v$latch.sleeps,不过因为sleeps是在latch获得之后才更新的,所以tatal_waits查询出来的时候通常大于sleeps。

SQL> select event,total_waits,time_waited,average_wait from v$system_event where event like '%latch%' ;

EVENT                                                            TOTAL_WAITS TIME_WAITED AVERAGE_WAIT
---------------------------------------------------------------- ----------- ----------- ------------
latch: cache buffers chains                                                2           0            0
latch: shared pool                                                         3           0          .06
latch: library cache                                                       1           0          .01
latch free                                                                 6           0            0
latch: session allocation                                                  1           0          .01
latch: cache buffers lru chain                                             3           9         2.86

已选择6行。

SQL> select name,gets,misses,sleeps,spin_gets from v$latch where sleeps!=0;

NAME                                                     GETS     MISSES     SLEEPS  SPIN_GETS
-------------------------------------------------- ---------- ---------- ---------- ----------
shared pool                                            109039        204          3        201
session allocation                                     264876        307          1        306
cache buffers lru chain                                 19276         19          3         16
qmn task queue latch                                       78          9          6          3
library cache                                           83505         83          1         82
cache buffers chains                                   960520         47          2         46

已选择6行。

可以看到cache buffers chains 中v$system_event.total_waits等于v$latch.sleeps。

misses通常比spin_gets大,但是他们很接近,gets通常较大,因为每次请求一个latch就会加一。

关于latch的一点点理解相关推荐

  1. 对Thrift的一点点理解

    对Thrift的一点点理解 这是一篇学习Thrift的笔记,包含了这样几点内容: 简单介绍Thrift 怎样使用Thrift Thrift整体架构 Thrift中的知识点 struct可以设置默认值 ...

  2. 重学概率论的一点点理解(持续更新)

    前言:这里是毕业N年后重学概率的一点点理解,因为上学的时候贪玩了,现在到了还的时候,要花费大量的时间,悲剧...所以请同学们抓紧在校时间,务必多夯实基础. 文章内容都是自己手工敲的,算是一点点学习笔记 ...

  3. HGMMs的一点点理解~

    Robust Ellipse Fitting Using Hierarchical Gaussian Mixture Models Motivation Related works Ellipse f ...

  4. 个人对latch的一些个理解

    纯属个人理解![@more@] 说说自己对latch的一些理解,希望能和大家切磋交流.其实自己的这些个理解大部分来源于这些个书籍,列在下边: 1. Oracle Wait Interface: htt ...

  5. javascript中函数参数以及函数中局部变量作用域一点点理解

    2019独角兽企业重金招聘Python工程师标准>>> 函数中局部变量如果与外部变量重名,则用的是函数内部局部变量,用完就会被释放.我的理解函数是一个function定义的代码段,以 ...

  6. 对线性时不变系统(LTI)中时不变(Time Invariant)的一点点理解

    这个博客又找回来了,重新恢复更新 ==========================================x 这个问题讨论的是一个系统对于一个随时间变化的输入信号x的一个处理问题. 时不变 ...

  7. 对sizeof的一点点理解

    sizeof sizeof的常量性 常量性的概念:简单的说就是编译的时候就可以确定他的值了,就好像是const一样 在一些老式的编译器里面你是不能够声明一个不确定大小的数组的,也就是说以下写法是错误的 ...

  8. 软件定义安全的一点点理解

    万事开头难,中间也难,最后也难.第一次写博客,内容.排版都不太好,请见谅.文章内容部分来源绿盟的<软件定义下的新型安全架构和实践>.<软件定义安全>以及<软件定义安全:S ...

  9. 强化学习(Reinforcement Learning)之策略梯度(Policy Gradient)的一点点理解以及代码的对应解释

    一.策略梯度算法推导以及解释 1.1 背景 设πθ(s)\pi_{\theta }(s)πθ​(s)是一个有网络参数θ\thetaθ的actor,然后我们让这个actor和环境(environment ...

最新文章

  1. 循序渐进Python3(二) -- 数据类型
  2. 【观点】开发人员的测试悖论
  3. ESB与可插拨系统的思考
  4. 【构建之法教学项目】一个简单的基于C#的电子商务系统演练场景的代码示例...
  5. Remove Assignments to Parameters(移除对参数的赋值)
  6. jenkins 读取json文件_使用插件轻松获取jenkins构建数据
  7. 上周的工作总结和下周的学习安排
  8. HDFS常用命令与命令大全及其用法
  9. GB35114—④、附 录A、B
  10. TensorRt - caffe中支持prelu
  11. 《史上最简单的 SpringCloud 教程》系列 (转载 http://blog.csdn.net/forezp/article/details/70148833 本文出自方志朋的博客)
  12. css选择器的权值与优先规则
  13. 最大似然估计方法介绍
  14. 《Intriguing properties of neural networks》代码实现——Pytorch
  15. 51nod 1526 分配笔名(字典树)
  16. bugku md5加密相等绕过
  17. EditPlus中文版-具有 FTP、FTPS 和 sftp 功能的文本编辑器
  18. android调用fragment的方法,Android Fragment基本使用
  19. 我的世界服务器修改生成怪物速度的文件,我的世界服务器怎么不生成怪物_禁止服务器产生怪物代码大全_游戏城...
  20. 高温热水解预处理对厌氧消化期间污泥腐殖化的调控机制

热门文章

  1. 物联网毕设题目选题推荐
  2. Redis - 10、主从复制
  3. 计算机无法保存,无法保存打印机设置0x000006d9?教您怎么办
  4. [AFCTF2018]One Secret, Two encryption(考点:公钥解析,gcd())
  5. 在Unity3D中使用精灵动画引擎制作动画的两种方法
  6. 北京林业大学计算机保研,北京林业大学2021年各专业保研数据详细分析
  7. 读懂algebraic distances on graphs
  8. 利用大数据打通政务信息孤岛
  9. Mysql客户端连接服务端提示“Access denied for user ‘user_name‘@‘xxx.xxx.xx.xx‘ (using password: YES)”
  10. 为什么说每个人适合的大数据培训课程都可能存在差异?