Oracle数据库中latch和mutex都要用到原子操作,到底怎么实现的,理解起来比较抽象,
Oracle教材只说了跟系统相关有实例就好理解了。
在x86的机器上,都是通过嵌入汇编代码的来实现的,汇编代码又是通过lock前缀的汇编语言
来锁系统总线来防止数据被并发修改的,具体是这样的:
先反汇编
objdump -d $ORACLE_HOME/bin/oracle > oracle.asm
再用下面的awk脚本来提取函数
-
BEGIN {
-
fun_name99 = "x"
-
isPrint = "N"
-
}
-
{
-
if ( match($0,/.+<(.+)>:$/, anames))
-
{
-
fun_name99 = anames[1]
-
}
-
if ( match($0, /(\W+lock\W+)(.*)/, anames))
-
{
-
if (isPrint == "N" && FNAME != "x" )
-
{
-
print fun_name99
-
isPrint = "Y"
-
}
-
if ( fun_name99 != "x" )
-
{
-
print anames[1] anames[2]
-
}
-
}
-
if ( match($0,/^\W*$/))
-
{
-
fun_name99 = "x"
-
isPrint = "N"
-
}
-
}
得到不到200个的函数
可以看出原子操作主要要下面3类操作:
1 Compare and Set(cas),绝大大部分都是样的
kslgetl:
lock cmpxchg %rsi,(%r12)
2 减一个数
kslfre:
lock sub %rcx,(%r15)
lock sub %rax,(%r15)
3 加一个数
kecpsGetBlockers:
lock add %rax,0x48(%r15)
阅读(5478) | 评论(0) | 转发(0) |