in

spinlock – ¿Qué son exactamente los «spin-locks»?

apple touch icon@2

Cuando usa bloqueos regulares (mutex, secciones críticas, etc.), el sistema operativo pone su hilo en el estado de ESPERA y se adelanta programando otros subprocesos en el mismo núcleo. Esto tiene una penalización de rendimiento si el tiempo de espera es realmente corto, porque su hilo ahora tiene que esperar una preferencia para recibir el tiempo de CPU nuevamente.

Además, los objetos del kernel no están disponibles en todos los estados del kernel, como en un manejador de interrupciones o cuando la paginación no está disponible, etc.

Los Spinlocks no causan preferencia, sino que esperan en un bucle («giro») hasta que el otro núcleo libere el bloqueo. Esto evita que el hilo pierda su cuántico y continúe tan pronto como se libere el bloqueo. El simple mecanismo de spinlocks permite que un kernel lo utilice en casi cualquier estado.

Es por eso que en una máquina de un solo núcleo, un spinlock es simplemente una «desactivación de interrupciones» o «aumento de IRQL» que evita la programación de subprocesos por completo.

Los Spinlocks finalmente permiten que los kernels eviten los «Big Kernel Lock» (un bloqueo adquirido cuando el núcleo ingresa al kernel y se libera al salir) y tienen un bloqueo granular sobre las primitivas del kernel, lo que provoca un mejor multiprocesamiento en máquinas de múltiples núcleos y, por lo tanto, un mejor rendimiento.

EDITAR: Surgió una pregunta: «¿Eso significa que debería usar spinlocks siempre que sea posible?» y trataré de contestarlo:

Como mencioné, los Spinlocks solo son útiles en lugares donde el tiempo de espera anticipado es más corto que un cuanto (léase: milisegundos) y la preferencia no tiene mucho sentido (por ejemplo, los objetos del kernel no están disponibles).

Si se desconoce el tiempo de espera o si está en modo de usuario, los Spinlocks no son eficientes. Consume el 100% del tiempo de CPU en el núcleo en espera mientras verifica si hay un bloqueo de giro disponible. Evita que otros subprocesos se ejecuten en ese núcleo hasta que expire su cuanto. Este escenario solo es factible para ráfagas cortas a nivel de kernel y es poco probable que sea una opción para una aplicación en modo de usuario.

Aquí hay una pregunta sobre SO que aborda eso: Spinlocks, ¿qué tan útiles son?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

java for loop

para bucle en java

qGBCjj3uKaFx4SQ5u38SLj 1200 80

Crossplay de Modern Warfare: cómo jugar con amigos en todas las plataformas