¿Cuáles son las aplicaciones de los diversos mecanismos de sincronización en el kernel de Linux?

En el kernel de Linux, los mutexes son efectivamente semáforos con requisitos de uso más estrictos y un recuento igual a uno. Los semáforos están en desuso a favor de mutexes. Por lo tanto, solo podemos ocuparnos de mutexes y spinlocks.

Los mutexes imponen la exclusión mutua al poner a los contendientes en una lista de espera y dormir . El núcleo se apaga y ejecuta otro código. Cuando se libera el bloqueo, se despierta y programa un camarero en la cola de espera. Los mutexes son la forma en que la mayoría de los bloqueos funcionan fuera del núcleo. Es decir, los mutexes son su cerradura básica y cotidiana.

Los Spinlocks imponen la exclusión mutua girando en un circuito cerrado, verificando el estado del bloqueo . Cuando finalmente se libera el bloqueo, el spinlock adquiere el bloqueo en sí mismo y se libera del bucle. Utiliza spinlocks en lugar de mutexes en una de dos situaciones: código de rendimiento crítico (los spinlocks son mucho más livianos) que no mantendrán el bloqueo por mucho tiempo y cuando no puedes dormir, como en los controladores de interrupción.

Una preocupación secundaria es que usaría (y solo puede usar) mutexes para sincronizar el espacio de usuario con el espacio de usuario o el kernel con el espacio de usuario, ya que solo los mutexes pueden dormir. Por el contrario, debido a que los spinlocks no duermen sino que están ocupados, solo tienen sentido sincronizar un contexto de kernel versus otro, en un procesador diferente. Por esta razón, existen mutexes incluso en núcleos uniprocesadores, mientras que los spinlocks están optimizados para no operar en compilaciones que no son SMP.

Hay una forma más de sincronización: usar seqlocks y RCU.

Mutexes en sistemas de archivos.