我的读书笔记:转载请注明
锁存器:
什么是锁存器: 锁存器是存在于ORACLE中用于保证一些内存结构一致性的轻量级锁,为什么说是轻量级的,应该是锁存器一般等待的时间较短为了保证不发生死锁,
什么是锁存器: 锁存器是存在于ORACLE中用于保证一些内存结构一致性的轻量级锁,为什么说是轻量级的,应该是锁存器一般等待的时间较短为了保证不发生死锁,
锁存器的级别:锁存器分为0-13 14种模式,在willing-to-wait模式下只能获得更改等级的锁存器,如果想获得同等级或者更低 级别的锁存器,就必须使用no-wait模式进行获取。如果想查看锁存器的等级可以参考v$latch,v$latch_children的LEVEL#字段。
锁存器类型:锁存器类型包括 willing-to-wait和no-wait模式
willing-to-wait模式:这个模式就是要一直等待直到获得锁存器为止,在初次获得latch失败的情况下,latch会进入spin,直到达到_spin_count的值。
(这个参数参考如下:
_spin_count:willing-to-wait 模式的锁存器在获得锁存器失败的情况下进行循环获取的次数,如果超过了这个次数就进行睡眠,只有1个CPU的机器上不存在自旋 也就是这个参数为1)
如果在spin过程中任然不能得到latch,这个时候就进入sleep,表现在v$session_wait中就是latch:***
进入了睡眠过后等待唤醒也有2中方式,
锁存器类型:锁存器类型包括 willing-to-wait和no-wait模式
willing-to-wait模式:这个模式就是要一直等待直到获得锁存器为止,在初次获得latch失败的情况下,latch会进入spin,直到达到_spin_count的值。
(这个参数参考如下:
_spin_count:willing-to-wait 模式的锁存器在获得锁存器失败的情况下进行循环获取的次数,如果超过了这个次数就进行睡眠,只有1个CPU的机器上不存在自旋 也就是这个参数为1)
如果在spin过程中任然不能得到latch,这个时候就进入sleep,表现在v$session_wait中就是latch:***
进入了睡眠过后等待唤醒也有2中方式,
1、可以在进入超时后唤醒重新进行获取,如果不能得到任然经理spin,如果还不能再进行睡眠,超时的算法以1/100秒为单位初次随眠是1、1、2、2、4、4、8、8、16、16最多为2秒,为神马引入这样的机制,因为spin也是相当耗费CPU的,所以引入这样的机制,避免过多的cpu资源浪费。
2、另外一种方法就是通过锁存器列表,使用这样的方式锁存器很少,比如shared pool,library cache,这种机制说的是使用一个列表来维护等待的进程,如果latch释放,然后列表中的进程进行竞争获得latch,列表本生也不是LRU原则,是竞争原则。
no-wait模式:如果进程项获得比当前latch更低或者相同级别的latch就必须用这样的方式,这种方式是为了避免死锁,这样的模式不存在spin和sleep,能获取就获取如果不能获取,就通过willing-to-wait模式重新按顺序获取,比如我当前LATCH为level 1,3 如果某个进程项获取2 level 的latch,就通过no-wait模式,如果是失败就通过2,3的顺序重新获取。
no-wait模式:如果进程项获得比当前latch更低或者相同级别的latch就必须用这样的方式,这种方式是为了避免死锁,这样的模式不存在spin和sleep,能获取就获取如果不能获取,就通过willing-to-wait模式重新按顺序获取,比如我当前LATCH为level 1,3 如果某个进程项获取2 level 的latch,就通过no-wait模式,如果是失败就通过2,3的顺序重新获取。
相关视图:
通过v$latch,v$latch_children视图的字段可以看出
gets 是willing-to-wait模式下需求的次数
misses 是willing-to-wait模式下到睡眠之前获取失败的次数
spin_gets 是willing-to-wait模式下通过spin成功获得latch的次数
sleeps 是willing-to-wait模式睡眠的次数
immediate_gets 就是no_wait模式下获得锁存器成功的次数
immediate_misses 就是no_wait模式下获得锁存器失败的次数
wait_time 以毫秒为单位的等待时间
通过v$latch,v$latch_children视图的字段可以看出
gets 是willing-to-wait模式下需求的次数
misses 是willing-to-wait模式下到睡眠之前获取失败的次数
spin_gets 是willing-to-wait模式下通过spin成功获得latch的次数
sleeps 是willing-to-wait模式睡眠的次数
immediate_gets 就是no_wait模式下获得锁存器成功的次数
immediate_misses 就是no_wait模式下获得锁存器失败的次数
wait_time 以毫秒为单位的等待时间
如果有误请大虾指出。thx