我一直在阅读理解Linux内核(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(如果您尚未获得它,您就不会尝试释放它)。
而且,在386上,mov比btrl要快得多。
那么我错过了什么?
这些指令的时间是否在以后的芯片上发生了变化?
自该书印刷以来内核是否已更新?
该书是否只是纯粹错误(或显示简化指令)?
我是否错过了某些涉及CPU之间同步的其他方面,而更快的指令无法满足?