2 ==========================
3 Recolección de Basura en D
4 ==========================
6 :Autor: Leandro Lucarella
12 ==============================================================================
15 --------------------------------------------------
19 * Recolección de basura
20 * Lenguaje de programación D
21 * Investigación + aplicación
34 * Administración automática de memoria
38 * Simplificar interfaces
39 * Evitar errores de memoria
40 * Mejorar eficiencia (**!**)
44 * Análisis del grafo de conectividad del *heap*
45 * 50+ años de desarrollo
52 Recolector de Basura de D
53 ~~~~~~~~~~~~~~~~~~~~~~~~~
60 * Con una pizca de *precisión* (``NO_SCAN``)
64 * Durante el marcado (en teoría)
68 * Muy propenso a extender el tiempo de *stop-the-world* en la práctica
77 * Organización del *heap* (< fragmentación)
78 * Marcado iterativo (!\ *overflow*)
79 * *Bitset* para bits de marca (*cache friendly*)
91 * ↓ Configurabilidad (*no silver bullet*)
92 * ↓ Precisión (información de tipos) → Memoria inmortal
93 * ↓ Concurrencia → Grandes pausas
94 * ↓ Control sobre el factor de ocupación del *heap*
100 * El código (complejo, intrincado, duplicado, poco documentado)
102 → Difícil de mantener, modificar y mejorar
110 Modificaciones Propuestas
111 ==============================================================================
113 Modificaciones Propuestas
114 --------------------------------------------------
118 * Algoritmo basado en el trabajo de Gustavo Rodriguez-Rivera y Vince Russo
119 (*Non-intrusive Cloning Garbage Collector with Stock Operating System
121 * Minimiza tiempo de pausa realizando fase de marcado **concurrente** vía
123 * Proceso padre sigue corriendo el programa
124 * Proceso hijo realiza fase de marcado
125 * Se comunican resultados vía memoria compartida
126 * Sincronización mínima (``fork(2)`` + ``waitpid(2)``)
134 * Hilo que disparó la recolección bloqueado hasta fin de recolección completa
135 (marcado concurrente inclusive)
136 * Otros hilos potencialmente bloqueados durante toda la recolección también
139 → Tiempo de pausa en la práctica ~= tiempo total de recolección
147 * Crea un nuevo *pool* de memoria antes de lanzar el marcado concurrente
148 * Devuelve memoria del nuevo *pool* al programa mientras termina el marcado
150 * Permite al programa (**todos** sus hilos) seguir trabajando mientras se
151 realiza el marcado concurrente
156 ↓ Tiempo de pausa real
164 * Dispara una recolección *preventiva* antes de que se agote la memoria
165 * Permite al programa (**todos** sus hilos) seguir trabajando mientras la
166 recolección *preventiva* está en progreso
167 * Si se agota la memoria antes de que la recolección *preventiva* finalice, se
169 * Combinable con *eager allocation* para evitar bloquear
170 * Pueden realizarse más recolecciones de las necesarias
173 ↑ Consumo de procesador (potencialmente)
175 ↓ Tiempo de pausa real (no garantizado)
181 Si hago una recolección cuando queda 20% de memoria libre y nadie pide más
182 memoria mientras se recolecta, es como si tuviera 20% menos de memoria
183 disponible para el programa => más recolecciones => más consumo de CPU (y
184 potencialmente run-time)
188 * Marcado semi-preciso del *heap*
189 * Mejora del factor de ocupación del *heap*
190 * Caché de consultas críticas para acelerar cuellos de botella
191 * Reestructuración, modularización, simplificación y limpieza del código
192 * Pre-asignación de memoria
193 * Optimizaciones algorítmicas sobre búsquedas frecuentes
194 * Registro de pedidos de memoria y recolecciones realizadas
195 * Configurabilidad (en *tiempo de inicialización*)
204 ==============================================================================
207 --------------------------------------------------
209 Tiempo Máximo de Stop-The-World
210 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
211 .. image:: img/norm-hist-stw.pdf
218 Explicar brevemente división de pruebas (cual es trivial, pequeña, real)
220 Tiempo Máximo de Pausa Real
221 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
222 .. image:: img/norm-hist-pause.pdf
229 Explicar que donde hay grandes diferencias, es por tiempo de barrido
231 Cantidad Máxima de Memoria Utilizada
232 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
233 .. image:: img/norm-hist-mem.pdf
240 Enganchar lo anterior con la relación con el consumo de memoria
242 Tiempo Total de Ejecución
243 ~~~~~~~~~~~~~~~~~~~~~~~~~
244 .. image:: img/norm-hist-time.pdf
251 * mcore y split bajan mucho por caché de tamaño
252 * rnddata baja mucho por marcado preciso
253 * bigarr y sbtree suben porque no hacen más que alocar
258 ==============================================================================
261 --------------------------------------------------
267 Minimizar tiempo de pausa para programas reales
269 Tiempo de pausa de Dil:
271 * *Stop-the-world* **160 veces menor** (1.66s → 0.01s)
272 * Pausa real **40 veces menor** (1.7s → 0.045s)
274 * Objetivo secundario
276 No empeorar mucho el recolector actual en ningún aspecto
278 Utilización de memoria de Dil:
280 **50% mayor** (mucho *overhead* por marcado preciso)
284 Tiempo total de ejecución de Dil:
286 Casi **3 veces menor** (55s → 20s)
292 Problemas, Limitaciones y Puntos Pendientes
293 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
294 * Explosión de uso de memoria con *eager allocation*
295 * Eficiencia del marcado preciso
296 * Mejorar predicción de *early collection*
297 * Experimentar con ``clone(2)``
303 Trabajos Relacionados
304 ~~~~~~~~~~~~~~~~~~~~~
305 * *Memory Management in the D Programming Language*
307 Vladimir Panteleev. Proyecto de licenciatura, Universitatea Tehnică
310 * *Integrate Precise Heap Scanning Into the GC*
312 David Simcha (GC + diseño) y Vincent Lang (compilador). No formal, *bug
315 * *Non-intrusive Cloning Garbage Collection with Stock Operating System Support*
317 Gustavo Rodriguez-Rivera y Vince Russo. Software Practiceand Experience
318 Volumen 27, Número 8. Agosto 1997.
326 * Organización de memoria
329 * Concurrencia → *Lock* **global**
345 .. vim: set et sw=4 sts=4 spell spelllang=es :