Después de haber estado leyendo a través Understanding the Linux kernel (Bovet & Cesati),
el capítulo sobre el kernel de sincronización indica que el código de adquisición de bloqueo de giro se reduce a:¿Son los spinlocks de Linux/SMP innecesariamente lentos?
1: lock:
btsl $0, slp
jnc 3
2: testb $1, slp
jne 2
jmp 1
3:
Ahora principio pensé que parecía un desperdicio tener bucles anidados y se podía poner en práctica algo así como :
1: lock:
btsl $0, slp
jc 1
que sería mucho más simple. Sin embargo, veo por qué lo hicieron, ya que el lock
afecta a las otras CPU y los tiempos para el btsl
son más grandes que los de un simple testb
.
Lo único que I no tengo he podido entender es la posterior publicación del bloqueo de giro. El libro afirma que se obtiene la siguiente:
lock:
btrl $0, slp
Mi pregunta es básicamente por qué? Me parece que un combo lock/mov-immediate
es más rápido.
No necesita obtener el estado antiguo en la bandera de acarreo ya que, siguiendo la regla de que el núcleo está libre de errores (se asume en muchos otros lugares dentro de dicho kernel), el estado anterior será 1 (usted no intentaría liberarlo si aún no lo hubiera adquirido).
Y un mov
es mucho más rápido que un btrl
, al menos en el 386.
Entonces, ¿qué me falta?
¿Han cambiado los tiempos para esas instrucciones en chips posteriores?
¿Se ha actualizado el kernel desde que se imprimió el libro?
¿Es el libro simplemente incorrecto (o muestra instrucciones simplificadas)?
¿He omitido algún otro aspecto relacionado con la sincronización entre CPU que las instrucciones más rápidas no satisfacen?