Articulo de referencia

Coherencia de lanzamiento

La consistencia de liberación es uno de los modelos de consistencia basados ​​en la sincronización que se utilizan en la programación concurrente (por ejemplo, en memoria compar...

La consistencia de liberación es uno de los modelos de consistencia basados ​​en la sincronización que se utilizan en la programación concurrente (por ejemplo, en memoria compartida distribuida , transacciones distribuidas , etc.).

Introducción

En los sistemas modernos de computación paralela , es fundamental mantener la consistencia de la memoria para evitar resultados indeseables. Los modelos de consistencia estricta, como la consistencia secuencial, se componen de forma intuitiva, pero pueden resultar bastante restrictivos en términos de rendimiento, ya que deshabilitan el paralelismo a nivel de instrucciones , ampliamente utilizado en la programación secuencial. Para lograr un mejor rendimiento, se han explorado algunos modelos menos estrictos, siendo la consistencia de liberación un intento de relajación considerable. [ 1 ]

consistencia de lanzamiento frente a consistencia secuencial

Estructura del hardware y esfuerzo a nivel de programa

La consistencia secuencial se puede lograr simplemente mediante la implementación de hardware, mientras que la consistencia de liberación también se basa en la observación de que la mayoría de los programas paralelos están correctamente sincronizados. A nivel de programación, la sincronización se aplica para programar claramente un acceso a memoria determinado en un hilo para que ocurra después de otro. Cuando se accede a una variable sincronizada, el hardware se asegura de que todas las escrituras locales de un procesador se hayan propagado a todos los demás procesadores y que todas las escrituras de otros procesadores se vean y se recopilen. En el modelo de consistencia de liberación, la acción de entrar y salir de una sección crítica se clasifica como adquisición y liberación , y para cada caso, se debe incluir código explícito en el programa que indique cuándo realizar estas operaciones .

Condiciones para un resultado secuencial consistente

En general, una memoria compartida distribuida es consistente en cuanto a su liberación si obedece las siguientes reglas: [ 2 ]

1. Antes de acceder a una variable compartida, todas las adquisiciones previas realizadas por este procesador deben haberse completado.

2. Antes de realizar una liberación, todas las lecturas y escrituras previas realizadas por este proceso deben haber finalizado.

3. Los accesos de adquisición y liberación deben ser consistentes con el procesador .

Si se cumplen las condiciones anteriores y el programa está correctamente sincronizado (es decir, los procesadores implementan correctamente las operaciones de adquisición y liberación), los resultados de cualquier ejecución serán exactamente los mismos que si se hubiera ejecutado siguiendo la consistencia secuencial. En efecto, los accesos a variables compartidas se separan en bloques de operaciones atómicas mediante las primitivas de adquisición y liberación , lo que evita las condiciones de carrera y la intercalación entre bloques.

Implementaciones

Un ejemplo de consistencia de liberación implementada mediante la operación de liberación de bloqueo.

La liberación de un bloqueo puede considerarse un tipo de sincronización de liberación. Supongamos que se realiza una operación de bucle utilizando el código que se muestra a la derecha. Dos hilos pretenden entrar en una sección crítica y leer el valor más reciente de a , para luego salir de la sección crítica. El código muestra que el hilo 0 adquiere primero el bloqueo y entra en la sección crítica. Para ejecutarse correctamente, P1 debe leer el último valor de a escrito por P0. En ese caso, solo un hilo puede estar en la sección crítica a la vez. Por lo tanto, la sincronización misma ha asegurado que la adquisición exitosa del bloqueo en P1 ocurra después de la liberación del bloqueo por parte de P0. Además, debe garantizarse el orden S2 -> S3, ya que P0 debe propagar el nuevo valor de a a P1. Por la misma razón, S5 debe ocurrir después de S4. [ 3 ]

La corrección no se ve afectada si se producen accesos a memoria después de la emisión del desbloqueo, antes de que este se complete, o si se producen accesos a memoria antes de la emisión del bloqueo, después de su adquisición. Sin embargo, el código en la sección crítica no puede emitirse antes de que se complete la adquisición del bloqueo, ya que la exclusión mutua podría no estar garantizada.

Espera posterior

Un ejemplo de consistencia de lanzamiento implementado mediante sincronización posterior a la espera.

La sincronización posterior a la espera es otra forma de implementación de la consistencia de liberación. Como se muestra en el código de la derecha, la corrección se puede garantizar si las operaciones posteriores ocurren solo después de que se hayan completado todos los accesos a memoria, especialmente el almacenamiento en 'a'. Además, la operación de lectura no debe ejecutarse hasta que la operación de espera haya finalizado. S2 actúa como una sincronización de liberación y S3 actúa como una sincronización de adquisición. Por lo tanto, S2 necesita evitar que se produzcan ejecuciones anteriores después de ella, y S3 necesita evitar que se produzcan ejecuciones posteriores antes de ella. De igual manera, S3 no necesita evitar que se produzcan ejecuciones anteriores después de ella.

consistencia de liberación diferida

Escribir propagación en el modelo de consistencia de versiones

La consistencia de liberación diferida es una optimización adicional de la consistencia de liberación. Presupone que el hilo que ejecuta un acceso de adquisición no necesita los valores escritos por otros hilos hasta que el acceso de adquisición haya finalizado. Por lo tanto, todo el comportamiento de coherencia puede retrasarse y la temporización para la propagación de escritura puede ajustarse. [ 4 ]

Ejemplo

Consideremos los escenarios descritos en la imagen de la derecha. Este caso muestra la propagación de escritura en un sistema con coherencia de caché basado en el modelo de consistencia de liberación. La variable ` datum` se propaga completamente antes de la propagación de `datumIsReady`. Sin embargo, el valor de `datum` no es necesario hasta después del acceso de sincronización de adquisición en P1, y puede propagarse junto con `datumIsReady` sin afectar el resultado del programa.

Escribir propagación en el modelo de consistencia de liberación diferida

La segunda imagen muestra el caso en el que se aplica la consistencia de liberación diferida. En este escenario, todos los valores escritos antes de la sincronización de liberación se retrasan y se propagan junto con la propagación del acceso a la liberación. Por lo tanto, datum y datumIsReady se propagan juntos en el punto de liberación.

"TreadMarks" [ 5 ] es una aplicación real de la consistencia de liberación diferida.

Mejora del rendimiento en relación con la consistencia de las versiones.

La consistencia de liberación diferida puede superar a la consistencia de liberación en ciertos casos. Si el sistema tiene poco ancho de banda entre procesadores o sufre mucho por la sobrecarga causada por la propagación frecuente de pequeños bloques de datos en comparación con la propagación infrecuente de grandes bloques de datos, LRC puede mejorar significativamente el rendimiento.

Consideremos un sistema que emplea una abstracción de memoria compartida a nivel de software en lugar de una implementación de hardware real. En este sistema, la propagación de escritura se ejecuta a nivel de página, lo que hace que sea extremadamente costoso propagar una página completa cuando solo se modifica un bloque de ella. Por lo tanto, la propagación de escritura se retrasa hasta que se alcanza un punto de sincronización de liberación, momento en el que se modifica la página completa y se propaga.

Inconveniente

LRC requiere realizar la propagación de escrituras en bloque en el punto de liberación de la sincronización. Propagar una cantidad tan grande de escrituras a la vez ralentizará el acceso de liberación y el posterior acceso de adquisición. Por lo tanto, difícilmente mejorará el rendimiento de un sistema de coherencia de caché de hardware.

Consistencia de lanzamiento frente a otros modelos de consistencia relajada

Ordenación débil ( consistencia débil )

La consistencia de liberación exige más de los programadores en comparación con el ordenamiento débil. Deben etiquetar los accesos de sincronización como adquisiciones o liberaciones, no solo como accesos de sincronización. De forma similar al ordenamiento débil, la consistencia de liberación permite al compilador reordenar libremente las cargas y los almacenamientos, excepto que no pueden migrar hacia arriba más allá de una sincronización de adquisición ni hacia abajo más allá de una sincronización de liberación. Sin embargo, la flexibilidad y la ventaja de rendimiento de la consistencia de liberación se obtienen a costa de requerir que los accesos de sincronización se identifiquen correctamente como adquisiciones o liberaciones. A diferencia del ordenamiento débil, los accesos de sincronización no se pueden identificar fácilmente solo con los códigos de operación de las instrucciones. Por lo tanto, recae sobre los programadores la responsabilidad de identificar correctamente los accesos de sincronización de adquisición y liberación. [ 3 ] [ 6 ]

Para garantizar la consistencia del procesador, todos los procesos ven las escrituras de cada procesador en el orden en que se iniciaron. Las escrituras de diferentes procesadores pueden no verse en el mismo orden, excepto que las escrituras en la misma ubicación se verán en el mismo orden en todas partes. En comparación con la consistencia del procesador, la consistencia de liberación es más flexible, ya que no impone el orden entre las escrituras que se aplica en la consistencia del procesador. No se ajusta a la intuición de los programadores, ya que es relativamente menos restrictiva para las optimizaciones del compilador.

Véase también

Referencias

  1. Consistencia de memoria y ordenación de eventos en multiprocesadores de memoria compartida escalables, por Kourosh Gharachorloo, Daniel Lenoski, James Laudon, Phillip Gibbons, Anoop Gupta y John Hennessy, publicado en las Actas de ISCA '90 del 17.º simposio internacional anual sobre arquitectura de computadoras.
  2. Tanenbaum, Andrew (1995). Sistemas operativos distribuidos . Pearson Education. págs. 327–330 . ISBN  9788177581799.
  3. 1 2 Solihin, Yan (2015). Fundamentos de la arquitectura multinúcleo paralela . Chapman & Hall/CRC Computational Science. págs. 315–320 . ISBN  9781482211184.
  4. Consistencia de liberación diferida para memoria compartida distribuida por software por Pete Keleher, Alan L. Cox y Willy Zwaenepoel, publicado en Proceedings ISCA '92, Actas del 19.º simposio internacional anual sobre arquitectura de computadoras.
  5. TreadMarks: memoria compartida distribuida en estaciones de trabajo y sistemas operativos estándar por Pete Keleher, Alan L. Cox, Sandhya Dwarkadas y Willy Zwaenepoel publicado en WTEC'94 Actas de la Conferencia Técnica de Invierno de USENIX de 1994
  6. Culler, David; Gupta, Anoop; Singh, Jaswinder (1997). Arquitectura de computadoras paralelas: un enfoque de hardware/software . Morgan Kaufmann Publishers Inc. págs. 620–626 . ISBN  1558603433.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Release_consistency&oldid=1329308410 "