En informática, un modelo de memoria describe las interacciones de los subprocesos a través de la memoria y su uso compartido de los datos .
Historia y significado
Un modelo de memoria permite a un compilador realizar muchas optimizaciones importantes. Las optimizaciones del compilador, como las sentencias de movimiento de fusión de bucles en el programa, pueden influir en el orden de las operaciones de lectura y escritura de las variables potencialmente compartidas . Los cambios en el orden de las lecturas y escrituras pueden provocar condiciones de carrera . Sin un modelo de memoria, un compilador no puede aplicar tales optimizaciones a programas multiproceso en general, o solo en casos especiales. O, para algunos compiladores, se supone que no hay ejecución de subprocesos múltiples (por lo que se puede producir un código mejor optimizado), lo que puede conducir a optimizaciones que son incompatibles con subprocesos múltiples; estos a menudo pueden conducir a errores sutiles, que no aparecen en las primeras pruebas. .
Los lenguajes de programación modernos como Java, por lo tanto, implementan un modelo de memoria. El modelo de memoria especifica las barreras de sincronización que se establecen mediante operaciones de sincronización especiales y bien definidas, como adquirir un bloqueo al ingresar un bloque o método sincronizado. El modelo de memoria estipula que los cambios en los valores de las variables compartidas solo deben hacerse visibles para otros subprocesos cuando se alcanza dicha barrera de sincronización. Además, toda la noción de condición de carrera se define sobre el orden de las operaciones con respecto a estas barreras de memoria. [1]
Luego, esta semántica otorga a los compiladores de optimización un mayor grado de libertad al aplicar optimizaciones: el compilador debe asegurarse solo de que los valores de las variables (potencialmente compartidas) en las barreras de sincronización estén garantizados para ser los mismos en el código optimizado y no optimizado. En particular, el compilador asume que reordenar declaraciones en un bloque de código que no contiene ninguna barrera de sincronización es seguro.
La mayor parte de la investigación en el área de modelos de memoria gira en torno a:
- Diseñar un modelo de memoria que permita un grado máximo de libertad para las optimizaciones del compilador y, al mismo tiempo, ofrezca suficientes garantías sobre programas sin carreras y (quizás lo más importante) que contienen carreras.
- Probar las optimizaciones del programa que son correctas con respecto a dicho modelo de memoria.
El modelo de memoria de Java fue el primer intento de proporcionar un modelo de memoria de subprocesamiento completo para un lenguaje de programación popular. [2] Después de que se estableció que los subprocesos no podían implementarse de manera segura como una biblioteca sin imponer ciertas restricciones a la implementación y, en particular, que los estándares C y C ++ ( C99 y C ++ 03 ) carecían de las restricciones necesarias, [3] [4] el subcomité de subprocesos de C ++ se puso a trabajar en un modelo de memoria adecuado; en 2005, presentaron el documento de trabajo C n1131 [5] para que el Comité C participara en sus esfuerzos. La revisión final del modelo de memoria propuesto, C ++ n2429, [6] fue aceptada en el borrador del estándar C ++ en la reunión de octubre de 2007 en Kona. [7] El modelo de memoria se incluyó entonces en los siguientes estándares C ++ y C, C ++ 11 y C11 . [8] [9]
Ver también
Referencias
- ^ Jeremy Manson y Brian Goetz (febrero de 2004). "Preguntas frecuentes sobre JSR 133 (modelo de memoria Java)" . Consultado el 18 de octubre de 2010 .
El modelo de memoria de Java describe qué comportamientos son legales en código multiproceso y cómo los subprocesos pueden interactuar a través de la memoria. Describe la relación entre las variables en un programa y los detalles de bajo nivel para almacenarlas y recuperarlas desde y hacia la memoria o los registros en un sistema informático real. Lo hace de una manera que se puede implementar correctamente utilizando una amplia variedad de hardware y una amplia variedad de optimizaciones del compilador.
- ^ Goetz, Brian (24 de febrero de 2004). "Arreglando el modelo de memoria de Java, parte 1" . Consultado el 17 de febrero de 2008 .
- ^ Buhr, Peter A. (11 de septiembre de 1995). "¿Son posibles las bibliotecas de simultaneidad seguras?" (PDF) . Consultado el 12 de mayo de 2015 . Cite journal requiere
|journal=
( ayuda ) - ^ Boehm, Hans-J. (12 de noviembre de 2004). "Los subprocesos no se pueden implementar como una biblioteca" (PDF) . Consultado el 12 de mayo de 2015 .
- ^ Boehm, Hans ; Lea, Doug ; Pugh, Bill (26 de agosto de 2005). "Implicaciones de las discusiones del modelo de memoria C ++ en el lenguaje C" (PDF) . www.open-std.org . Consultado el 12 de mayo de 2015 .
- ^ "WG21 / N2429: Modelo de memoria de concurrencia (revisión final)" . www.open-std.org . 2007-10-05 . Consultado el 12 de mayo de 2015 .
- ^ "N2480: una explicación menos formal del modelo propuesto de memoria de simultaneidad C ++" . www.open-std.org . Consultado el 12 de mayo de 2015 .
- ^ Alexandrescu, Andrei; Boehm, Hans; Henney, Kevlin; Hutchings, Ben; Lea, Doug; Pugh, Bill (4 de marzo de 2005). "Modelo de memoria para C ++ multiproceso: problemas" (PDF) . Consultado el 24 de abril de 2014 .
Las bibliotecas de subprocesos de C ++ se encuentran en la situación incómoda de especificar (implícita o explícitamente) un modelo de memoria extendida para C ++ con el fin de especificar la ejecución del programa. Proponemos integrar un modelo de memoria adecuado para la ejecución de múltiples subprocesos en el estándar C ++.
- ^ Boehm, Hans. "Modelo de hilos y memoria para C ++" . Consultado el 24 de abril de 2014 .
Esta [granja de enlaces] proporciona información relacionada con el esfuerzo por aclarar el significado de los programas C ++ de subprocesos múltiples y para proporcionar algunas API estándar relacionadas con subprocesos donde faltan actualmente.