La gestión de la memoria es una forma de gestión de recursos aplicada a la memoria de la computadora . El requisito esencial de la gestión de la memoria es proporcionar formas de asignar dinámicamente porciones de memoria a los programas cuando lo soliciten y liberarlas para su reutilización cuando ya no se necesiten. Esto es fundamental para cualquier sistema informático avanzado en el que pueda estar en marcha más de un proceso en cualquier momento. [1]
Se han ideado varios métodos que aumentan la eficacia de la gestión de la memoria. Los sistemas de memoria virtual separan las direcciones de memoria utilizadas por un proceso de las direcciones físicas reales, lo que permite la separación de procesos y aumenta el tamaño del espacio de direcciones virtuales más allá de la cantidad de RAM disponible mediante paginación o intercambio a almacenamiento secundario . La calidad del administrador de memoria virtual puede tener un efecto importante en el rendimiento general del sistema .
Detalles
En algunos sistemas operativos , por ejemplo, DOS / 360 y sucesores , OS / 360 y sucesores , [2] la asignación de almacenamiento dentro de un espacio de direcciones es manejada por el sistema operativo; en, por ejemplo, sistemas operativos similares a Unix, la asignación dentro de un espacio de direcciones se realiza a nivel de aplicación.
La administración de memoria dentro de un espacio de direcciones generalmente se clasifica como administración automática de memoria, que generalmente involucra recolección de basura , o administración manual de memoria .
Asignación de memoria dinámica
La tarea de cumplir con una solicitud de asignación consiste en localizar un bloque de memoria no utilizada de tamaño suficiente. Las solicitudes de memoria se satisfacen asignando partes de una gran cantidad de memoria denominada heap o free store . [nota 1] En un momento dado, algunas partes del montón están en uso, mientras que otras son "gratuitas" (sin usar) y, por lo tanto, están disponibles para asignaciones futuras.
Varios problemas complican la implementación, como la fragmentación externa , que surge cuando hay muchas brechas pequeñas entre los bloques de memoria asignados, lo que invalida su uso para una solicitud de asignación. Los metadatos del asignador también pueden aumentar el tamaño de asignaciones pequeñas (individualmente). A menudo, esto se gestiona mediante fragmentación . El sistema de gestión de memoria debe realizar un seguimiento de las asignaciones pendientes para garantizar que no se superpongan y que nunca se "pierda" memoria (es decir, que no haya " pérdidas de memoria ").
Eficiencia
El algoritmo de asignación de memoria dinámica específico implementado puede afectar el rendimiento de manera significativa. Un estudio realizado en 1994 por Digital Equipment Corporation ilustra los gastos generales involucrados para una variedad de asignadores. La longitud de ruta de instrucción promedio más baja requerida para asignar una sola ranura de memoria fue 52 (medida con un perfilador de nivel de instrucción en una variedad de software). [3]
Implementaciones
Dado que la ubicación precisa de la asignación no se conoce de antemano, se accede a la memoria de forma indirecta, normalmente a través de una referencia de puntero . El algoritmo específico utilizado para organizar el área de memoria y asignar y desasignar fragmentos está interconectado con el kernel y puede utilizar cualquiera de los siguientes métodos:
Asignación de bloques de tamaño fijo
La asignación de bloques de tamaño fijo, también llamada asignación de grupo de memoria, utiliza una lista libre de bloques de memoria de tamaño fijo (a menudo todos del mismo tamaño). Esto funciona bien para sistemas integrados simples donde no es necesario asignar objetos grandes, pero sufre fragmentación , especialmente con direcciones de memoria largas. Sin embargo, debido a la sobrecarga significativamente reducida, este método puede mejorar sustancialmente el rendimiento de los objetos que necesitan asignación / desasignación frecuente y que se utiliza a menudo en videojuegos .
Bloques de amigos
En este sistema, la memoria se asigna en varios grupos de memoria en lugar de solo uno, donde cada grupo representa bloques de memoria de cierta potencia de dos en tamaño, o bloques de alguna otra progresión de tamaño conveniente. Todos los bloques de un tamaño particular se guardan en una lista o árbol enlazados ordenados y todos los bloques nuevos que se forman durante la asignación se agregan a sus respectivos grupos de memoria para su uso posterior. Si se solicita un tamaño más pequeño que el disponible, se selecciona y se divide el tamaño más pequeño disponible. Se selecciona una de las partes resultantes y el proceso se repite hasta que se completa la solicitud. Cuando se asigna un bloque, el asignador comenzará con el bloque más pequeño y suficientemente grande para evitar romper bloques innecesariamente. Cuando se libera un bloque, se compara con su compañero. Si ambos son gratuitos, se combinan y se colocan en la lista de bloques de amigos correspondientemente más grande.
Asignación de losas
Este mecanismo de asignación de memoria preasigna fragmentos de memoria adecuados para adaptarse a objetos de cierto tipo o tamaño. [4] Estos fragmentos se denominan cachés y el asignador solo tiene que realizar un seguimiento de una lista de ranuras de caché libres. La construcción de un objeto utilizará cualquiera de las ranuras de caché libres y la destrucción de un objeto volverá a agregar una ranura a la lista de ranuras de caché libre. Esta técnica alivia la fragmentación de la memoria y es eficaz, ya que no es necesario buscar una parte adecuada de la memoria, ya que cualquier ranura abierta será suficiente.
Asignación de pila
Muchos sistemas similares a Unix, así como Microsoft Windows, implementan una función llamada alloca
para asignar dinámicamente memoria de pila de una manera similar a la basada en montones malloc
. Un compilador normalmente lo traduce a instrucciones en línea que manipulan el puntero de la pila. [5] Aunque no hay necesidad de liberar manualmente la memoria asignada de esta manera, ya que se libera automáticamente cuando la función que llamó alloca
regresa, existe un riesgo de desbordamiento. Y dado que alloca es una expansión ad hoc que se ve en muchos sistemas pero nunca en POSIX o el estándar C, su comportamiento en caso de un desbordamiento de pila no está definido.
Existe una versión más segura de alloca llamada _malloca
, que informa de errores, en Microsoft Windows. Requiere el uso de _freea
. [6] gnulib proporciona una interfaz equivalente, aunque en lugar de lanzar una excepción SEH en caso de desbordamiento, delega en malloc cuando se detecta un tamaño excesivo. [7] Se puede emular una característica similar usando contabilidad manual y verificación de tamaño, como en los usos de alloca_account
en glibc. [8]
Variables automáticas
En muchas implementaciones de lenguajes de programación, todas las variables declaradas dentro de un procedimiento (subrutina o función) son locales para esa función; el entorno de ejecución del programa asigna automáticamente memoria para estas variables en la entrada de ejecución del programa al procedimiento, y libera automáticamente esa memoria cuando se sale del procedimiento. Las declaraciones especiales pueden permitir que las variables locales retengan valores entre invocaciones del procedimiento, o pueden permitir que otros procedimientos accedan a las variables locales. La asignación automática de variables locales hace posible la recursividad , hasta una profundidad limitada por la memoria disponible.
Recolección de basura
La recolección de basura es una estrategia para detectar automáticamente la memoria asignada a objetos que ya no se pueden usar en un programa y devolver esa memoria asignada a un grupo de ubicaciones de memoria libres. Este método contrasta con la gestión de memoria "manual", en la que un programador codifica explícitamente las solicitudes de memoria y las liberaciones de memoria en el programa. Si bien la recolección automática de basura tiene las ventajas de reducir la carga de trabajo del programador y prevenir ciertos tipos de errores de asignación de memoria, la recolección de basura requiere recursos de memoria propios y puede competir con el programa de aplicación por el tiempo del procesador.
Sistemas con memoria virtual
La memoria virtual es un método para desacoplar la organización de la memoria del hardware físico. Las aplicaciones operan en memoria a través de direcciones virtuales . Cada intento de la aplicación de acceder a una dirección de memoria virtual particular da como resultado que la dirección de la memoria virtual se traduzca a una dirección física real . De esta manera, la adición de memoria virtual permite un control granular sobre los sistemas de memoria y los métodos de acceso.
En los sistemas de memoria virtual, el sistema operativo limita la forma en que un proceso puede acceder a la memoria. Esta función, llamada protección de memoria , se puede utilizar para impedir que un proceso lea o escriba en la memoria que no está asignada, evitando que el código malicioso o que funcione mal en un programa interfiera con el funcionamiento de otro.
Aunque la memoria asignada para procesos específicos normalmente está aislada, los procesos a veces necesitan poder compartir información. La memoria compartida es una de las técnicas más rápidas para la comunicación entre procesos .
La memoria generalmente se clasifica por tasa de acceso en almacenamiento primario y almacenamiento secundario . Los sistemas de administración de memoria, entre otras operaciones, también manejan el movimiento de información entre estos dos niveles de memoria.
Gestión de memoria en OS / 360 y sucesores
IBM System / 360 no es compatible con la memoria virtual. [nota 2] El aislamiento de la memoria de los trabajos se logra opcionalmente mediante claves de protección , asignando almacenamiento para cada trabajo con una clave diferente, 0 para el supervisor o 1–15. La gestión de la memoria en OS / 360 es una función de supervisor . El almacenamiento se solicita usando la GETMAIN
macro y se libera usando la FREEMAIN
macro, lo que resulta en una llamada al supervisor ( SVC ) para realizar la operación.
En OS / 360, los detalles varían según cómo se genere el sistema , por ejemplo, para PCP , MFT , MVT .
En OS / 360 MVT, la subasignación dentro de la región de un trabajo o el área de cola del sistema compartida (SQA) se basa en subagrupaciones , áreas de un tamaño múltiplo de 2 KB, el tamaño de un área protegida por una clave de protección. Las subagrupaciones están numeradas del 0 al 255. [9] Dentro de una región, a los subgrupos se les asigna la protección de almacenamiento del trabajo o la clave del supervisor, la clave 0. Los subgrupos 0-127 reciben la clave del trabajo. Inicialmente, solo se crea la subagrupación cero y todas las solicitudes de almacenamiento del usuario se satisfacen desde la subagrupación 0, a menos que se especifique otra en la solicitud de memoria. Los subgrupos 250–255 se crean mediante solicitudes de memoria del supervisor en nombre del trabajo. A la mayoría de ellos se les asigna la clave 0, aunque algunos obtienen la clave del trabajo. Los números de subagrupación también son relevantes en MFT, aunque los detalles son mucho más simples. [10] MFT utiliza particiones fijas redefinidas por el operador en lugar de regiones dinámicas y PCP tiene una sola partición.
Cada subagrupación se asigna mediante una lista de bloques de control que identifican los bloques de memoria asignados y libres dentro de la subagrupación. La memoria se asigna buscando un área libre de tamaño suficiente o asignando bloques adicionales en la subagrupación, hasta el tamaño de la región del trabajo. Es posible liberar todo o parte de un área de memoria asignada. [11]
Los detalles para OS / VS1 son similares [12] a los de MFT y MVT; los detalles para OS / VS2 son similares a los de MVT, excepto que el tamaño de la página es de 4 KiB. Tanto para OS / VS1 como para OS / VS2, el área de cola del sistema (SQA) compartida no se puede paginar.
En MVS, el espacio de direcciones incluye un área compartida adicional paginable, el área de almacenamiento común (CSA) y un área privada adicional, el área de trabajo del sistema (SWA). Además, las claves de almacenamiento 0-7 están todas reservadas para su uso mediante código privilegiado.
Ver también
- Matriz dinámica
- Recolección de basura (informática)
- Sin memoria
Notas
- ^ No debe confundirse con laestructura de datos del montón no relacionada.
- ^ Excepto en el modelo 67
Referencias
- ^ Gibson, Steve (15 de agosto de 1988). "Charla técnica: poner la especificación XMS de IBM / Microsoft en perspectiva" . InfoWorld .
- ^ "Asignación de almacenamiento principal" (PDF) . IBM Operating System / 360 Concepts and Facilities (PDF) . Biblioteca de referencia de sistemas (Primera ed.). IBM Corporation. 1965. pág. 74 . Consultado el 3 de abril de 2019 .
- ^ Detlefs, D .; Dosser, A .; Zorn, B. (junio de 1994). "Costos de asignación de memoria en grandes programas C y C ++" (PDF) . Software: práctica y experiencia . 24 (6): 527–542. CiteSeerX 10.1.1.30.3073 . doi : 10.1002 / spe.4380240602 .
- ^ Silberschatz, Abraham ; Galvin, Peter B. (2004). Conceptos del sistema operativo . Wiley. ISBN 0-471-69466-5.
- ^ - Manual del programador de Linux - Funciones de biblioteca
- ^ "_malloca" . Documentación de Microsoft CRT .
- ^ "gnulib / malloca.h" . GitHub . Consultado el 24 de noviembre de 2019 .
- ^ "glibc / include / alloca.h" . Espejos de Beren Minor. 23 de noviembre de 2019.
- ^ OS360Sup , pp. 82 -85.
- ^ OS360Sup , pp. 82 .
- ^ IBM Corporation (mayo de 1973). Lógica del programa: IBM System / 360 Operating System MVT Supervisor (PDF) . págs. 107-137 . Consultado el 3 de abril de 2019 .
- ^ OSVS1Dig , págs. 2,37 -2,39, Subpools de almacenamiento VS1.
- OS360Sup
- OS Release 21 IBM System / 360 Operating System Supervisor Services and Macro Instructions (PDF) . Biblioteca de referencia de sistemas (octava ed.). IBM. Septiembre de 1974. GC28-6646-7.
- OSVS1Dig
- Versión 6 del resumen de referencia del programador de OS / VS1 (PDF) . Systems (Sexta ed.). IBM. Noviembre de 1975. GC24-5091-5.
Otras lecturas
- Donald Knuth . Algoritmos fundamentales , tercera edición. Addison-Wesley, 1997. ISBN 0-201-89683-4 . Sección 2.5: Asignación dinámica de almacenamiento, págs. 435–456.
- Algoritmos de asignación de memoria simple Archivado el 5 de marzo de 2016 en Wayback Machine (publicado originalmente en la comunidad OSDEV)
- Wilson, PR; Johnstone, MS; Neely, M .; Boles, D. (1995). "Asignación dinámica de almacenamiento: una encuesta y revisión crítica". Gestión de la memoria . Apuntes de conferencias en Ciencias de la Computación. 986 . págs. 1-116. CiteSeerX 10.1.1.47.275 . doi : 10.1007 / 3-540-60368-9_19 . ISBN 978-3-540-60368-9.
- Berger, ED; Zorn, BG; McKinley, KS (junio de 2001). "Composición de asignadores de memoria de alto rendimiento". Actas de la conferencia ACM SIGPLAN 2001 sobre diseño e implementación de lenguajes de programación (PDF) . págs. 114-124. CiteSeerX 10.1.1.1.2112 . doi : 10.1145 / 378795.378821 . ISBN 1-58113-414-2. S2CID 7501376 . Parámetro desconocido
|conference=
ignorado ( ayuda ) - Berger, ED; Zorn, BG; McKinley, KS (noviembre de 2002). "Reconsideración de la asignación de memoria personalizada". Actas de la 17ª conferencia ACM SIGPLAN sobre programación, sistemas, lenguajes y aplicaciones orientados a objetos (PDF) . págs. 1-12. CiteSeerX 10.1.1.119.5298 . doi : 10.1145 / 582419.582421 . ISBN 1-58113-471-1. S2CID 481812 . Parámetro desconocido
|conference=
ignorado ( ayuda ) - Wilson, Paul R .; Johnstone, Mark S .; Neely, Michael; Boles, David (28 al 29 de septiembre de 1995), Dynamic Storage Allocation: A Survey and Critical Review (PDF) , Austin, Texas: Departamento de Ciencias de la Computación de la Universidad de Texas , consultado el 3 de junio de 2017
enlaces externos
- Biblioteca C ++ "Generic Memory Manager"
- Asignador de memoria de arena con mapa de bits de muestra en C
- TLSF: un asignador de tiempo constante para sistemas en tiempo real
- Diapositivas sobre la asignación de memoria dinámica
- Dentro de un asignador de almacenamiento
- La referencia de gestión de la memoria
- The Memory Management Reference, Asignación de la guía para principiantes
- Gestión de memoria de Linux
- Gestión de memoria para programadores de sistemas
- VMem: malloc general / reemplazo gratuito. Asignador rápido de C ++ seguro para subprocesos
- Memoria dinámica en sistemas IEC61508