资源描述:
《晶晶实验四 讨论闩篇》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、晶晶实验四_讨论闩篇上一篇/下一篇2008-02-1719:41:12/个人分类:晶晶oracle实验系列查看(1811)/评论(19)因为闩的种类过多,以后分别在各自领域详细介绍.今天先总的介绍闩的概念.闩不象锁,锁的结构非常复杂,在晶晶实验五中,我们就要讨论锁的结构.闩的实现相对与锁来说就非常简单了,大多数闩没有等待者,持有者等等这些队列,且大部分闩没有共享,独占等模式.(当然有部分闩例外).闩是内存中的一些位,使用CPU的硬指令(testandset或swap)将其值设置为0或非0,表示是否被持有,他的实现代码极其简单,因此,闩的获取和释放都是非常快的.闩的持有过程也应该非常
2、短暂.比如:有些闩是保护lock和pin的释放获取过程,当lock和pin获取完毕,闩就可以释放了,真正的操作在lock和pin的保护下完成.闩不会伴随整个操作.闩分三种1,长闩;2,短闩;3,共享闩长闩:当请求闩而没有立即获得.请求闩的进程会被放进一个等待者队列.当闩的持有者释放时,会通知队列中第一个等待者.短闩:当请求闩而没有立即获得,多CPU下会先自旋,如果自旋仍然得不到闩会进入睡眠状态,N厘秒后醒来再次自旋,如果得不到,再次睡眠...依次循环直到获得闩.睡眠的时间是1,4,4,8,8,16,16(单位厘秒)...每两次倍增.每睡眠一次都对应一次latchfree等待事件.自
3、旋的伪码大概如下:定义全局变量latch=0读取(资源ID){intbz=1:while(bz==1){Swap(latch,bz);}访问资源;latch=0;}在X86系统中,Swap函数就是XCHG指令.他是一条CPU的硬指令,他的执行不会被打断.因为自旋的过程是一个忙测试循环,在此期间进程会一直占有CPU的时间片,通常还会使用指令禁止进程切换,单CPU下在自旋期间,持有闩的进程不可能得到执行,也不可能释放他所持有的闩,所以在单CPU下自旋是没有意义的.共享闩:具文档中介绍,共享闩只有一个,就是CacheBufferChain闩(简称CBC闩)。编写了个小脚本,反复读取某个表
4、的同一个块.看此共享闩是否有争用:createorreplaceproceduremy_cursoriscursoraaisselectidfromjj_2whererowid='AAAMvgAAHAAAAGwAAA';xnumber(5);beginforiin1..300000loopopenaa;fetchaaintox;closeaa;endloop;end;/在执行前先观察CBC闩的情况:SQL>selectsid,event,time_waited,time_waited_micro,total_timeouts,total_waitsfromv$session_eve
5、ntwhere(sid=190orsid=203)andevent='latch:cachebufferschains';SIDEVENTTIME_WAITEDTIME_WAITED_MICROTOTAL_TIMEOUTSTOTAL_WAITS---------------------------------------------------------------------------------------------190latch:cachebufferschains03904203latch:cachebufferschains039109在一个会话中执行上面的脚本,
6、查看V$session_event视图,可以发现没有新的相关CBC闩的等待,分别在两个会话中执行上面的脚本,执行一次后,查看V$session_event中的等待事件:SIDEVENTTIME_WAITEDTIME_WAITED_MICROTOTAL_TIMEOUTSTOTAL_WAITS---------------------------------------------------------------------------------------------190latch:cachebufferschains03904203latch:cachebufferscha
7、ins0574013再试一次:SIDEVENTTIME_WAITEDTIME_WAITED_MICROTOTAL_TIMEOUTSTOTAL_WAITS---------------------------------------------------------------------------------------------190latch:cachebufferschains07505203latch:cachebufferschains0682017发