stringtranslate.com

Gestión de la memoria

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 liberarla para su reutilización cuando ya no sea necesaria. 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 gran efecto en el rendimiento general del sistema .

En algunos sistemas operativos , por ejemplo OS/360 y sucesores , [2] la memoria es administrada por el sistema operativo. [nota 1] En otros sistemas operativos, por ejemplo, sistemas operativos tipo Unix , la memoria se gestiona a nivel de aplicación.

La gestión de la memoria dentro de un espacio de direcciones generalmente se clasifica como gestión de memoria manual o gestión de memoria automática.

Gestión manual de la memoria.

Un ejemplo de fragmentación externa

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 porciones de un gran grupo [nota 2] de memoria llamado montón [nota 3] o almacén libre . En un momento dado, algunas partes del montón están en uso, mientras que otras están "libres" (no utilizadas) y, por lo tanto, están disponibles para asignaciones futuras. En el lenguaje C, se llama a la función que asigna memoria del montón mallocy a la función que toma la memoria previamente asignada y la marca como "libre" (para ser utilizada en futuras asignaciones) free. [nota 4]

Varios problemas complican la implementación, como la fragmentación externa , que surge cuando hay muchos espacios pequeños entre los bloques de memoria asignados, lo que invalida su uso para una solicitud de asignación. Los metadatos del asignador también pueden inflar el tamaño de asignaciones (individualmente) pequeñas. Esto a menudo 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 significativamente el rendimiento. Un estudio realizado en 1994 por Digital Equipment Corporation ilustra los gastos generales que implican una variedad de asignadores. La longitud promedio más baja de la ruta de instrucción requerida para asignar una sola ranura de memoria fue 52 (medida con un perfilador de nivel de instrucción en una variedad de software). [1]

Implementaciones

Dado que la ubicación precisa de la asignación no se conoce de antemano, se accede a la memoria indirectamente, generalmente 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 significativa reducción de la sobrecarga, este método puede mejorar sustancialmente el rendimiento de los objetos que necesitan una asignación y desasignación frecuentes, por lo 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 una determinada 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 mantienen en una lista o árbol vinculado ordenado 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 del que está disponible, se selecciona y 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 están libres, se combinan y se colocan en la lista de bloques de amigos de mayor tamaño correspondiente.

Asignación de losa

Este mecanismo de asignación de memoria preasigna fragmentos de memoria adecuados para adaptarse a objetos de un determinado tipo o tamaño. [4] Estos fragmentos se denominan cachés y el asignador solo tiene que realizar un seguimiento de una lista de espacios de caché libres. La construcción de un objeto utilizará cualquiera de las ranuras de caché libres y la destrucción de un objeto agregará una ranura nuevamente a la lista de ranuras de caché libres. Esta técnica alivia la fragmentación de la memoria y es eficiente ya que no es necesario buscar una porción adecuada de memoria, ya que cualquier ranura abierta será suficiente.

Asignación de pila

Muchos sistemas tipo Unix , así como Microsoft Windows, implementan una función llamada allocapara asignar dinámicamente memoria de pila de una manera similar a la basada en montón malloc. Un compilador normalmente lo traduce en instrucciones integradas que manipulan el puntero de la pila. [5] Aunque no es necesario liberar manualmente la memoria asignada de esta manera, ya que se libera automáticamente cuando allocaregresa la función que llamó, existe un riesgo de desbordamiento. Y dado que alloca es una expansión ad hoc vista en muchos sistemas pero nunca en POSIX o el estándar C, su comportamiento en caso de un desbordamiento de pila no está definido.

En Microsoft Windows existe una versión más segura de alloca llamada _malloca, que informa errores. Requiere el uso de _freea. [6] gnulib proporciona una interfaz equivalente, aunque en lugar de generar una excepción SEH en caso de desbordamiento, delega a malloc cuando se detecta un tamaño demasiado grande. [7] Se puede emular una característica similar usando contabilidad manual y verificación de tamaño, como en los usos de alloca_accountglibc. [8]

Gestión de memoria automatizada

La gestión adecuada de la memoria en una aplicación es un problema difícil y se han ideado varias estrategias diferentes para manejar la gestión de la memoria.

Gestión automática de variables de la pila de llamadas.

En muchas implementaciones de lenguajes de programación, el entorno de ejecución del programa asigna automáticamente memoria en la pila de llamadas para variables locales no estáticas de una subrutina , llamadas variables automáticas , cuando se llama a la subrutina, y libera automáticamente esa memoria cuando se sale de la subrutina. Las declaraciones especiales pueden permitir que las variables locales retengan valores entre invocaciones del procedimiento, o pueden permitir que otras subrutinas 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 utilizar 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", donde 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.

Conteo de referencias

El recuento de referencias es una estrategia para detectar que un programa ya no puede utilizar la memoria manteniendo un contador de cuántos punteros independientes apuntan a la memoria. Siempre que un nuevo puntero apunta a una parte de la memoria, se supone que el programador aumenta el contador. Cuando el puntero cambia hacia dónde apunta, o cuando el puntero ya no apunta a nada o se ha liberado, el contador debería disminuir. Cuando el contador llega a cero, la memoria debe considerarse no utilizada y liberada. Algunos sistemas de recuento de referencias requieren la participación del programador y otros los implementa automáticamente el compilador. Una desventaja del recuento de referencias es que se pueden desarrollar referencias circulares que provocan una pérdida de memoria. Esto se puede mitigar agregando el concepto de "referencia débil" (una referencia que no participa en el recuento de referencias, pero que recibe una notificación cuando lo que apunta ya no es válido) o combinando el recuento de referencias y la recolección de basura. .

Grupos de memoria

Un grupo de memoria es una técnica para desasignar memoria automáticamente según el estado de la aplicación, como el ciclo de vida de una solicitud o transacción. La idea es que muchas aplicaciones ejecutan grandes fragmentos de código que pueden generar asignaciones de memoria, pero que hay un punto en la ejecución en el que se sabe que todos esos fragmentos ya no son válidos. Por ejemplo, en un servicio web, después de cada solicitud, el servicio web ya no necesita la memoria asignada durante la ejecución de la solicitud. Por lo tanto, en lugar de realizar un seguimiento de si se hace referencia o no a la memoria actualmente, la memoria se asigna de acuerdo con la solicitud o etapa del ciclo de vida con la que está asociada. Cuando esa solicitud o etapa ha pasado, toda la memoria asociada se desasigna simultáneamente.

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 la 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 memoria virtual se traduzca a una dirección física real . [9] 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 cómo un proceso puede acceder a la memoria. Esta característica, 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 código malicioso o que funcione mal en un programa interfiera con el funcionamiento de otro.

Aunque la memoria asignada a procesos específicos normalmente está aislada, a veces los procesos 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 según la tasa de acceso en almacenamiento primario y almacenamiento secundario . Los sistemas de gestión de memoria, entre otras operaciones, también gestionan el movimiento de información entre estos dos niveles de memoria.

Gestión de memoria en OS/360 y sucesores

IBM System/360 no admite memoria virtual. [nota 5] El aislamiento de la memoria de los trabajos se logra opcionalmente utilizando claves de protección , asignando al almacenamiento para cada trabajo una clave diferente, 0 para el supervisor o 1–15. La gestión de memoria en OS/360 es una función de supervisor . El almacenamiento se solicita mediante la GETMAINmacro y se libera mediante la FREEMAINmacro, lo que da como resultado una llamada al supervisor ( SVC ) para realizar la operación.

En OS/360 los detalles varían dependiendo de cómo se genera 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 (SQA) compartida 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. Los subgrupos están numerados del 0 al 255. [10] Dentro de una región, a los subgrupos se les asigna la protección de almacenamiento del trabajo o la clave del supervisor, clave 0. Los subgrupos 0 a 127 reciben la clave del trabajo. Inicialmente, solo se crea el subgrupo cero y todas las solicitudes de almacenamiento de los usuarios se satisfacen desde el subgrupo 0, a menos que se especifique otro en la solicitud de memoria. Los subagrupados 250–255 se crean mediante solicitudes de memoria realizadas por el 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. [11] MFT utiliza particiones fijas redefinibles 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 del subagrupación. La memoria se asigna encontrando un área libre de tamaño suficiente o asignando bloques adicionales en el subagrupación, hasta el tamaño de la región del trabajo. Es posible liberar total o parcialmente un área de memoria asignada. [12]

Los detalles para OS/VS1 son similares [13] a los de MFT y MVT; Los detalles para OS/VS2 son similares a los de MVT, excepto que el tamaño de página es 4 KiB. Tanto para OS/VS1 como para OS/VS2, el área de cola del sistema (SQA) compartida no es paginable.

En MVS, el espacio de direcciones incluye un área compartida paginable adicional, 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 a 7 están reservadas para su uso mediante código privilegiado.

Ver también

Notas

  1. ^ Sin embargo, el entorno de ejecución de un procesador de lenguaje puede subdividir la memoria adquirida dinámicamente del sistema operativo, por ejemplo, para implementar una pila.
  2. ^ En algunos sistemas operativos, por ejemplo, OS/360 , el almacenamiento libre se puede subdividir de varias maneras, por ejemplo, subgrupos en OS/360 , debajo de la línea, encima de la línea y encima de la barra en z/OS .
  3. ^ No debe confundirse con la estructura de datos del montón no relacionada .
  4. ^ A simplistic implementation of these two functions can be found in the article "Inside Memory Management".[3]
  5. ^ Except on the Model 67

References

  1. ^ a b Detlefs, D.; Dosser, A.; Zorn, B. (June 1994). "Memory allocation costs in large C and C++ programs" (PDF). Software: Practice and Experience. 24 (6): 527–542. CiteSeerX 10.1.1.30.3073. doi:10.1002/spe.4380240602. S2CID 14214110.
  2. ^ "Main Storage Allocation" (PDF). IBM Operating System/360 Concepts and Facilities (PDF). IBM Systems Reference Library (First ed.). IBM Corporation. 1965. p. 74. Retrieved Apr 3, 2019.
  3. ^ Jonathan Bartlett. "Inside Memory Management". IBM DeveloperWorks.
  4. ^ Silberschatz, Abraham; Galvin, Peter B. (2004). Operating system concepts. Wiley. ISBN 0-471-69466-5.
  5. ^ alloca(3) – Linux Programmer's Manual – Library Functions
  6. ^ "_malloca". Microsoft CRT Documentation.
  7. ^ "gnulib/malloca.h". GitHub. Retrieved 24 November 2019.
  8. ^ "glibc/include/alloca.h". Beren Minor's Mirrors. 23 November 2019.
  9. ^ Tanenbaum, Andrew S. (1992). Modern Operating Systems. Englewood Cliffs, N.J.: Prentice-Hall. p. 90. ISBN 0-13-588187-0.
  10. ^ OS360Sup, pp. 82-85.
  11. ^ OS360Sup, pp. 82.
  12. ^ IBM Corporation (May 1973). Program Logic: IBM System/360 Operating System MVT Supervisor (PDF). pp. 107–137. Retrieved Apr 3, 2019.
  13. ^ OSVS1Dig, p. 2.37-2.39.

Bibliography

OS360Sup
OS versión 21 Servicios de supervisor del sistema operativo IBM System/360 e instrucciones de macros (PDF) . Biblioteca de referencia de sistemas IBM (octava ed.). IBM . Septiembre de 1974. GC28-6646-7.
OSVS1Excavar
Resumen de referencia del programador de OS/VS1, versión 6 (PDF) . Sistemas (Sexta ed.). IBM . 15 de septiembre de 1976. GC24-5091-5 con TNL.

enlaces externos

  • Referencia de gestión de memoria, asignación de la guía para principiantes