MEMORY MANGEMENT Basic Garbage Collection
Hugo GandaraEnsayo31 de Marzo de 2019
2.623 Palabras (11 Páginas)140 Visitas
MEMORY SEGMENTS & MEMORY MANGEMENT
Hugo Edibray Becerra Gándara
Contenido
Introducción 3
MEMORY SEGMENTS 4
MEMORY MANGEMENT 4
Basic Garbage Collection 4
Memory Allocation and Management 5
STACKS AND HEAPS 5
PAGES, VALID POINTER DETECTION AND MEMORY COMPACTING 5
GARBAGE COLLECTORS 6
MEMORY MANGEMENT 6
Overview 6
Garbage Collection 6
Creating Your Own Smart Pointer Type 7
Other Smart Pointers 8
Manual Memory Management with new, delete etc. 8
Errores comunes 8
Use de typedef 8
Conclusion 9
Bibliografía 10
Introducción
En este ensayo se tocarán temas como la memoria, los recolectores de basura, los problemas que puede traer no saber manejar manualmente la memoria, los apuntadores inteligentes y como crear uno y como es que la memoria funciona sin nosotros darnos cuenta, por lo que podría ser un poco tedioso, sin embargo es importante saber todo lo antes mencionado pues siempre es bueno(sin importar que nunca lo vayamos a usar) saber toda la información posible de los lenguajes de programación, aunque claro, nunca sabremos manejar al 100% un lenguaje de programación.
MEMORY SEGMENTS
Ésta primera lectura empieza hablándonos sobre la arquitectura “Von Neumann” la cual tiene la memoria dividida en 2: Texto y Segmentos de datos, aunque en la actualidad hay más de sólo 2 segmentos, dependiendo de la “storage class” de la información que está siendo almacenada ahí. Hay 4 segmentos los cuales se dividen en:
- El segmento del código, también conocido “text segment” o segmento de texto el cual contiene las instrucciones del programa. Nos cuenta la historia de lo que el programa hace, por lo cuál es de suma importancia.
- El segmento de datos el cual contiene los datos estáticos del programa, o sea, las variables que existen durante la ejecución del programa, por lo que yo pienso que al contener las variables es de suma importancia que no se corrompa.
- “The Stack Segmente”, el cual contiene “the system stack”, que es usado como almacenamiento temporal. El “Stack” es una simple estructura de datos con una política de acceso LIFO (Last-in first-out) lo que quiere decir que los primeros en entrar serán los primeros en salir. Mejor dicho, los ítems que se añadan o que se quiten solo serán removidos de la cabeza del stack. Lo que capté de este segmento es que es como una clase de vector.
- “The heap segment” (heap significa monticulo) es un montón de memoria usada para asignar dinámicamente la memoria, tal como sucede en C++ o java
Lo que comprendo y entiendo de este pequeño texto es que las arquitecturas hoy por hoy dividen la memoria en 4 espacios, y que por esto nos resulta fácil trabajar programando, aunque no sé si esto afecte la manera en la que se trabaja por ejemplo: en un equipo un poco humilde a otro equipo más caro, ya que uno tiene más memoria que el otro y así el que tiene menos memoria podría ser más lento y por lo tanto significar perdida de tiempo y en caso de que hablemos de una empresa, de dinero.
MEMORY MANGEMENT
Basic Garbage Collection
Primero se haba de la memoria y como se gestione, diciéndonos lo que sabemos sobre que se tiene que asignar memoria antes de poder ejecutar una aplicación, y cuando termine devolver dicha memoria.
Hay varias maneras de administrar la memoria, implícita y explícitamente:
La primera es aquella que se asigna cuando creas una variable, la cuál es demasiado útil y te ahorra tiempo, mientras que la explicita se produce a través de punteros y llamadas a las funciones, lo cual resultar un poco más tedioso, pero considero que es una buena práctica de programación
Los recolectores de basura son sistemas (o subsistemas) que se utilizan para administrar la memoria dinámica automáticamente. Aunque el proceso para hacer que funcionen en un principio parecería tedioso y largo, sólo tenemos que llamar una función del gc que se llama “gc_malloc” y durante la ejecución del programa se realiza el proceso para al final liberar memoria gracias al GC. Hay 3 tipos de recolector de basura:
- El de recuento de frecuencias: éste lo que hace es que mediante conteos a objetos por punteros aumenta el conteo, y mientras sea un entero positivo, se hace referencia activa al objeto y “está vivo”. Mientras que cuando se elimina una referencia al objeto, el conteo disminuye y si llega a 0 “está muerto”. Considero que es muy práctico y que no nos pide hacer trabajo de más.
- Por otro lado, tenemos el rastreador el cuál siento que es menos práctico y a mí en lo personal es el que menos me gusta
- Y por último los híbridos que emplean recuentos de referencia en objetos muy grandes para garantizar que se recupere rápidamente.
Memory Allocation and Management
STACKS AND HEAPS
Existen dos tipos de memoria: Stack y Heaps
Stack: Se utiliza para proveer frames, un frame es una manera de localizar información sobre subrutinas(la cual tiene que tener en su frame la dirección de retorno). Todo el proceso que implica la creación de frames en el stack, es manejado por el compilador, por lo que nosotros como programadores no estamos conscientes de ellos, sin embargo, es bueno conocerlo y tomarlo en cuenta al momento de programar.
HEAPS: El “heap” es un área de memoria asignada dinámicamente que es administrada automáticamente por el sistema operativo o la biblioteca del administrador de memoria. La memoria en el “heap” se asigna y se desasigna y ajusta su tamaño durante la ejecución del programa y esto nos puede llevar a un problema que se llama fragmentación. Ésta se produce cuando no se asigna el suficiente espacio entre objetos de memoria.
Considero que este último es un riesgo por considerar al momento de hablar y usar los heaps como tipo de memoria.
PAGES, VALID POINTER DETECTION AND MEMORY COMPACTING
Una página es una región de memoria dedicada a mantener un tipo de objeto con un tamaño fijo. Esto también se conoce como una región de memoria homogénea. Todos los objetos en página son del mismo tamaño y gracias a esto se puede tratarse como una gigantesca matriz en la memoria y no requieren metadatos adicionales.
Retomando la manera en que se eliminaban archivos muertos mientras corría el programa, hablaremos del puntero y de como asumen que todos los valores que podrían ser punteros válidos se tratan como tal. Es una tarea esencial determinar si un valor podría ser puntero a un objeto dentro de esa página. Así pues, llegué a la conclusión de que los punteros son de suma importancia al momento de eliminar datos basura y que, sin ellos, sería muy difícil dicha acción.
La compactación de memoria se refiere al proceso de mover los objetos asignados y ponerlos juntos y dejar todos los espacios vacíos juntos para así evitar el error que vimos antes conocido como fragmentación. Es entonces este un proceso que yo lo veo bastante útil pues nos sirve para liberar memoria y para evitar errores y bugs.
GARBAGE COLLECTORS
Cooperative GC & Uncooperative GC
Los colectores de basura cooperativos son los que requieren que todo el sistema participe en la recolección. Este tipo de colectores no tienen pausas, por lo que yo considero que son mejor que los demás, por su rapidez y eficacia, el único inconveniente que yo le veo es el hecho de que necesita que el sistema entero trabaje y a veces esto podría resultar un inconveniente en equipos no tan avanzados.
MEMORY MANGEMENT
Overview
C++ nos ofrece distintas maneras de como manejar nuestra memoria(lo cuál en mi opinión es bueno, pues nunca se sabe cual será la mejor para nuestras necesidades o las necesidades del proyecto).
Garbage Collection
Además de contarnos lo que ya habíamos mencionado anteriormente sobre la recolección de basura; nos dicen que administrar manualmente la memoria requiere un alto por parte de los programadores ya que no hacer un buen manejo de la memoria podría resultar en inestabilidades y bloqueos que sólo se reflejarán al momento de ejecutar el programa, haciéndolos así difíciles de detectar y corregir.
El estándar de C++ nos permite incluir extensiones, lo cual representa una oportunidad excelente para los programadores demostrar lo que saben hacer y que tan buena es su manera de trabajar, entre las extensiones está el compilador C++ de Sun el cual incluye una biblioteca libgc(un recolector de basura conservador). El método de recolección de basura más común en C++ es el que lleva por nombre “RAII” (Resource Acquisition Is Initialization), que se traduce literalmente como “La adquisición de recursos es la inicialización”. Básicamente trata de que un recurso, es propiedad de un objeto y que el destructor del objeto automatizará la liberación de ese recurso en el momento adecuado, en otras palabras, que un recurso será parte de un objeto y que el destructor de objetos liberará automáticamente el recurso tomado en primer lugar en el momento en el que él lo crea adecuado.
...