stringtranslate.com

memoria transaccional

En informática e ingeniería , la memoria transaccional intenta simplificar la programación concurrente permitiendo que un grupo de instrucciones de carga y almacenamiento se ejecuten de forma atómica . Es un mecanismo de control de concurrencia análogo a las transacciones de bases de datos para controlar el acceso a la memoria compartida en computación concurrente . Los sistemas de memoria transaccional proporcionan abstracción de alto nivel como alternativa a la sincronización de subprocesos de bajo nivel. Esta abstracción permite la coordinación entre lecturas y escrituras simultáneas de datos compartidos en sistemas paralelos. [1]

Motivación

Atomicidad entre dos transacciones paralelas con conflicto

En la programación concurrente, se requiere sincronización cuando subprocesos paralelos intentan acceder a un recurso compartido. Las construcciones de sincronización de subprocesos de bajo nivel, como los bloqueos, son pesimistas y prohíben que los subprocesos que están fuera de una sección crítica ejecuten el código protegido por la sección crítica. El proceso de aplicar y liberar bloqueos a menudo funciona como una sobrecarga adicional en cargas de trabajo con pocos conflictos entre subprocesos. La memoria transaccional proporciona un control de concurrencia optimista al permitir que los subprocesos se ejecuten en paralelo con una interferencia mínima. [2] El objetivo de los sistemas de memoria transaccional es admitir de forma transparente regiones de código marcadas como transacciones imponiendo atomicidad , coherencia y aislamiento .

Una transacción es una colección de operaciones que pueden ejecutar y confirmar cambios siempre que no exista un conflicto. Cuando se detecta un conflicto, una transacción volverá a su estado inicial (antes de cualquier cambio) y se volverá a ejecutar hasta que se eliminen todos los conflictos. Antes de una confirmación exitosa, el resultado de cualquier operación es puramente especulativo dentro de una transacción. A diferencia de la sincronización basada en bloqueos, donde las operaciones se serializan para evitar la corrupción de datos, las transacciones permiten un paralelismo adicional siempre que pocas operaciones intenten modificar un recurso compartido. Dado que el programador no es responsable de identificar explícitamente los bloqueos o el orden en que se adquieren, los programas que utilizan memoria transaccional no pueden producir un punto muerto . [2]

Con estas construcciones implementadas, la memoria transaccional proporciona una abstracción de programación de alto nivel al permitir a los programadores encerrar sus métodos dentro de bloques transaccionales. Las implementaciones correctas garantizan que los datos no se puedan compartir entre subprocesos sin realizar una transacción y producir un resultado serializable . Por ejemplo, el código se puede escribir como:

def  transfer_money ( from_account ,  to_account ,  monto ): """Transferir dinero de una cuenta a otra.""" con transacción (): from_account . saldo -= monto a_cuenta . saldo += importe         

En el código, el bloque definido por "transacción" tiene garantizada la atomicidad, la coherencia y el aislamiento mediante la implementación de la memoria transaccional subyacente y es transparente para el programador. Las variables dentro de la transacción están protegidas de conflictos externos, lo que garantiza que se transfiera la cantidad correcta o que no se tome ninguna medida. Tenga en cuenta que aún es posible que se produzcan errores relacionados con la concurrencia en programas que utilizan una gran cantidad de transacciones, especialmente en implementaciones de software donde la biblioteca proporcionada por el lenguaje no puede imponer el uso correcto. Los errores introducidos a través de transacciones a menudo pueden ser difíciles de depurar ya que no se pueden colocar puntos de interrupción dentro de una transacción. [2]

La memoria transaccional está limitada porque requiere una abstracción de memoria compartida. Aunque los programas de memoria transaccional no pueden producir un punto muerto, los programas aún pueden sufrir un bloqueo activo o falta de recursos . Por ejemplo, las transacciones más largas pueden revertirse repetidamente en respuesta a múltiples transacciones más pequeñas, lo que desperdicia tiempo y energía. [2]

Hardware versus software

Memoria transaccional de hardware que utiliza bits de lectura y escritura

La abstracción de la atomicidad en la memoria transaccional requiere un mecanismo de hardware para detectar conflictos y deshacer cualquier cambio realizado en los datos compartidos. [3] Los sistemas de memoria transaccional de hardware pueden comprender modificaciones en los procesadores, caché y protocolo de bus para soportar transacciones. [4] [5] [6] [7] [8] Los valores especulativos en una transacción deben almacenarse en un buffer y permanecer invisibles para otros subprocesos hasta el momento de la confirmación. Se utilizan búferes grandes para almacenar valores especulativos y al mismo tiempo evitar la propagación de escritura a través del protocolo de coherencia de caché subyacente . Tradicionalmente, los buffers se han implementado utilizando diferentes estructuras dentro de la jerarquía de memoria, como colas de almacenamiento o cachés. Los buffers más alejados del procesador, como el caché L2, pueden contener valores más especulativos (hasta unos pocos megabytes). El tamaño óptimo de un buffer aún está bajo debate debido al uso limitado de transacciones en programas comerciales. [3] En una implementación de caché, las líneas de caché generalmente se aumentan con bits de lectura y escritura. Cuando el controlador de hardware recibe una solicitud, utiliza estos bits para detectar un conflicto. Si se detecta un conflicto de serialización en una transacción paralela, los valores especulativos se descartan. Cuando se utilizan cachés, el sistema puede introducir el riesgo de conflictos falsos debido al uso de granularidad de línea de caché. [3] El enlace de carga/almacenamiento condicional (LL/SC) que ofrecen muchos procesadores RISC puede verse como el soporte de memoria transaccional más básico; sin embargo, LL/SC normalmente opera con datos del tamaño de una palabra de máquina nativa, por lo que solo se admiten transacciones de una sola palabra. [4] Aunque la memoria transaccional de hardware proporciona el máximo rendimiento en comparación con las alternativas de software, en este momento se ha observado un uso limitado.

La memoria transaccional de software proporciona semántica de memoria transaccional en una biblioteca de tiempo de ejecución de software o en el lenguaje de programación, [9] y requiere un soporte mínimo de hardware (normalmente una operación atómica de comparación e intercambio , o equivalente). Como desventaja, las implementaciones de software suelen tener una penalización en el rendimiento, en comparación con las soluciones de hardware. La aceleración de hardware puede reducir algunos de los gastos generales asociados con la memoria transaccional de software.

Debido a la naturaleza más limitada de la memoria transaccional del hardware (en las implementaciones actuales), el software que la utiliza puede requerir ajustes bastante extensos para beneficiarse plenamente de ella. Por ejemplo, el asignador de memoria dinámica puede tener una influencia significativa en el rendimiento y, de la misma manera, el relleno de la estructura puede afectar el rendimiento (debido a la alineación de la caché y a problemas de uso compartido falso); En el contexto de una máquina virtual, varios subprocesos en segundo plano pueden provocar transacciones inesperadas. [10]

Historia

Una de las primeras implementaciones de memoria transaccional fue el búfer de almacenamiento cerrado utilizado en los procesadores Crusoe y Efficeon de Transmeta . Sin embargo, esto solo se usó para facilitar optimizaciones especulativas para la traducción binaria, en lugar de cualquier forma de multiproceso especulativo o exponerlo directamente a los programadores. Azul Systems también implementó memoria transaccional de hardware para acelerar sus dispositivos Java , pero esto también se ocultó a los externos. [11]

Sun Microsystems implementó memoria transaccional de hardware y una forma limitada de subprocesos múltiples especulativos en su procesador Rock de alta gama . Esta implementación demostró que podría usarse para elisión de bloqueos y sistemas de memoria transaccional híbrida más complejos, donde las transacciones se manejan con una combinación de hardware y software. El procesador Rock fue cancelado en 2009, justo antes de la adquisición por parte de Oracle ; Si bien los productos reales nunca se lanzaron al mercado, los investigadores dispusieron de varios sistemas prototipo. [11]

En 2009, AMD propuso Advanced Synchronization Facility (ASF), un conjunto de extensiones x86 que proporcionan una forma muy limitada de soporte de memoria transaccional de hardware. El objetivo era proporcionar primitivas de hardware que pudieran usarse para sincronización de nivel superior, como memoria transaccional de software o algoritmos sin bloqueo. Sin embargo, AMD no ha anunciado si se utilizará ASF en sus productos y, de ser así, en qué plazo. [11]

Más recientemente, IBM anunció en 2011 que Blue Gene/Q tenía soporte de hardware tanto para memoria transaccional como para subprocesos múltiples especulativos. La memoria transaccional se podría configurar en dos modos; el primero es un modo desordenado y de versión única, donde una escritura de una transacción causa un conflicto con cualquier transacción que lea la misma dirección de memoria. El segundo modo es para subprocesos múltiples especulativos, proporcionando una memoria transaccional ordenada y con múltiples versiones. Los subprocesos especulativos pueden tener diferentes versiones de la misma dirección de memoria y la implementación de hardware realiza un seguimiento de la antigüedad de cada subproceso. Los subprocesos más jóvenes pueden acceder a datos de subprocesos más antiguos (pero no al revés) y las escrituras en la misma dirección se basan en el orden de los subprocesos. En algunos casos, las dependencias entre subprocesos pueden provocar que las versiones más recientes aborten. [11]

Las Extensiones de sincronización transaccional (TSX) de Intel están disponibles en algunos de los procesadores Skylake . También se implementó anteriormente en los procesadores Haswell y Broadwell , pero las implementaciones resultaron defectuosas en ambas ocasiones y la compatibilidad con TSX se deshabilitó. La especificación TSX describe la API de memoria transaccional para uso de los desarrolladores de software, pero oculta detalles sobre la implementación técnica. [11] La arquitectura ARM tiene una extensión similar. [12]

A partir de GCC 4.7, está disponible una biblioteca experimental para memoria transaccional que utiliza una implementación híbrida. La variante PyPy de Python también introduce memoria transaccional al lenguaje.

Implementaciones disponibles

Ver también

Referencias

  1. ^ Harris, Tim; Larus, James; Rajwar, Ravi (2 de junio de 2010). "Memoria Transaccional, 2ª edición". Conferencias de Síntesis sobre Arquitectura de Computadores . 5 (1): 1–263. doi :10.2200/S00272ED1V01Y201006CAC011. ISSN  1935-3235.
  2. ^ abcd "Memoria transaccional: historia y desarrollo". Centro Kukurukú . Consultado el 16 de noviembre de 2016 .
  3. ^ abc Solihin, Yan (2016). Fundamentos de la arquitectura multinúcleo paralelo . Berkeley, California: Chapman y Hall. págs. 287–292. ISBN 978-1-4822-1118-4.
  4. ^ ab Herlihy, Maurice; Moss, J. Eliot B. (1993). "Memoria transaccional: soporte arquitectónico para estructuras de datos sin bloqueo" (PDF) . Actas del XX Simposio Internacional sobre Arquitectura de Computadores (ISCA) . págs. 289–300.
  5. ^ Piedra, JM; Piedra, SA; Heidelberger, P.; Turek, J. (1993). "Múltiples reservas y la actualización de Oklahoma". Tecnología distribuida y paralela IEEE: sistemas y aplicaciones . 1 (4): 58–71. doi : 10.1109/88.260295. S2CID  11017196.
  6. ^ Hammond, L; Wong, V.; Chen, M.; Carlstrom, BD; Davis, JD; Hertzberg, B.; Prabhu, MK; Honggo Wijaya; Kozyrakis, C.; Olukotun, K. (2004). "Coherencia y consistencia de la memoria transaccional". Actas del 31º Simposio Internacional Anual sobre Arquitectura de Computadores (ISCA) . págs. 102-13. doi :10.1109/ISCA.2004.1310767.
  7. ^ Ananian, CS; Asanovic, K.; Kuszmaul, antes de Cristo; Leiserson, CE; Mentira, S. (2005). "Memoria transaccional ilimitada". XI Simposio Internacional sobre Arquitectura de Computadoras de Alto Rendimiento . págs. 316–327. doi :10.1109/HPCA.2005.41. ISBN 0-7695-2275-0.
  8. ^ "LogTM: memoria transaccional basada en registros" (PDF) . WISC.
  9. ^ "El lenguaje de programación transaccional ATOMOΣ" (PDF) . Stanford. Archivado desde el original (PDF) el 21 de mayo de 2008 . Consultado el 15 de junio de 2009 .
  10. ^ Odaira, R.; Castaños, JG; Nakaike, T. (2013). "¿Los programas C y Java se escalan de manera diferente en la memoria transaccional de hardware?". Simposio internacional IEEE 2013 sobre caracterización de cargas de trabajo (IISWC) . pag. 34. doi : 10.1109/IISWC.2013.6704668. ISBN 978-1-4799-0555-3.
  11. ^ abcdeDavid Kanter (21 de agosto de 2012). "Análisis de la memoria transaccional de Haswell". Tecnologías del mundo real . Consultado el 19 de noviembre de 2013 .
  12. ^ "Arm lanza SVE2 y TME para arquitectura de perfil A - Blog de procesadores - Procesadores - Comunidad Arm". comunidad.arm.com . 18 de abril de 2019 . Consultado el 25 de mayo de 2019 .
  13. ^ "Intrínsecos de la extensión de memoria transaccional (TME)" . Consultado el 5 de mayo de 2020 .
  14. ^ "IBM coloca memoria transaccional en la CPU". EE veces.
  15. ^ Brian Hall; Ryan Arnold; Peter Bergner; Wainer dos Santos Moschetta; Robert Enenkel; Pat Haugen; Michael R. Meissner; Alex Méricas; Philipp Oehler; Berni Schiefer; Brian F. Veale; Guerrero Suresh; Daniel Zabawa; Adhemerval Zanella (2014). Técnicas de optimización y ajuste del rendimiento para procesadores IBM, incluido IBM POWER8 (PDF) . Libros rojos de IBM. págs. 37–40. ISBN 978-0-7384-3972-3.
  16. ^ Wei Li, funciones integradas de memoria transaccional del hardware del compilador IBM XL para IBM AIX en sistemas basados ​​en procesador IBM POWER8
  17. ^ "Power ISA versión 3.1". openpowerfoundation.org. 2020-05-01 . Consultado el 10 de octubre de 2020 .
  18. ^ Java en 1000 núcleos: Tales of Hardware/Software CoDesign en Youtube
  19. ^ "Control.Monad.STM". hackage.haskell.org . Consultado el 6 de febrero de 2020 .
  20. ^ "Página de inicio de STMX".
  21. ^ Wong, Michael. "Construcciones de lenguaje transaccional para C++" (PDF) . Consultado el 12 de enero de 2011 .
  22. ^ "Breve tutorial de GCC sobre memoria transaccional".
  23. ^ "Opciones del dialecto C: uso de la colección de compiladores GNU (GCC)".
  24. ^ "Memoria transaccional - GCC Wiki".
  25. ^ Rigo, Armín. "Usando todos estos núcleos: memoria transaccional en PyPy". europython.eu . Consultado el 7 de abril de 2015 .
  26. ^ "picotm - Administrador de transacciones abierto, integrado, personalizable y portátil".
  27. ^ "Concurrente::TVar".

Otras lecturas

enlaces externos