没有必胜的秘籍,没有方程式遵循~~ 要赢~~只有全身心的投入!

晶晶实验四_讨论闩 篇

上一篇 / 下一篇  2008-02-17 19:41:12 / 个人分类:晶晶oracle实验系列

查看( 863 ) / 评论( 17 )
因为闩的种类过多,以后分别在各自领域详细介绍.今天先总的介绍闩的概念.
6t:WcH ~f G7@0 ITPUB个人空间sei FbDt \
  闩不象锁,锁的结构非常复杂,在晶晶实验五中,我们就要讨论锁的结构.闩的实现相对与锁来说就非常简单了,大多数闩没ITPUB个人空间 on2`!a[.x+o2d
ITPUB个人空间(o4FA }l7oa-u7R
有等待者,持有者等等这些队列,且大部分闩没有共享,独占等模式.(当然有部分闩例外).闩是内存中的一些位,使用CPU的硬ITPUB个人空间+P.T!r\9zS
ITPUB个人空间 Y)OU,aBs5rm
指令(test and set 或swap)将其值设置为0或非0,表示是否被持有,他的实现代码极其简单,因此,闩的获取和释放都是非常
;] K6ICYHm0 ITPUB个人空间 h0Q.go o/W;D5P
快的.闩的持有过程也应该非常短暂.比如:有些闩是保护lock和 pin的释放获取过程,当lock 和pin 获取完毕,闩就可以释放
+M#V7p7Go Z#L4}3w0 ITPUB个人空间bn!g^HW,T
了,真正的操作在lock和 pin的保护下完成.闩不会伴随整个操作.
#i!JY pOs0
9fJ/v9kk#Omhq5r0   闩分三种 1,长闩;2,短闩;3,共享闩ITPUB个人空间L9hQ@6JUPO

1VdqiO'~{0   长闩:当请求闩而没有立即获得.请求闩的进程会被放进一个等待者队列.当闩的持有者释放时,会通知队列中第一个等待者
J,b @'x-S,V)l;B1y'q0 ITPUB个人空间6]Gc o:l@-h*O ]6o
.ITPUB个人空间pfh"R#`8C4y
ITPUB个人空间iS H5|!dWh}
  短闩:当请求闩而没有立即获得,多CPU下会先自旋,如果自旋仍然得不到闩会进入睡眠状态,N厘秒后醒来再次自旋,如果得ITPUB个人空间4cU:F-@8Z;w
ITPUB个人空间 L(aR]v.IR'mp
不到,再次睡眠...依次循环直到获得闩.睡眠的时间是1,4,4,8,8,16,16(单位厘秒)...每两次倍增.每睡眠一次都对应一次ITPUB个人空间1tKkX [LY z

#Fi%t?xs:f;n0 latch free等待事件.ITPUB个人空间*m(L8E"rN$I5V ]
    ITPUB个人空间:~1NZI S/?4W$l
自旋的伪码大概如下:ITPUB个人空间l.uId$f"`F\0i
    定义全局变量 latch=0
Bt!i+Zv tZ;OW0         读取(资源ID)ITPUB个人空间e&v'u)hv _
        {
~org,v]{"S0            int bz=1:ITPUB个人空间x!H6l7P4|%@'G6i:x] u
            while(bz==1)ITPUB个人空间;C'g}F.d
             {ITPUB个人空间6s&h Lc9y-Kis$V_X
                Swap(latch,bz); ITPUB个人空间0mQ5wt-Y+T%]
              }ITPUB个人空间p2g$^(b#dS q
           访问资源;ITPUB个人空间i#?:T}Q(zP*?-{)`
           latch=0;
dPHN gA:h5|0         }    ITPUB个人空间LC7}&ET F1~ _'T h]
  在X86系统中,Swap函数就是XCHG指令.他是一条CPU的硬指令,他的执行不会被打断.
8T$|l ~$g&e:{0   因为自旋的过程是一个忙测试循环,在此期间进程会一直占有CPU的时间片,通常还会使用指令禁止进程切换,单CPU下在自
:Po:V'M/GI%@-v5O*J0
rR UZnD/d#vf)fq0 旋期间,持有闩的进程不可能得到执行,也不可能释放他所持有的闩,所以在单CPU下自旋是没有意义的.
7G|]IdYJ%L:mo0 ITPUB个人空间/^2n6K9rWUi Y
  共享闩: 具文档中介绍,共享闩只有一个,就是Cache Buffer Chain闩(简称CBC闩)。
{&u~.H4]M!`,DR0 ITPUB个人空间O u5U ?#XM:r O1p!v
编写了个小脚本,反复读取某个表的同一个块.看此共享闩是否有争用:
A:~(p L4d0P"K0 create or replace procedure my_cursor is ITPUB个人空间4a'_z ^z+R
  cursor aa is select id from jj_2 where rowid='AAAMvgAAHAAAAGwAAA';
CC;l1M.I;b|X0   x number(5);ITPUB个人空间 gO NJps
beginITPUB个人空间5n/|&u(QF!m
  for i in 1..300000 loop
0rg^g,V-l(v.Q0     open aa;
B&k~'V kZl9n0     fetch aa into x;ITPUB个人空间F(Aq(LP^[
    close aa;ITPUB个人空间V!C1S-A+p)q;WP
  end loop;  ITPUB个人空间/\3C0r5DFYMYH
end;
3l,l7Ez[;pT?0 /
2N_t\ca8fNvy0 在执行前先观察CBC闩的情况:
yUR~-B+g6_0 SQL> select sid,event,time_waited,time_waited_micro,total_timeouts,total_waits from v$session_event where
;P$D,i T's1f0 ITPUB个人空间M0u,S;BT{IPJ
(sid=190 or sid=203) and event='latch: cache buffers chains';
V V*x3M'NZx0 ITPUB个人空间d0f+l I,t#grO
       SID EVENT                          TIME_WAITED TIME_WAITED_MICRO TOTAL_TIMEOUTS TOTAL_WAITS
|i"x"T![d_/[0 ---------- ------------------------------ ----------- ----------------- -------------- -----------
d!g9Tb)sP;F*MN*e5N0        190 latch: cache buffers chains              0                39              0           4
B"t2S2P/wKL+L0        203 latch: cache buffers chains              0               391              0           9ITPUB个人空间.W,aH/w YsI-@ g ^
在一个会话中执行上面的脚本,查看V$session_event视图,可以发现没有新的相关CBC闩的等待,分别在两个会话中执行上
?-Ur6\o.H2x0 ITPUB个人空间-pn0AP.}
面的脚本,执行一次后,查看V$session_event中的等待事件:
%n RYJ;e8K0        SID EVENT                          TIME_WAITED TIME_WAITED_MICRO TOTAL_TIMEOUTS TOTAL_WAITSITPUB个人空间S h4JEu6GR
---------- ------------------------------ ----------- ----------------- -------------- -----------
7Q2_VFn.rm5oU0        190 latch: cache buffers chains              0                39              0           4ITPUB个人空间 Hd7PwQ @({\.g&@
       203 latch: cache buffers chains              0               574              0          13
R5zn~.L,pe0 再试一次:ITPUB个人空间8v |Gmw*T`N
       SID EVENT                          TIME_WAITED TIME_WAITED_MICRO TOTAL_TIMEOUTS TOTAL_WAITSITPUB个人空间_ar+r2{$C
---------- ------------------------------ ----------- ----------------- -------------- -----------ITPUB个人空间8_ u&iZ@B
       190 latch: cache buffers chains              0                75              0           5ITPUB个人空间Dva.z:?$H9W'C&z
       203 latch: cache buffers chains              0               682              0          17
1uZmSDxGA0 发现第一次190号会话的CBC闩没有增加,而203号会话增加了,第二次执行后两个绘画都增加了。再进一步了解一下闩的相关ITPUB个人空间i#a5_Tzh
ITPUB个人空间 l:l"q$v+S;@
视图:ITPUB个人空间*|,I0Q-q9aD
SQL> select misses,gets,sleeps,spin_gets from v$latch where name='cache buffers chains';ITPUB个人空间6`4r!`!C2_\"G Y
ITPUB个人空间D8Xt1li;bd nK&alx
原值:
8t7d!I;d*`0~0     MISSES       GETS     SLEEPS  SPIN_GETS
"Y?/r k{t6mY?u D$P@"L0 ---------- ---------- ---------- ----------
YKh [B5s\e/^0       1289   14632424         32       1260ITPUB个人空间F#` a#FXk7Xy

xH%_%g0TMUM0 只一个会话执行语句:ITPUB个人空间8K l{+m]0THr_
    MISSES       GETS     SLEEPS  SPIN_GETS
l@.???dy0n0 ---------- ---------- ---------- ----------
}G%w+w['?9n$W'O0       1289   15232803         32       1260ITPUB个人空间eunK7c YD
可以发现,MISSES没有增加。只是GEST增加了60多万次。ITPUB个人空间FK,l:pJ,D+Q7VA5s
ITPUB个人空间T:[y,k8J9o.z0N
两个会话都执行脚本:
(D"_(b }}7j SBb0
}ZI(J%t0     MISSES       GETS     SLEEPS  SPIN_GETS
zVM~6wNye5H Q0 ---------- ---------- ---------- ----------
VBm*f9\w0       1479   16433137         42       1441ITPUB个人空间+P1`$|]V$w

g!_[xS0 只一个会话执行的时候MISSES 并没增加,两个都执行的时候有少量增加,增加了将近200次。两个会话,几乎同时60多万次的ITPUB个人空间&O&t^ Wn P

-`!_&WM Q+@,K]8I+K0 进行CBC请求,只有近200次的MISSES,因此这里CBC闩只是有限共享。
:Lg hv&K.M7[0
^&j#N4c6ZC5B0    父闩; 子闩;ITPUB个人空间ET)F)g6|0gtk&wP
ITPUB个人空间D].] h9G%E
   有些闩只能有一个,但有些闩可以有众多的子闩,这是为什么呢?只要是闩所保护的资源是成组出现的,且互相之间互不影
;a D0pN0^?0 ITPUB个人空间0I"Xf5Y2FI+f5t
响,那么就可以拥有众多子闩,例如:Cache Buffer Chain闩(简称CBC闩).他主要是保护buffer cache 中 hash表的hash链,因ITPUB个人空间 t:q`pQYm
ITPUB个人空间NC)eQ0?(a
为hash链不止一条,且各个HASH链没什么影响,所以可以为每个HASH链都准备一个闩,这样CBC闩就拥有了众多的子闩,在8I中ITPUB个人空间(^(c$N%lS6W
ITPUB个人空间9X? i6R'c.I*Ma/y'_9my
就是这样的,但9I改变了算法,减少了每个HASH链中buffer head的数量.因此,9I中一个CBC子闩会对应多条HASH链,象CBC这样
$J2W^6Om0
4hp b4sot%t)|0 有众多子闩的闩就可以称为非独立闩.或组闩.还有一种情况,并非所保护的资源是成组出现但也有多个子闩,如: redo copy
i.\ [T8|d n+G){%dn0
:mq@k(J-aS0 闩,子闩的个数,oracle默认为CPU个数的两倍,oracle是为了限制同时向log buffer复制日志缓存的进程的数量. 从而限制取
*qp[1h!R(Z.a0 ITPUB个人空间 {(LHEn9l-_:z-f
得此闩进程的数量.因此,此闩也是非独立闩,但子闩数量不多.
^ u J6?8^-f} D K0
iF}LqnU0   相关视图:
dD5[J Q%v'i0    观察闩的情况是用v$latch 和v$latch_children两个视图, v$latch视图基本上是v$latch_children分组求合的结果.以ITPUB个人空间_0O8N)hvL8~
ITPUB个人空间8SX6o6\[ {"^ a#@7]H
前见坛友问过此视图的列意义,在此简单说明几列:ITPUB个人空间 W ^'Tf2bVz}p
   gets       以愿意等待模式请求闩,并获得的次数.ITPUB个人空间1ii O Mcm,D3l
   misses     以愿意等待模式请求闩,自旋或睡眠后获得的次数.
jV yB,mH8f#ZF[9W0    sleeps     以愿意等待模式请求闩,睡眠的次数.ITPUB个人空间 y!ik[Uwq4y
   spin_gets  第一次自旋即成功获得闩的次数.ITPUB个人空间(UXi&yp(cW:M
   sleep1     睡眠一次后获得闩的次数
*g:_/zoc"`#i2L,_0    sleep2     睡眠两次后获得闩的次数ITPUB个人空间5DM%Q.B ^8CS
   sleep3     睡眠三次后获得闩的次数
5|{4c6f5[E0    sleep4     睡眠四次以上获得闩的次数ITPUB个人空间 G+u{!?i2I h
sleeps 和 sleep1,2,3,4的关系:
$Y8`@#H1I&@0 sleeps=sleep1*1+sleep2*2+sleep*3+sleep4*N...ITPUB个人空间'c}6f4^8zj)J
在多CPU环境中每次睡眠醒来都要自旋,假如:第三次睡眠后醒来,自旋获得闩了,spin_gets不再增加.他只反映第一次自旋即ITPUB个人空间c Y v-\ G^ j]
获得闩的次数.sleep3加1.sleeps加3.文档中有个相关自旋的公式:  sleeps/(misses-spin_gets) 这个公式的结果反映了几
etx\L-r2V:]0 ITPUB个人空间nc/J&c*X/`-U o
次睡眠才会获得闩,这个值是个平均值.大家可以根据这个值的高低来判断自旋的效率.ITPUB个人空间P;mxNg+W/T\-h
   自旋到底有什么样的作用呢?? 自旋可以减少进程切换所带来的负担,如果一个进程刚刚获得CPU时间片,但是只因为无法
u:PA(XIf0
t9`B7vv~0 获得闩而让出了时间片,浪费了刚刚到手的时间片,如果有很多进程都是因为无法理解获得闩而被切换走时间片,众多的进程ITPUB个人空间*k wp`-]
ITPUB个人空间)by3M&\@,Za2`t
切换操作也会带来一些系统的负担.ITPUB个人空间rz7l:r8x0b1H6P[i%i
   补充一下进程的切换,它到底有多大的负担呢??我们都知道每个进程是运行在他的上下文中,从A进程切换到B进程,主要完
zsR(l*L-nG SA0 ITPUB个人空间,~)B6yM@R} p
成的任务就是把A进程的上下文保存起来,而把B进程的上下文调出,进程切换的主要负担就是上下文的切换,上下文到底有多
*EM_^ AJ G0 ITPUB个人空间^ FXS3m:j@}V
少内容呢??参考LINUX的原码,在arch/i386/kernel/entry.S中,我们可以看到上下文主要是指CPU中的所有寄存器,保护A进程
vbU\8|BGa {0
:U;{4T+_|e'Qu0 的上下文就是当A进程运行时,把所有的CPU中寄存器的当前值压入堆栈.在32位系统中也就是100个字节左右,简单点说,上下
K)^&a| u0
)@.Ddv9b0@O M U"Ox| s0 文切换的负担就是将CPU中的寄存器的值转入内存。

TAG:

蚊子窝 foxmile 发布于2008-02-17 19:44:13
支持一下。楼主理解的很不错oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netXEZTM
;@7q!Q*mD Y!B:J%Nr
[ 本帖最后由 foxmile 于 2008-2-17 19:53 编辑 ]
mustapha的个人空间 mustapha 发布于2008-02-17 19:51:44
赫赫。不错不错,错字不少
棉花糖ONE发布于2008-02-17 19:52:16
支持晶晶
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-17 20:07:31

QUOTE:

原帖由 mustapha 于 2008-2-17 19:51 发表
)xLr?l$_$t5LA赫赫。不错不错,错字不少
7iD%M$V#|-HeB|ITPUB个人空间
gJ-}1I"SC%yNoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net哈哈 俺以后努力改正..ITPUB个人空间#gT&l-U$`1]2N        K

Z/w
e
})KIvoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
谢谢大家的支持..  请多提宝贵意见.俺会更努力滴..^_^
蚊子窝 foxmile 发布于2008-02-17 20:11:39

QUOTE:

原帖由 棉花糖ONE 于 2008-2-17 19:52 发表
T0B        jx6O!?K5V)^ITPUB个人空间支持晶晶
1b7rs-E\!`
棉花,能不能换个说法。。。。。
Alienovo的个人空间 Alienovo 发布于2008-02-17 21:44:26
不错  支持原创!
jimmyhe1981发布于2008-02-17 23:12:37
好奇~~晶晶看的是哪本书?
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-17 23:18:48

QUOTE:

原帖由 jimmyhe1981 于 2008-2-17 23:12 发表
1M#BJ&fuOspace.itpub.net好奇~~晶晶看的是哪本书?
_:G X)irspace.itpub.net
j/WUe$lciv`loracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net所有的资料都是来自 pub baidu  google 嘿嘿 ^_^ oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
Qx:B0to

V#]ZGYpccr
自己多做实验,多消化理解也很重要.
.K9] [Ut"t-l8o
:_,M$D!~#C3r6DK}记得哪位大师说过"书上得来总觉浅..."后半句忘了,大概意思就是自己实验才能把知识融会贯通.变成自己的东西才能灵活运用.
stronghearted的个人空间 stronghearted 发布于2008-02-17 23:22:19
好火,很少有MM发贴那么猛的oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net!r"k*N:gjh3t\

)ui        @6{Rspace.itpub.net
龙鹰的空间 jiafei9999 发布于2008-02-18 09:00:42
支持原创,赞一个~~
likaiabc的个人空间 likaiabc 发布于2008-02-18 09:21:47
mm好强大,自叹不如啊,
烟囱的个人空间 烟囱 发布于2008-02-18 09:57:27
好文!
~%G eM_H3Zoracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net怎么最近斑竹都不加精啊?space.itpub.net4Y0Poe9mW
GI

帮MM疾呼一下.
cyt2005发布于2008-02-18 10:04:07
pub新人奖得主啊。。。
西瓜 BTxigua 发布于2008-02-18 13:28:24
再看下一篇。
catchwo的个人空间 catchwo 发布于2008-02-18 13:56:19

QUOTE:

原帖由 晶晶小妹 于 2008-2-17 23:18 发表 ITPUB个人空间!Z,G!m:c"E8eY
r3z] }:P3sT(^!{

2uo`sA所有的资料都是来自 pub baidu  google 嘿嘿 ^_^ 
B
c4~
gE
ITPUB个人空间|j'^$Mh5O%?(J'R
自己多做实验,多消化理解也很重要.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.netpCk*]!C_c


p&f.B$UTB"}0~DaITPUB个人空间
记得哪位大师说过"书上得来总觉浅..."后半句忘了,大概意思就是自己实验才能把知识融会贯通.变成自己的东西才能灵活运用.
(aEm+OT
biti大师说的。
sharklove发布于2008-02-22 22:50:21
很好,很弓虽大!t.rZQY Q(W
m        K5b[._ay S%T
看得出这个mm有很强的开发根底,2Pa        oA:d a8h&fg
你是我的偶像
lkypy发布于2008-03-12 15:24:24
一个字  “强”
我来说两句

(可选)

日历

« 2009-07-04  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 60693
  • 日志数: 32
  • 图片数: 4
  • 建立时间: 2008-02-15
  • 更新时间: 2008-05-29

RSS订阅

Open Toolbar