没有必胜的秘籍,没有方程式遵循~~
要赢~~只有全身心的投入!
晶晶实验四_讨论闩 篇
上一篇 /
下一篇 2008-02-17 19:41:12
/ 个人分类:晶晶oracle实验系列
查看( 863 ) /
评论( 17 )
因为闩的种类过多,以后分别在各自领域详细介绍.今天先总的介绍闩的概念.
6t:W cH
~f G7@0
ITPUB个人空间 sei
FbDt
\
闩不象锁,锁的结构非常复杂,在晶晶实验五中,我们就要讨论锁的结构.闩的实现相对与锁来说就非常简单了,大多数闩没ITPUB个人空间
on2`!a[.x+o2d
ITPUB个人空间(o4FA}l7oa-u7R
有等待者,持有者等等这些队列,且大部分闩没有共享,独占等模式.(当然有部分闩例外).闩是内存中的一些位,使用CPU的硬ITPUB个人空间+P.T!r\9zS
ITPUB个人空间 Y)OU,aB s5rm
指令(test and set 或swap)将其值设置为0或非0,表示是否被持有,他的实现代码极其简单,因此,闩的获取和释放都是非常
;]K6ICYHm0
ITPUB个人空间 h0Q.goo/W;D5P
快的.闩的持有过程也应该非常短暂.比如:有些闩是保护lock和 pin的释放获取过程,当lock 和pin 获取完毕,闩就可以释放
+M#V7p7GoZ#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个人空间iSH5|!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?x s: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&hLc9y-Kis$V_X
Swap(latch,bz); ITPUB个人空间0mQ5wt-Y+T%]
}ITPUB个人空间p2g$^(b#dS q
访问资源;ITPUB个人空间i#?:T }Q(zP*?-{)`
latch=0;