介绍了oracle的普通锁,在介绍下oracle latch,也就是内存锁,先看结构:
1.pid,进程号
2.内存地址
3.内存长度
分类:
父latch,子latch,独立latch
父latch和独立latch固话在oracle内核代码中,静态结构。实例启动前就有父latch,启动后才会产生子latch
查看latch的统计信息,v$latch_parent (父latch),v$latch_children(子latch),v$latch(独立latch,父latch以及子latch)
比如library cache latches保护library cache中不同组的objects,单独的cache buffers chains latches保护每个database buffer cache hash chains。
latch和lock的区别是,它是管理内存的,而且没有lock那么多的模式,仅有的就是一个内存位置,获取了latch,就获取了latch相应的资源。
latch的一般动作:TEST,SET,LOAD,CLEAR,COMPARE和SWAP。
simple get:字面意思就可以看出,简单的获取,这种是最顺利的情况,运气好,一次性成功。就像你开车过红绿灯一样,碰到了绿灯。
如果无法获取相应的资源,那么肯定就要等,等多久呢?这个就需要一个人来看着,再通知你,就可以通行了,大家知道系统中进程是很忙碌的,没时间去看红绿灯,只能交给别人,这个别人就是CPU,CPU帮看着,那CPU也很忙的,总不能一直帮你看着,所以也规定CPU看一会,如果还没变绿灯,就休息一下,这就是latch free。休息多久再干活呢,这里就是叫timeout,比如休息一分钟,CPU又的干活了,又的去看红绿灯,比如看100次,那么看了100次,就叫spin,如果发现在50次的时候变绿灯了,那么就要先设置状态spin get+1,就是在spin的时候,如果看了两个轮回,还没变绿,那么就又sleep了,这时sleep+1,就是说休息的时间是上一次的N的平方。
这里到了9I以后就又增加了一种唤醒策略,就是如果持有latch的人,释放了以后,通知cpu,我释放资源了,你可以给别的人用了,上面说的那种是CPU主动去看的,这个时候CPU就通知排队的进程可以获取资源了,叫latch wait list,这里是latch的一种模式willing-to-wait。
还有一种模式,就是很灵活的,比如碰到红灯了,就不等待了,走别的路了,叫no wait,开始都一样,如果是绿灯,就立即get,如果是红灯,就失败,不会等CPU去帮他看红绿灯