fbpx
Wikipedia

Spinlock

En ingeniería de software , un spinlock es un bloqueo que hace que un hilo que intenta adquirirlo simplemente espere en un bucle ("girar" en inglés "spin") mientras comprueba repetidamente si el bloqueo(lock) está disponible. Como el hilo permanece activo pero no está realizando una tarea útil, el uso de dicho bloqueo es una especie de espera ocupada . Una vez adquiridos, los spinlocks generalmente se mantendrán hasta que se liberen explícitamente, aunque en algunas implementaciones se pueden liberar automáticamente si el hilo que está esperando en (lo que contiene el bloqueo) bloquea, o "se va a dormir".

Debido a que evitan la sobrecarga de la reprogramación de procesos del sistema operativo o el cambio de contexto , los spinlocks son eficientes si es probable que los hilos se bloqueen solo por períodos cortos. Por esta razón, los kernels del sistema operativo a menudo usan spinlocks. Sin embargo, los spinlocks se vuelven un desperdicio si se mantienen durante más tiempo, ya que pueden evitar que otros hilos se ejecuten y requieren reprogramación. Cuanto más tiempo un hilo mantiene un bloqueo, mayor es el riesgo de que el programador(scheduler) del sistema operativo interrumpa el hilo mientras mantiene el bloqueo. Si esto sucede, otros hilos se dejarán "girando" (tratando repetidamente de adquirir el candado), mientras que el hilo que sujeta el candado no está avanzando hacia su liberación. El resultado es un aplazamiento indefinido hasta que el hilo que sujeta la cerradura pueda terminar y soltarlo. Esto es especialmente cierto en un sistema de procesador único, donde cada subproceso en espera de la misma prioridad puede desperdiciar su cantidad (tiempo asignado en que se puede ejecutar un subproceso) girando hasta que el subproceso que contiene el bloqueo finalice finalmente.

Implementar bloqueos de giro correctamente ofrece desafíos porque los programadores deben tener en cuenta la posibilidad de acceso simultáneo a la cerradura, lo que podría causar condiciones de carrera . En general, dicha implementación solo es posible con instrucciones especiales en lenguaje de ensamblaje, como operaciones atómicas de prueba y configuración , y no se puede implementar fácilmente en lenguajes de programación que no admitan operaciones verdaderamente atómicas. [1] En arquitecturas sin tales operaciones, o si se requiere la implementación de lenguaje de alto nivel, se puede usar un algoritmo de bloqueo no atómico, por ejemplo, el algoritmo de Peterson . Sin embargo, tal implementación puede requerir más memoria que un spinlock, ser más lenta para permitir el progreso después del desbloqueo, y puede no ser implementable en un lenguaje de alto nivel si se permite la ejecución fuera de orden .

Implementación de ejemplo

El siguiente ejemplo usa el lenguaje de ensamblaje x86 para implementar un spinlock. Funcionará en cualquier procesador compatible con Intel 80386.

; Sintaxis de Intel locked: ; La variable de bloqueo. 1 = bloqueado, 0 = desbloqueado.  dd 0 spin_lock:  mov eax, 1 ; Establece el registro EAX a 1.  xchg eax, [locked] ; Cambia automáticamente el registro EAX  ; con la variable de bloqueo.  ; Esto siempre va a guardar 1 en el bloqueo,  ; dejando el valor previo en el registro EAX.  test eax, eax ; Prueba el EAX consigo mismo. Entre otras cosas, esto va  ; a establecer el Indicador Cero del procesador si EAX es 0.  ; Si EAX es 0, entonces el bloqueo estaba desbloqueado y  ; lo acabamos de desbloquear.  ; En caso contrario, EAX es 1 y no adquirimos el bloqueo.  jnz spin_lock ; Salta hacia la instrucción MOV si el Indicador Cero no está  ; establecido; el bloqueo estaba bloqueado anteriormente,  ; entonces debemos girar en círculos (spin) hasta que se desbloquee.  ret ; El bloqueo fue adquirido, se vuelve a la función que llamó  ; al spinlock. spin_unlock:  xor eax, eax ; Se establece el registro EAX a 0.  xchg eax, [locked] ; Se cambia automáticamente el registro  ; EAX con la variable de bloqueo.  ret ; el bloqueo fue liberado. 

Optimizaciones significativas

La implementación simple anterior funciona en todas las CPU que usan la arquitectura x86. Sin embargo, varias optimizaciones de rendimiento son posibles:

En las implementaciones posteriores de la arquitectura x86, spin_unlock puede usar de forma segura un MOV desbloqueado en lugar del XCHG bloqueado más lento. Esto se debe a sutiles reglas de ordenación de memoria que lo respaldan, aunque MOV no es una barrera de memoria completa. Sin embargo, algunos procesadores (algunos procesadores Cyrix , algunas revisiones de Intel Pentium Pro (debido a errores) y sistemas Pentium e i486 SMP anteriores) harán lo incorrecto y los datos protegidos por el bloqueo podrían dañarse. En la mayoría de las arquitecturas que no son x86, se debe utilizar una barrera de memoria explícita o instrucciones atómicas (como en el ejemplo). En algunos sistemas, como IA-64 , hay instrucciones especiales de "desbloqueo" que proporcionan la ordenación de memoria necesaria.

Para reducir el tráfico de bus entre CPU, el código que intenta adquirir un bloqueo debe leer en bucle sin intentar escribir nada hasta que lea un valor cambiado. Debido a los protocolos de caché MESI , esto hace que la línea de caché para el bloqueo se convierta en "Compartida"; entonces, notablemente, no hay tráfico en el bus mientras una CPU espera el bloqueo. Esta optimización es efectiva en todas las arquitecturas de CPU que tienen un caché por CPU, porque MESI está muy extendida.

Alternativas

La implementación simple anterior funciona en todas las CPU que usan la arquitectura x86. Sin embargo, varias optimizaciones de rendimiento son posibles:


  1. No adquieras el candado En muchas situaciones, es posible diseñar estructuras de datos que no requieren bloqueo , por ejemplo, mediante el uso de datos por subproceso o por CPU y la desactivación de interrupciones. 
  2. Cambie a un hilo diferente mientras espera. Esto normalmente implica unir el hilo actual a una cola de hilos esperando el bloqueo, seguido de cambiar a otro hilo que está listo para hacer un trabajo útil. Este esquema también tiene la ventaja de que garantiza que la falta de recursos no ocurra siempre que todos los hilos abandonen los bloqueos que adquieren y se pueden tomar decisiones sobre qué hilo debe avanzar primero. Los spinlocks que nunca implican conmutación, utilizables por sistemas operativos en tiempo real , a veces se llaman spinlocks sin formato . [2]

La mayoría de sistemas operativos (incluyendo Solaris, Mac OS X y FreeBSD) utiliza una aproximación híbrida llamó "adaptive mutex". La idea es para utilizar un spinlock cuándo este intentando acceder un recurso cerrado por un hilo que corra actualmente, pero para dormir si el hilo no esta actualmente corriendo. (El último es siempre el caso en sistemas de procesador único.)[1]

OpenBSD intentó reemplazar los "spinlocks" con bloqueos de tickets que aplicaban el comportamiento " primero en entrar, primero en salir" , pero esto dio como resultado un mayor uso de la CPU en el kernel y aplicaciones más grandes, como Firefox , cada vez más lentas. [4] [5]

Ve también

Referencias

  1. Operating System Concepts (Fourth edición). Addison-Wesley. 1994. p. 198. ISBN 0-201-59292-4. 

Enlaces externos

  • pthread_Documentación_de cerradura del espín de Las Especificaciones de Base de Grupo Abiertas Asunto 6, IEEE Std 1003.1, 2004 Edición
  • Variedad de spinlock Implementaciones de Concurrency Caja
  • Usuario "de artículo-Cerraduras de Espín del Nivel - Hilos, Procesa & IPC" por Gert Boddaert
  • Papel "El Rendimiento de Alternativas de Cerradura del Espín para Multiprocesadores de Memoria Compartida" por Thomas E. Anderson
  • Algoritmos "de papel para Sincronización Escalable encima Multiprocesadores de Memoria Compartida" por John M. Mellor-Crummey Y Michael L. Scott. Este papel recibió el 2006 Dijkstra Premio en Informática Distribuida.
  • Espín-Cerradura de Espera por Jeffrey Richter
  • Austria C++ SpinLock Referencia de Clase
  • Interlocked Acceso variable(Windows)
  • Sistemas operativos: Tres Piezas Fáciles (Capítulo: Cerraduras)
  •   Datos: Q570276

spinlock, texto, sigue, traducción, defectuosa, quieres, colaborar, wikipedia, busca, artículo, original, mejora, esta, traducción, copia, pega, siguiente, código, página, discusión, autor, este, artículo, subst, aviso, traducido, ingeniería, software, spinloc. El texto que sigue es una traduccion defectuosa Si quieres colaborar con Wikipedia busca el articulo original y mejora esta traduccion Copia y pega el siguiente codigo en la pagina de discusion del autor de este articulo subst Aviso mal traducido Spinlock En ingenieria de software un spinlock es un bloqueo que hace que un hilo que intenta adquirirlo simplemente espere en un bucle girar en ingles spin mientras comprueba repetidamente si el bloqueo lock esta disponible Como el hilo permanece activo pero no esta realizando una tarea util el uso de dicho bloqueo es una especie de espera ocupada Una vez adquiridos los spinlocks generalmente se mantendran hasta que se liberen explicitamente aunque en algunas implementaciones se pueden liberar automaticamente si el hilo que esta esperando en lo que contiene el bloqueo bloquea o se va a dormir Debido a que evitan la sobrecarga de la reprogramacion de procesos del sistema operativo o el cambio de contexto los spinlocks son eficientes si es probable que los hilos se bloqueen solo por periodos cortos Por esta razon los kernels del sistema operativo a menudo usan spinlocks Sin embargo los spinlocks se vuelven un desperdicio si se mantienen durante mas tiempo ya que pueden evitar que otros hilos se ejecuten y requieren reprogramacion Cuanto mas tiempo un hilo mantiene un bloqueo mayor es el riesgo de que el programador scheduler del sistema operativo interrumpa el hilo mientras mantiene el bloqueo Si esto sucede otros hilos se dejaran girando tratando repetidamente de adquirir el candado mientras que el hilo que sujeta el candado no esta avanzando hacia su liberacion El resultado es un aplazamiento indefinido hasta que el hilo que sujeta la cerradura pueda terminar y soltarlo Esto es especialmente cierto en un sistema de procesador unico donde cada subproceso en espera de la misma prioridad puede desperdiciar su cantidad tiempo asignado en que se puede ejecutar un subproceso girando hasta que el subproceso que contiene el bloqueo finalice finalmente Implementar bloqueos de giro correctamente ofrece desafios porque los programadores deben tener en cuenta la posibilidad de acceso simultaneo a la cerradura lo que podria causar condiciones de carrera En general dicha implementacion solo es posible con instrucciones especiales en lenguaje de ensamblaje como operaciones atomicas de prueba y configuracion y no se puede implementar facilmente en lenguajes de programacion que no admitan operaciones verdaderamente atomicas 1 En arquitecturas sin tales operaciones o si se requiere la implementacion de lenguaje de alto nivel se puede usar un algoritmo de bloqueo no atomico por ejemplo el algoritmo de Peterson Sin embargo tal implementacion puede requerir mas memoria que un spinlock ser mas lenta para permitir el progreso despues del desbloqueo y puede no ser implementable en un lenguaje de alto nivel si se permite la ejecucion fuera de orden Indice 1 Implementacion de ejemplo 2 Optimizaciones significativas 3 Alternativas 4 Ve tambien 5 Referencias 6 Enlaces externosImplementacion de ejemplo EditarEl siguiente ejemplo usa el lenguaje de ensamblaje x86 para implementar un spinlock Funcionara en cualquier procesador compatible con Intel 80386 Sintaxis de Intel locked La variable de bloqueo 1 bloqueado 0 desbloqueado dd 0 spin lock mov eax 1 Establece el registro EAX a 1 xchg eax locked Cambia automaticamente el registro EAX con la variable de bloqueo Esto siempre va a guardar 1 en el bloqueo dejando el valor previo en el registro EAX test eax eax Prueba el EAX consigo mismo Entre otras cosas esto va a establecer el Indicador Cero del procesador si EAX es 0 Si EAX es 0 entonces el bloqueo estaba desbloqueado y lo acabamos de desbloquear En caso contrario EAX es 1 y no adquirimos el bloqueo jnz spin lock Salta hacia la instruccion MOV si el Indicador Cero no esta establecido el bloqueo estaba bloqueado anteriormente entonces debemos girar en circulos spin hasta que se desbloquee ret El bloqueo fue adquirido se vuelve a la funcion que llamo al spinlock spin unlock xor eax eax Se establece el registro EAX a 0 xchg eax locked Se cambia automaticamente el registro EAX con la variable de bloqueo ret el bloqueo fue liberado Optimizaciones significativas EditarLa implementacion simple anterior funciona en todas las CPU que usan la arquitectura x86 Sin embargo varias optimizaciones de rendimiento son posibles En las implementaciones posteriores de la arquitectura x86 spin unlock puede usar de forma segura un MOV desbloqueado en lugar del XCHG bloqueado mas lento Esto se debe a sutiles reglas de ordenacion de memoria que lo respaldan aunque MOV no es una barrera de memoria completa Sin embargo algunos procesadores algunos procesadores Cyrix algunas revisiones de Intel Pentium Pro debido a errores y sistemas Pentium e i486 SMP anteriores haran lo incorrecto y los datos protegidos por el bloqueo podrian danarse En la mayoria de las arquitecturas que no son x86 se debe utilizar una barrera de memoria explicita o instrucciones atomicas como en el ejemplo En algunos sistemas como IA 64 hay instrucciones especiales de desbloqueo que proporcionan la ordenacion de memoria necesaria Para reducir el trafico de bus entre CPU el codigo que intenta adquirir un bloqueo debe leer en bucle sin intentar escribir nada hasta que lea un valor cambiado Debido a los protocolos de cache MESI esto hace que la linea de cache para el bloqueo se convierta en Compartida entonces notablemente no hay trafico en el bus mientras una CPU espera el bloqueo Esta optimizacion es efectiva en todas las arquitecturas de CPU que tienen un cache por CPU porque MESI esta muy extendida Alternativas EditarLa implementacion simple anterior funciona en todas las CPU que usan la arquitectura x86 Sin embargo varias optimizaciones de rendimiento son posibles No adquieras el candado En muchas situaciones es posible disenar estructuras de datos que no requieren bloqueo por ejemplo mediante el uso de datos por subproceso o por CPU y la desactivacion de interrupciones Cambie a un hilo diferente mientras espera Esto normalmente implica unir el hilo actual a una cola de hilos esperando el bloqueo seguido de cambiar a otro hilo que esta listo para hacer un trabajo util Este esquema tambien tiene la ventaja de que garantiza que la falta de recursos no ocurra siempre que todos los hilos abandonen los bloqueos que adquieren y se pueden tomar decisiones sobre que hilo debe avanzar primero Los spinlocks que nunca implican conmutacion utilizables por sistemas operativos en tiempo real a veces se llaman spinlocks sin formato 2 La mayoria de sistemas operativos incluyendo Solaris Mac OS X y FreeBSD utiliza una aproximacion hibrida llamo adaptive mutex La idea es para utilizar un spinlock cuando este intentando acceder un recurso cerrado por un hilo que corra actualmente pero para dormir si el hilo no esta actualmente corriendo El ultimo es siempre el caso en sistemas de procesador unico 1 OpenBSD intento reemplazar los spinlocks con bloqueos de tickets que aplicaban el comportamiento primero en entrar primero en salir pero esto dio como resultado un mayor uso de la CPU en el kernel y aplicaciones mas grandes como Firefox cada vez mas lentas 4 5 Ve tambien EditarSincronizacion Espin ocupado Punto muerto Seqlock Cerradura de TicketReferencias Editar Operating System Concepts Fourth edicion Addison Wesley 1994 p 198 ISBN 0 201 59292 4 Enlaces externos Editarpthread Documentacion de cerradura del espin de Las Especificaciones de Base de Grupo Abiertas Asunto 6 IEEE Std 1003 1 2004 Edicion Variedad de spinlock Implementaciones de Concurrency Caja Usuario de articulo Cerraduras de Espin del Nivel Hilos Procesa amp IPC por Gert Boddaert Papel El Rendimiento de Alternativas de Cerradura del Espin para Multiprocesadores de Memoria Compartida por Thomas E Anderson Algoritmos de papel para Sincronizacion Escalable encima Multiprocesadores de Memoria Compartida por John M Mellor Crummey Y Michael L Scott Este papel recibio el 2006 Dijkstra Premio en Informatica Distribuida Espin Cerradura de Espera por Jeffrey Richter Austria C SpinLock Referencia de Clase Interlocked Acceso variable Windows Sistemas operativos Tres Piezas Faciles Capitulo Cerraduras Datos Q570276 Obtenido de https es wikipedia org w index php title Spinlock amp oldid 146384515, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos