关于latch的一点点理解

摘要:
锁存是ORACLE中的一种锁。它是一个保护SGA中共享内存的低级锁。它几乎不会排队,也不会产生死锁。大多数锁存器在等待意愿模式下被请求。如果获得了锁存,则单击_将一个锁存添加到gets和miss列。自旋的总数由_自旋_计数决定,这意味着参数的确定。miss通常比spin好,get很大,但它们非常接近。获取通常很大,因为每次请求锁存都会增加一个。

        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的一点点理解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IDEA中统计项目代码的总行数Python数据分析(三)pandas resample 重采样下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java线程并发中常见的锁--自旋锁 偏向锁

随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题。本文着重介绍了在java并发中常见的几种锁机制。 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制。其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作。也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作...

华为内部面试题库(10)

1. 对于linux内核信号量,说法正确的是(多选):(参考:Linux内核设计与实现,第二版,第9章,9.4小节) A. 如果获取一个被占用的信号量,任务会睡眠,等待信号量释放之后,该任务才能重新获得调度 B. 信号量可以允许任意数量的锁持有者 C. 信号量保护的代码可以被抢占 D. 信号量的实现也是与体系架构相关的 答案:A,B,C,D 试题解析:信号...

(转)乐观的并发策略——基于CAS的自旋

  悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题;而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后不成功。这就是悲观锁与乐观锁的区别,悲观锁会把整个对象加锁占为自有后才去做操作,乐观锁不获取锁直接做操作,然后通过一定检测手段决定是否更新数据。这一节将对...

C++线程中的几种锁

线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能越强大,性能就会越低。 1、互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错...

并发编程学习笔记(十二、AQS同步器源码解析1,AQS独占锁)

目录: 学习目的 AbstractOwnableSynchronizer源码解析 AQS为什么如此重要 重要性说明 AQS内部类Node源码解析 AQS实例属性源码解析 AQS独占锁加锁 AQS独占锁解锁 总结 知识点总结 其它收获 学习目的 上一节学习到的ThreadPoolExecutor在并发编程中更为适用,故知己知彼方能百战不殆,这...

轻量级锁,偏向锁,重量级锁

轻量级锁,偏向锁,重量级锁 参考视频:https://www.bilibili.com/video/BV16J411h7Rd 对象头信息: normal,正常对象,使用markwork的最后3bits来标记,001就表示正常对象 Biased,偏向锁标记,使用markwork的最后3bits来标记,跟正常对象虽然有区别,但区别不大,101就表示偏向锁...