]> git.llucax.com Git - z.facultad/75.00/informe.git/blob - source/gc.rst
Usar paquete de LaTeX para mostrar subfiguras
[z.facultad/75.00/informe.git] / source / gc.rst
1
2 .. Introducción a la importancia de la recolección de basura y sus
3    principales técnicas, con sus ventajas y desventajas. También se da
4    un breve recorrido sobre el estado del arte.
5    ESTADO: SIN EMPEZAR
6
7
8 .. _ref_gc:
9
10 Recolección de basura
11 ============================================================================
12
13 TODO
14
15 .. Breve descripción de la utilidad de la recolección de basura
16    ESTADO: TERMINADO
17
18 La recolección de basura es muchas veces vista por sus críticos de
19 una forma bastante *naïve*. Muchas veces se argumenta que sólo es
20 útil para programadores descuidados o que su necesidad es sólo una
21 manifestación de un mal diseño. Si bien estas dos afirmaciones pueden
22 ser, en algunos casos, ciertas, es falaz pensar que ese es la única
23 ventaja de un recolector de basura. Uno de los aspectos más importantes
24 de un recolector de basura es lograr un mayor nivel de abstracción
25 [JOLI96]_. En particular, al diseñar o programar bibliotecas, de no
26 haber un recolector de basura, **la administración de memoria pasa a ser
27 parte de la interfaz de la biblioteca**. Y lo peor de este aspecto es
28 que muy pocas veces esto es tenido en cuenta, derivando en bibliotecas
29 muy difíciles de usar correctamente sin perder memoria, por no quedar
30 bien clara la responsabilidad del manejo de memoria.
31
32 Esto se debe a que, como se mencionó anteriormente, el manejo de memoria
33 es un *artefacto* proveniente del *hardware*, no un concepto propio
34 de los algoritmos a representar y como tal, nos impide desarrollar una
35 mayor abstracción.
36
37 Muchas veces se aduce también que la recolección de basura impide
38 el desarrollo de programas eficientes. Si bien es innegable que la
39 recolección de basura impone una carga extra, ésta es, en la mayoría
40 de los casos, imperceptible. Incluso algunos algoritmos de recolección
41 de basura pueden aumentar la eficiencia en casos determinados, como los
42 recolectores que compactan, que pueden minimizar considerablemente la
43 cantidad de páginas de memoria referenciadas por el programa, mejorando
44 el *hit-ratio* tanto de la memoria virtual como del *cache*.  Aún si
45 este no fuera el caso, o en casos de sistemas de tiempo real o zonas muy
46 críticas en cuanto a la eficiencia, muchas veces es posible suspender
47 el recolector de basura en dicho fragmento de código. Es cierto que esto
48 rompe un poco con la idea de ganar abstracción, pero es necesario sólo
49 en casos donde hay que realizar optimizaciones y las optimizaciones son,
50 en general, dependientes de la plataforma (*hardware*) y por lo tanto
51 de difícil abstracción.
52
53 El recolector de basura debe tener un comportamiento correcto y predecible
54 para que sea útil, si el programador no puede confiar en el recolector
55 de basura, éste se vuelve más un problema que una solución, porque
56 introduce nuevos puntos de falla en los programas, y lo que es peor,
57 puntos de falla no controlados por el programador, volviendo mucho más
58 difícil la búsqueda de errores.
59
60 .. Presenta el problema y temas a ser tratados en el trabajo.
61    ESTADO: TERMINADO
62
63 Los lenguajes de programación modernos tienen una tendencia cada vez
64 más marcada a adoptar técnicas sofisticadas, haciéndolos más ricos y
65 convirtiéndolos realmente en lenguajes, no en meros preprocesadores que
66 convierten de una forma muy directa el código en *assembly*, permitiendo
67 construcciones semánticamente más ricas y permitiendo al programar una
68 mayor expresividad para plasmar algoritmos sin detenerse en los detalles
69 del *hardware*.
70
71 Estos conceptos supuestamente avanzados provienen, en general, de
72 lenguajes académicos (muchos de ellos funcionales) que implementan estas
73 funcionalidades hace mucho tiempo, pero que para su época, o bien no
74 tuvieron suficiente difusión en el ambiente comercial, o bien eran muy
75 lentos por la baja capacidad de procesamiento de la época o incluso
76 demasiado *revolucionarios* para ser adoptados por programadores que no
77 podían ver las ventajas que esos nuevos conceptos proveen.
78
79 El caso de la recolección de basura (*garbage collection* en inglés)
80 es uno de los más representativos. Lisp_ introdujo a principio de los
81 '60 este concepto, como un mecanismo para alocar y liberar recursos
82 (en general memoria alocada en el *heap*) de forma automática. Pero
83 no fue hasta avanzados los '90 que esta técnica se empezó a utilizar
84 en lenguajes de programación de uso comercial, cuando fue popularizado
85 por Java_. Incluso luego de más de 30 años para Java_ era costosa la
86 recolección de basura, lo que sumado a la presencia de una máquina
87 virtual para ejecutar los programas producidos, condujo a que estos
88 lenguajes sean notablemente lentos. Aún así Java_ creció y entre las
89 mejoras introducidas hubieron mejoras en la recolección de basura. Otros
90 lenguaje de programación populares que utilizan alguna forma de
91 recolección de basura son Python_, Ruby_, PHP_ y `C#`_, entre otros.
92
93
94
95 Introducción
96 ----------------------------------------------------------------------------
97
98 TODO
99
100
101
102 Algoritmos principales
103 ----------------------------------------------------------------------------
104
105 TODO
106
107
108
109 Conteo de referencias
110 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
111
112 TODO
113
114
115
116 Marcado y barrido
117 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118
119 TODO
120
121
122
123 Copia/Semi-espacio
124 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
125
126 TODO
127
128
129
130 Compactado
131 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
132
133 TODO
134
135
136
137 Estado del arte
138 ----------------------------------------------------------------------------
139
140 .. explicar la cantidad de cosas que hay (que son muchas) y dar algunos
141    ejemplos.
142
143 TODO
144
145
146 .. include:: links.rst
147
148 .. vim: set ts=2 sts=2 sw=2 et tw=75 :