En informática, un modelo de memoria describe las interacciones de los hilos a través de la memoria y su uso compartido de los datos .
Historia y significado
Un modelo de memoria permite al compilador realizar optimizaciones importantes, como la fusión de bucles y la modificación de instrucciones de movimiento en el programa, lo que puede influir en el orden de lectura y escritura de variables potencialmente compartidas . Los cambios en el orden de lectura y escritura pueden provocar condiciones de carrera . Sin un modelo de memoria, el compilador podría no aplicar dichas optimizaciones a programas multihilo o aplicar optimizaciones incompatibles con la multihilo, lo que generaría errores.
Los lenguajes de programación modernos como Java implementan un modelo de memoria. Este modelo especifica barreras de sincronización que se establecen mediante operaciones de sincronización especiales y bien definidas, como la adquisición de un bloqueo al entrar en un bloque o método sincronizado. El modelo estipula que los cambios en los valores de las variables compartidas solo deben hacerse visibles para otros hilos cuando se alcanza dicha barrera de sincronización. Además, el concepto de condición de carrera se define en función del orden de las operaciones con respecto a estas barreras de memoria. [ 1 ]
Esta semántica otorga a los compiladores optimizadores un mayor grado de libertad al aplicar optimizaciones: el compilador solo necesita asegurarse de que los valores de las variables (potencialmente compartidas) en las barreras de sincronización sean los mismos tanto en el código optimizado como en el no optimizado. En particular, el compilador asume que la reordenación de instrucciones en un bloque de código que no contiene barreras de sincronización es segura.
La mayor parte de la investigación en el área de los modelos de memoria gira en torno a:
- Diseñar un modelo de memoria que permita el máximo grado de libertad para las optimizaciones del compilador, al tiempo que ofrece garantías suficientes sobre programas libres de condiciones de carrera y (quizás más importante) programas que sí las contienen.
- Demostrar que las optimizaciones del programa 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 subprocesos completo para un lenguaje de programación popular. [ 2 ] Después de que se estableció que los subprocesos no podían implementarse de forma 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 respaldara 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ó luego en los siguientes estándares C++ y C, C++11 y C11 . [ 8 ] [ 9 ] El lenguaje de programación Rust heredó la mayor parte del modelo de memoria de C/C++. [ 10 ]
Véase también
Referencias
- ↑ Jeremy Manson y Brian Goetz (febrero de 2004). "Preguntas frecuentes sobre JSR 133 (Modelo de memoria de Java)" . Consultado el 18 de octubre de 2010.
El Modelo de memoria de Java describe qué comportamientos son válidos en código multihilo y cómo los hilos pueden interactuar a través de la memoria. Describe la relación entre las variables de un programa y los detalles de bajo nivel para almacenarlas y recuperarlas de la memoria o los registros en un sistema informático real. Lo hace de una manera que permite su correcta implementación con una amplia variedad de hardware y diversas optimizaciones del compilador.
- ↑ Goetz, Brian (24 de febrero de 2004). "Corrigiendo el modelo de memoria de Java, parte 1" . IBM . Consultado el 17 de febrero de 2008 .
- ↑ Buhr, Peter A. (11 de septiembre de 1995). "¿Son posibles las bibliotecas de concurrencia seguras?" (PDF) . Communications of the ACM . Recuperado el 12 de mayo de 2015 .
- ↑ Boehm, Hans-J. (12 de noviembre de 2004). "Los hilos no se pueden implementar como una biblioteca" (PDF) . Archivado del original (PDF) el 30 de mayo de 2017. Consultado el 12 de mayo de 2015 .
- ↑ Boehm, Hans ; Lea, Doug ; Pugh, Bill (26 de agosto de 2005). "Implicaciones de los debates sobre el modelo de memoria de 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 . 5 de octubre de 2007. Consultado el 12 de mayo de 2015 .
- ↑ "N2480: Una explicación menos formal del modelo de memoria de concurrencia propuesto para C++" . www.open-std.org . Consultado el 12 de mayo de 2015 .
- ↑ Alexandrescu, Andrei; Boehm, Hans; Henney, Kevlin; Hutchings, Ben; Lea, Doug; Pugh, Bill (2005-03-04). "Modelo de memoria para C++ multihilo: problemas" (PDF) . Recuperado el 24-04-2014 .
Las bibliotecas de subprocesos de C++ se encuentran en la incómoda situación de especificar (implícita o explícitamente) un modelo de memoria extendido para C++ con el fin de especificar la ejecución del programa. Proponemos integrar un modelo de memoria adecuado para la ejecución multihilo en el estándar de C++.
- ↑ Boehm, Hans. "Hilos y modelo de memoria para C++" . Consultado el 24 de abril de 2014. Este
[conjunto de enlaces] proporciona información relacionada con el esfuerzo por aclarar el significado de los programas C++ multihilo y ofrecer algunas API estándar relacionadas con hilos donde actualmente faltan.
- ↑ "The Rustonomicon, Atomics" . Consultado el 8 de julio de 2024. Rust
hereda descaradamente el modelo de memoria para operaciones atómicas de C++20.
- Memoria de computadora
- Modelos de consistencia
- Construcción de compiladores
- Diseño de lenguajes de programación
- Sistemas de tiempo de ejecución
- Concurrencia (informática)
- Esbozos de programación informática