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

晶晶实验四_讨论闩 篇

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

查看( 1699 ) / 评论( 19 )
因为闩的种类过多,以后分别在各自领域详细介绍.今天先总的介绍闩的概念.ITPUB个人空间P ~R m%h$J/[5T
ITPUB个人空间*f T2X0{/tL
  闩不象锁,锁的结构非常复杂,在晶晶实验五中,我们就要讨论锁的结构.闩的实现相对与锁来说就非常简单了,大多数闩没ITPUB个人空间;L8[;[wI3C1x
ITPUB个人空间-Bh i/LxuJ
有等待者,持有者等等这些队列,且大部分闩没有共享,独占等模式.(当然有部分闩例外).闩是内存中的一些位,使用CPU的硬ITPUB个人空间J&T duz:v Z!z:@
ITPUB个人空间Y-?1`b#[#v
指令(test and set 或swap)将其值设置为0或非0,表示是否被持有,他的实现代码极其简单,因此,闩的获取和释放都是非常ITPUB个人空间&z#naB [$f$o
ITPUB个人空间q7b2`7@c
快的.闩的持有过程也应该非常短暂.比如:有些闩是保护lock和 pin的释放获取过程,当lock 和pin 获取完毕,闩就可以释放ITPUB个人空间3eNIe-ip+gW*f
ITPUB个人空间w s(U!J9F3i
了,真正的操作在lock和 pin的保护下完成.闩不会伴随整个操作.
0dt o Y+u%It'XV0 ITPUB个人空间i2}.P6b@Oa
  闩分三种 1,长闩;2,短闩;3,共享闩
1PdlSD-oN0
~9yooLU M0   长闩:当请求闩而没有立即获得.请求闩的进程会被放进一个等待者队列.当闩的持有者释放时,会通知队列中第一个等待者ITPUB个人空间j+D.M'v3A-q*P

Jl\9guE!qX Y0 .
)Y#Xw.O~&tx,K}R G0 ITPUB个人空间K*ls/O$h9G
  短闩:当请求闩而没有立即获得,多CPU下会先自旋,如果自旋仍然得不到闩会进入睡眠状态,N厘秒后醒来再次自旋,如果得ITPUB个人空间_'t'e!}^#V;~

U+vY@$f:Bg0 不到,再次睡眠...依次循环直到获得闩.睡眠的时间是1,4,4,8,8,16,16(单位厘秒)...每两次倍增.每睡眠一次都对应一次
Xo+mS5jx/`;?tv+H0
'~'?&_dAHg0 latch free等待事件.
8u^*n@ Y+^I)[p7UJ0     ITPUB个人空间 S7Wh K2i
自旋的伪码大概如下:
$r7yp,n7I An0     定义全局变量 latch=0ITPUB个人空间 dr^QzS{c#F
        读取(资源ID)
}{F)~R/m0         {ITPUB个人空间)mAS A2H ~0~q
           int bz=1:ITPUB个人空间F6L Q` SM[-}
            while(bz==1)ITPUB个人空间g;E/CN [X:@U/m
             {
6Sn-oPcrd WX\*Y0                 Swap(latch,bz);
pa3|1Xvqc0               }
Y~aB%d x$CWLb0            访问资源;ITPUB个人空间W` o.[H1D+`)k-S O
           latch=0;
ev Dn8D#{0         }   
| T8]\m0   在X86系统中,Swap函数就是XCHG指令.他是一条CPU的硬指令,他的执行不会被打断.ITPUB个人空间l&s;Q7q:DY'm
  因为自旋的过程是一个忙测试循环,在此期间进程会一直占有CPU的时间片,通常还会使用指令禁止进程切换,单CPU下在自ITPUB个人空间#bmku&Y8m2o

a9a_5S#LT8q^.lA-R0 旋期间,持有闩的进程不可能得到执行,也不可能释放他所持有的闩,所以在单CPU下自旋是没有意义的.
/^&wN-rk^.I0 ITPUB个人空间%Ft4Z-o.m[4G0wF
  共享闩: 具文档中介绍,共享闩只有一个,就是Cache Buffer Chain闩(简称CBC闩)。
-`(`}SGW0 ITPUB个人空间Z6s%e{H1a/Nj8o
编写了个小脚本,反复读取某个表的同一个块.看此共享闩是否有争用:ITPUB个人空间Tp+uV1`
create or replace procedure my_cursor is ITPUB个人空间 kuM:xw4G]
  cursor aa is select id from jj_2 where rowid='AAAMvgAAHAAAAGwAAA';
`;f Gp7~A G,_0   x number(5);ITPUB个人空间9]#zjP j*f
begin
)_+N ^6m*Nrv0   for i in 1..300000 loop
3~EIu,hv1p0x(|"R0     open aa;
vqD AS0J0     fetch aa into x;ITPUB个人空间"C/^j.TU z+t3}?(d
    close aa;
`(xx lz K;v!Z0   end loop;  ITPUB个人空间,XU~ |TJ4q
end;ITPUB个人空间2ul`#_"f.?.Eq
/ITPUB个人空间~mEQ xG,T2n
在执行前先观察CBC闩的情况:ITPUB个人空间M!lVK$[/~;ak6P
SQL> select sid,event,time_waited,time_waited_micro,total_timeouts,total_waits from v$session_event where
4c:xqE|6a4p)X1V2C0 ITPUB个人空间9Ww+Q?d+M:P9J]7a
(sid=190 or sid=203) and event='latch: cache buffers chains';ITPUB个人空间zX0|bk
ITPUB个人空间,z KuT-t l3X'co5C
       SID EVENT                          TIME_WAITED TIME_WAITED_MICRO TOTAL_TIMEOUTS TOTAL_WAITSITPUB个人空间J3g7H3W,P9@g
---------- ------------------------------ ----------- ----------------- -------------- -----------ITPUB个人空间w5LME C
       190 latch: cache buffers chains              0                39              0           4ITPUB个人空间{,`%__1`
       203 latch: cache buffers chains              0               391              0           9
Q#Q1Vcq(k0 在一个会话中执行上面的脚本,查看V$session_event视图,可以发现没有新的相关CBC闩的等待,分别在两个会话中执行上
G\o;u R j"S0 ITPUB个人空间6j4vh,e0f4I2a5q
面的脚本,执行一次后,查看V$session_event中的等待事件:
n9nX&y}Hzbor2j0        SID EVENT                          TIME_WAITED TIME_WAITED_MICRO TOTAL_TIMEOUTS TOTAL_WAITSITPUB个人空间ui:z!J K y!|;@,L
---------- ------------------------------ ----------- ----------------- -------------- -----------
'V\#M?Z?(E0        190 latch: cache buffers chains              0                39              0           4
6y FD'@%I'UZ0        203 latch: cache buffers chains              0               574              0          13
-R_i-mB~@0 再试一次:
q o!h m o)Y2x:y~D0        SID EVENT                          TIME_WAITED TIME_WAITED_MICRO TOTAL_TIMEOUTS TOTAL_WAITS
z6? {-j7y$C@0 ---------- ------------------------------ ----------- ----------------- -------------- -----------ITPUB个人空间Ad]TPtn ]o$Q
       190 latch: cache buffers chains              0                75              0           5
L K1E!p0}\0Eg0        203 latch: cache buffers chains              0               682              0          17ITPUB个人空间pWMY*H
发现第一次190号会话的CBC闩没有增加,而203号会话增加了,第二次执行后两个绘画都增加了。再进一步了解一下闩的相关ITPUB个人空间+@6h!`~tt C$r
ITPUB个人空间p Z/B0t\ BZ_ c3E&V
视图:ITPUB个人空间#r%xa Go(Sqo.v W
SQL> select misses,gets,sleeps,spin_gets from v$latch where name='cache buffers chains';
1_,NG#W$RwaV0 ITPUB个人空间:Oqav0x&k5OB
原值:
0P l Lf&X0     MISSES       GETS     SLEEPS  SPIN_GETSITPUB个人空间 @C(b%i2mu7Q$O
---------- ---------- ---------- ----------
w#?#PS r0       1289   14632424         32       1260
?/N k4mM"J'q{0
UQ-|WQ+d0 只一个会话执行语句:ITPUB个人空间J~s H6jkM
    MISSES       GETS     SLEEPS  SPIN_GETSITPUB个人空间)Y8s#{ w"} h
---------- ---------- ---------- ----------
2t&`4F"Ft3uB'z0T,b n0       1289   15232803         32       1260
5DH0O6~6Hg!bj%dY0 可以发现,MISSES没有增加。只是GEST增加了60多万次。
G|6~ Yl,U(t3U%Ez0
2EwD?&h)^e0 两个会话都执行脚本:
}C]])Y s0
0A N.P#^"Kk {7n;_n0     MISSES       GETS     SLEEPS  SPIN_GETS
p2}Y2D,rDV0 ---------- ---------- ---------- ----------ITPUB个人空间)q7EE/N$T-br!v1Dm)X5y
      1479   16433137         42       1441
h@3Q:?&I;t;_v0
&[/]{9Fw3g[;r/m0 只一个会话执行的时候MISSES 并没增加,两个都执行的时候有少量增加,增加了将近200次。两个会话,几乎同时60多万次的
_5^u'f%Y-u?r3F(G0 ITPUB个人空间IZ(S|-T
进行CBC请求,只有近200次的MISSES,因此这里CBC闩只是有限共享。
$DPr%O;J C1?+vb0 ITPUB个人空间F&EDNx?!k
   父闩; 子闩;
*q%j5t3v9\ o0 ITPUB个人空间*km }2bs t'[]
   有些闩只能有一个,但有些闩可以有众多的子闩,这是为什么呢?只要是闩所保护的资源是成组出现的,且互相之间互不影
iF(Yl'D0 ITPUB个人空间:O%u&V3FW4_ ~
响,那么就可以拥有众多子闩,例如:Cache Buffer Chain闩(简称CBC闩).他主要是保护buffer cache 中 hash表的hash链,因ITPUB个人空间pb!c/w3kL
ITPUB个人空间MY)?f dC{V(S!t
为hash链不止一条,且各个HASH链没什么影响,所以可以为每个HASH链都准备一个闩,这样CBC闩就拥有了众多的子闩,在8I中ITPUB个人空间o2b8lA GI o0^ c

#bL.L+K|0 就是这样的,但9I改变了算法,减少了每个HASH链中buffer head的数量.因此,9I中一个CBC子闩会对应多条HASH链,象CBC这样ITPUB个人空间oe#[m6[iun C

%ueq$jr*J0 有众多子闩的闩就可以称为非独立闩.或组闩.还有一种情况,并非所保护的资源是成组出现但也有多个子闩,如: redo copy
D}6[!AA8] \Y)h0 ITPUB个人空间 ]fUy(\ t!t&[
闩,子闩的个数,oracle默认为CPU个数的两倍,oracle是为了限制同时向log buffer复制日志缓存的进程的数量. 从而限制取
1r F-eO te,^ [0
$[d%wh h0 得此闩进程的数量.因此,此闩也是非独立闩,但子闩数量不多.ITPUB个人空间K2A2Bb&P!tc

x+Xa \? b*W-S @ K0   相关视图:ITPUB个人空间 y[v f7^&lc
   观察闩的情况是用v$latch 和v$latch_children两个视图, v$latch视图基本上是v$latch_children分组求合的结果.以
)F'vO eONn0
wF GQ9m'anJ7}0 前见坛友问过此视图的列意义,在此简单说明几列:
1uz H'b!jp6PD:S0    gets       以愿意等待模式请求闩,并获得的次数.ITPUB个人空间6A6Ga Ot4I}i5C
   misses     以愿意等待模式请求闩,自旋或睡眠后获得的次数.
[:zCP Q M5S W0    sleeps     以愿意等待模式请求闩,睡眠的次数.ITPUB个人空间2D;T&l8`*?'`Mt"hu
   spin_gets  第一次自旋即成功获得闩的次数.ITPUB个人空间HB)CUb)x]"]J
   sleep1     睡眠一次后获得闩的次数ITPUB个人空间 Wul%W8sy;T;{0\ _L.n
   sleep2     睡眠两次后获得闩的次数
9a1Y&y_'[\^:Id6k0    sleep3     睡眠三次后获得闩的次数ITPUB个人空间de&p.W*\ v
   sleep4     睡眠四次以上获得闩的次数ITPUB个人空间N[5j|6S%`
sleeps 和 sleep1,2,3,4的关系:
i,b!io)F*YP0 sleeps=sleep1*1+sleep2*2+sleep*3+sleep4*N...ITPUB个人空间#rI1ZK|
在多CPU环境中每次睡眠醒来都要自旋,假如:第三次睡眠后醒来,自旋获得闩了,spin_gets不再增加.他只反映第一次自旋即
/|_MK"H kT0 获得闩的次数.sleep3加1.sleeps加3.文档中有个相关自旋的公式:  sleeps/(misses-spin_gets) 这个公式的结果反映了几
1wz{ N,r-}0
)uS6K$du4C1Up1\ i0 次睡眠才会获得闩,这个值是个平均值.大家可以根据这个值的高低来判断自旋的效率.ITPUB个人空间Y v*U y} q!fxrW
   自旋到底有什么样的作用呢?? 自旋可以减少进程切换所带来的负担,如果一个进程刚刚获得CPU时间片,但是只因为无法ITPUB个人空间y V,Q;w/n#dLA
ITPUB个人空间n-z0a@8M
获得闩而让出了时间片,浪费了刚刚到手的时间片,如果有很多进程都是因为无法理解获得闩而被切换走时间片,众多的进程
+dH9m*s4@s2`0 ITPUB个人空间&}h#Z:L:TL lj9M#f E
切换操作也会带来一些系统的负担.
b;](|M vl,q0    补充一下进程的切换,它到底有多大的负担呢??我们都知道每个进程是运行在他的上下文中,从A进程切换到B进程,主要完
W0E"U)ii2qq2c0
(ry!F\!o0 成的任务就是把A进程的上下文保存起来,而把B进程的上下文调出,进程切换的主要负担就是上下文的切换,上下文到底有多
RM }.m^E-no0
5P mD'X5on0 少内容呢??参考LINUX的原码,在arch/i386/kernel/entry.S中,我们可以看到上下文主要是指CPU中的所有寄存器,保护A进程ITPUB个人空间&F1PjB9xeTW

Q'dl wyv0 的上下文就是当A进程运行时,把所有的CPU中寄存器的当前值压入堆栈.在32位系统中也就是100个字节左右,简单点说,上下
x g"@J l[`0B0
8n1` B3A\x%~:y0 文切换的负担就是将CPU中的寄存器的值转入内存。

TAG:

蚊子窝 foxmile 发布于2008-02-17 19:44:13
支持一下。楼主理解的很不错'E5o
h,wvs#U

l8fxu-^I1X&s1^
[ 本帖最后由 foxmile 于 2008-2-17 19:53 编辑 ]
mustapha的个人空间 mustapha 发布于2008-02-17 19:51:44
赫赫。不错不错,错字不少
棉花糖ONE的个人空间 棉花糖ONE 发布于2008-02-17 19:52:16
支持晶晶
晶晶小妹的个人空间 晶晶小妹 发布于2008-02-17 20:07:31

QUOTE:

原帖由 mustapha 于 2008-2-17 19:51 发表 ITPUB个人空间S;e#y(`
vwuAg4n

赫赫。不错不错,错字不少

H7F%lp
W-Bt        h)A'oITPUB个人空间

)gZI        mre&d)LW2C哈哈 俺以后努力改正..
I:O0~)d
kI0dpspace.itpub.net

P,d'Y4O'K(Y.Boracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net谢谢大家的支持..  请多提宝贵意见.俺会更努力滴..^_^
蚊子窝 foxmile 发布于2008-02-17 20:11:39

QUOTE:

原帖由 棉花糖ONE 于 2008-2-17 19:52 发表
/dY9{L,OR}支持晶晶
space.itpub.netZ+_m'^`7Fl&xM"`
棉花,能不能换个说法。。。。。
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 发表 space.itpub.net(mZzv1}`
好奇~~晶晶看的是哪本书?
D)u&U@,I
Z,Koracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net
ITPUB个人空间K+PFz8DXd
所有的资料都是来自 pub baidu  google 嘿嘿 ^_^ space.itpub.netV,Rs#yc @|G

x        B"Y]/V+nITPUB个人空间自己多做实验,多消化理解也很重要.
nFL(L        P4kq

l7TU:~2B8m
记得哪位大师说过"书上得来总觉浅..."后半句忘了,大概意思就是自己实验才能把知识融会贯通.变成自己的东西才能灵活运用.
stronghearted的个人空间 stronghearted 发布于2008-02-17 23:22:19
好火,很少有MM发贴那么猛的}
JxVs

space.itpub.net7_P.W:wV%X!KEM

龙鹰的空间 jiafei9999 发布于2008-02-18 09:00:42
支持原创,赞一个~~
likaiabc的个人空间 likaiabc 发布于2008-02-18 09:21:47
mm好强大,自叹不如啊,
烟囱的个人空间 烟囱 发布于2008-02-18 09:57:27
好文!'A%| V.B
R        Q}:|[2TH

怎么最近斑竹都不加精啊?
Y+\$RAk帮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 发表
zx]4]N;pspace.itpub.net8LA1^ @N
c*vl4G)|
所有的资料都是来自 pub baidu  google 嘿嘿 ^_^ 
ub,G*z%z8c"JFjspace.itpub.netITPUB个人空间)Q1x-Q%}Kd
自己多做实验,多消化理解也很重要.oracle,db2,sqlserver,sybase,mysql,erp,scm,sap,java,.net0?Zw{E&gV
6pC!E2lo9B6]U
@

记得哪位大师说过"书上得来总觉浅..."后半句忘了,大概意思就是自己实验才能把知识融会贯通.变成自己的东西才能灵活运用.
space.itpub.net8X@%}\
h
ix4@&m

biti大师说的。
sharklove发布于2008-02-22 22:50:21
很好,很弓虽大!
F.d {`HNX"X5sITPUB个人空间b0t.FF#}F5Qm
看得出这个mm有很强的开发根底,space.itpub.net Z7i2M@(V?
你是我的偶像
lkypy发布于2008-03-12 15:24:24
一个字  “强”
ronwa发布于2010-09-03 09:19:22
对块的只读 <> 对CBC的只读
多个会话反复读取某个表的同一个块.必然引起CBC LATCH FREEspace.itpub.net?Gr5Z w/e
CBC闩保护的是CBC,不是块。space.itpub.netkcp/pL^&o
读块会涉及,但不限于对CBC的读。
V_.o,p9HEe当对块反复读取时,会引发的是对CBC的修改(BH的TCH等),所以是写争用,而非你说的有限读共享。
熊猫儿发布于2010-09-03 09:36:57
晶晶的文章都是属于精品啊。。。
我来说两句

(可选)

日历

« 2012-02-10  
   1234
567891011
12131415161718
19202122232425
26272829   

数据统计

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

RSS订阅

Open Toolbar