通读Understanding the Linux kernel (Bovet & Cesati),
内核同步一章后,自旋锁获取代码归结为:
1: lock:
btsl $0, slp
jnc 3
2: testb $1, slp
jne 2
jmp 1
3:
现在我最初认为嵌套循环似乎很浪费,你可以实现类似的东西:
1: lock:
btsl $0, slp
jc 1
这会简单得多。但是,我明白他们为什么这样做了,因为它lock
会影响其他 CPU,而且它们的时间btsl
比简单的testb
.
我无法理解的一件事是随后释放自旋锁。该书指出,它产生以下内容:
lock:
btrl $0, slp
我的问题基本上是为什么?在我看来,lock/mov-immediate
组合更快。
您不需要将旧状态设置为进位标志,因为遵循内核无错误的规则(假设在所述内核内部的许多其他地方),旧状态将为 1(您不会如果您还没有获得它,请尝试释放它)。
而且 amov
比 a 快得多btrl
,至少在 386 上是这样。
那么我错过了什么?
以后芯片上这些指令的时间是否发生了变化?
自从本书出版以来内核是否已更新?
这本书是完全错误的(或显示了简化的说明)吗?
我是否错过了一些其他方面,涉及更快的指令不满足的 CPU 之间的同步?