latch的基本记载

Latch的基本概念:

Larchoracle提供的轻量级锁资源,用于快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,只工作在内存中。可以简单的说:内存中资源的锁叫latch,数据库对象(表,索引等)的锁是lock

读取一个数据块的数据时,会获得该数据块的latch,这个过程叫做pin住,如果多个进程同时请求,则进程中将出现竞争。

获取latch中不存在队列机制,前面的进程释放latch,后面的进程将同时竞争请求,不存在顺序的概念,也是因为latch的获取和释放都非常快。

Latchlock区别:

1 latch是对sga中的数据块提供的互斥访问机制,lock以不同的模式获取资源对象,lock不同模式中存在兼容或者互斥。Latch的访问都是互斥,任何时候只能有一个进程pin主内存的某一块,不过latch的获取和释放都是非常快。(9I开始,允许多个进程同事查询相同的内存块,不过其中细节未知。)

2 latch作用与内存,被实例访问,lock作用与数据库对象。

3 latch非队列机制,lock是队列机制。(latch中由于对内存的获取,不存在死锁)

感觉到latch的存在:

Lock我们经常可以感觉到,但是latch接触oracle快一年了但是还是没有真正感觉到,在网上看了一篇blog,一个网友给了个例子,觉得还算不错:

Sql>set timing on

Sql>declare

V_ab varchar2(10);

Begin

For I in 1..100000 loop

Select id into I from test01;

End loop;

End;

/

先运行上述pl/sql程序块,发现运行完毕需要大概6秒左右,但是如果在4session下同时运行,第一个运行完毕的session就大概需要15秒左右,别的session大概到1520秒之前,通过上述测试发现,查询数据块时获取了latch,由于不断的获取该test01表的rownum=1的那个数据块,此时别的session获取该数据块的latch时,多个进程pin统一数据块,latch产生竞争,时间上就会比单个串行访问慢很多了,也就说明了latch获取是存在竞争的。

进程获取latch:(排除9Ilatch共享)

短期等待:

一个进程可以访问内存中的某一块,如果进程因为别的进程正占用块而无法获得latch时,进程会对cpu进程一次spinspin也叫做旋转,时间非常短,spin后进程继续获取latch,不成功还是spin,直到spin次数达到阀值限制(修改隐含参数_spin_count,但是latch_free减少,cpu使用会增加,所以调整隐含参数还是需要对oracle有很一个大体上的熟悉),达到阀值后进程进行短暂的休眠(隐含参数_max_exponential_sleep控制) 然后继续spin获取到latch为止。如果当前进程又占用了别的latch,则该进程的休眠时间不会太长,不然别的进程获取latch又需要等待。这种时间限制的休眠又称为短期等待。

长期等待锁存器:

还有种情况是长期等待锁存器(Latch Wait Posting),等待进程请求latch不成功,进入休眠,向Latch Wait List锁存器等待链表压入一条信号,表示获取latch的请求,当占用latch的进程释放latch时,会检查latch wait list然后传递一条信号给请求进程,激活休眠的获取latch的进程,然后进程获取latch

Latch wait list和其也需要维护:

Latch wait list存在与sga的维护的一个进程列表,需要latch保证其正常运行,默认的share pool latchlibrary cache latch采用这个机制。 设置隐含参数_latch_wait_posting2,则所有的latch都采用这种等待方式,利用latch wait list的方式能精确定位某个进程,但是latch wait list需要系统资源维护,并且对latch wait list上的latch竞争也可能出现瓶颈。

Pmon会检测获取到latch的进程:

如果一个进程请求,spin,休眠用了很长时间,此时进程会通知pmon进程,查看latch的占用进程是否已经意外终止或死亡!如果是pmon会清楚释放占用的latch资源。

休眠:

latch的获取:请求-spin-休眠-请求-spin-休眠。。。

休眠是暂时放弃cpu,进行上下文切换context switch,这样cpu要保存当前进程运行的一些信息,信号量等数据结构,然后cpu运行其他的进程,等待处理完后再切换原来的进程状态,如果频繁发生在事务的处理系统里面,会消耗很大的资源。

Spin

Spin是让进程继续占有cpu,运行空指令,之后继续请求,继续spin,达到_spin_count值才放弃cpu进行短暂休眠,然后继续请求spin

开销:

所以oracle也是先进行spin达到了阀值才进行休眠,也是考虑系统开销性能上的因素。

latch类别:

willing-to-wai:latch的获取如果失败,进程spin旋转cpu直到休眠,然后继续获取spin休眠,直到获取到latch为止。

no_wait:latch的获取一旦失败,进程不会等待而是跳过此latch进行后面数据块的latch获取,所有latch都无法获取时采取等待。

latch的事件:

系统发生latch等待是非常繁多,share poollibrary cachecache buffer chainsbuffer busy wait几乎这些调整都可以进一步的学习 探讨,自己也才对latch有一个了解,等后面有好的心得再拿来分享!

Oracle的一些感想:

接触oracle快一年了,有时候觉得自己好像没有什么学的了,其实那是自己根本还没有走进oracle的内部机制,近端时间快点把oracle concept的好好的熟悉一下,已经看到第五章了,年底前应该能完成初次阅读。后面再把racasm dg好好熟悉下,年底能入门下linux一些基本的东东,shell编程,再把egyle的书好好看看!任务繁重啊!不过学习oracle还是颇有意思!就是真的不容易学,需要的不仅是方法,个人觉得更多的是坚持,习惯学习oracle。

甲骨文2年入门,5年小成,10年才能勉强拿出来炫耀吧!

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1055361/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25362835/viewspace-1055361/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值