Su observación es buena: en un sistema de uniprocesador, no tiene sentido agitarse para esperar un recurso, porque también puede cambiar los hilos más pronto que tarde. Mutexes y semáforos hacen exactamente esto.
En un sistema de multiprocesador, un hilo en otro procesador puede soltar el bloqueo sin su cambio de contexto. Spinlocks puede ser útil, entonces, si no esperas esperar mucho, porque puede ser más rápido simplemente esperar hasta que el otro hilo desbloquee la cosa. Si te vas a dormir con mutex, básicamente tienes asegurado un tiempo muerto significativo antes de que te reprogramen.
En el código del kernel, sin embargo, la situación cambia: los manejadores de interrupciones necesitan acceder a los recursos compartidos con el resto del kernel, pero no pueden dormir. Los Mutexes pondrán el kernel en modo de suspensión, por lo que no podrás usarlos, pero los spinlocks tampoco son útiles porque nada interrumpirá un controlador de interrupciones en un uniprocesador (bueno, tal vez otra interrupción, pero eso da miedo).
En un núcleo, a continuación, gira dentro de un controlador de interrupción compilar a una no-operativa. Están completamente eliminados, tal como podrías pensar. Al mismo tiempo, para evitar carreras, los "spinlocks" en el resto del kernel desactivan las interrupciones justo antes de que realmente giren en algo (porque las tareas del núcleo se pueden programar). Estos códigos solo necesitan "spinlocks" (en lugar de "mutexes") si comparten código con un manejador de interrupciones.
En general, tienes razón: spinlocks realmente no tiene mucho sentido en un solo procesador si tiene mutex, porque mutex perder menos tiempo.
La primera url está obsoleta, visite esto en su lugar. http://uw714doc.sco.com/en/man/html.3synch/Intro.3synch.html –