- 论坛徽章:
- 0
|
最近看了一点MP上的lock,发现一个问题,大家讨论一下吧。
一般在IA32的spinlock的实现中几乎都有“pause”这条指令,为的是减少MP之间为了维持cache的一致性而进行的大量通讯,这也是Intel手册上建议的。在FreeBSD与OpenSolaris上也确实是这样作了,但是,奇怪的是Linux2.6的内核中并没有这么作,而是用"rep;nop"来代替的,看代码
- "\n1:\t" \
- "lock ; decb %0\n\t" \
- "jns 4f\n\t" \
- "2:\t" \
- "testl $0x200, %1\n\t" \
- "jz 3f\n\t" \
- "sti\n\t" \
- "3:\t" \
- XXXX"rep;nop\n\t" \XXXXXXXXX
- "cmpb $0, %0\n\t" \
- "jle 3b\n\t" \
- "cli\n\t" \
- "jmp 1b\n" \
- "4:\n\t"
复制代码
并且,rep;nop好像还是P4的指令,而pause是都可以用的。
google了一下,没发现解释,倒是很多说为什么rep;nop的,但是没解释为什么不是pause。
大家讨论一下吧。 |
|