2 ==========================
3 Recolección de Basura en D
4 ==========================
6 :Autor: Leandro Lucarella
8 :Organización: Facultad de Ingeniería, UBA
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 Actual 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
74 Recolector Actual - Lo Bueno
75 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
77 * Organización del *heap* (< fragmentación)
78 * Marcado iterativo (!\ *overflow*)
79 * *Bitset* para bits de marca (*cache friendly*)
87 Recolector Actual - Lo Malo y lo Feo
88 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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)``)
132 Concurrencia - Problemas
133 ~~~~~~~~~~~~~~~~~~~~~~~~
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
145 Concurrencia - Eager Allocation
146 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
147 * Pide más memoria al OS antes de lanzar el marcado concurrente
148 * Devuelve memoria nueva 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
162 Concurrencia - Early Collection
163 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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 --------------------------------------------------
213 * 7 *Micro-benchmarks*
214 * 5 *Olden Benchmark* (400-1000 *SLOC*)
215 * Dil (32K+ *SLOC*, 86 módulos, 300+ *clases*)
219 * Tiempo total de ejecución
220 * Tiempo máximo de *stop-the-world*
221 * Tiempo máximo de pausa real
222 * Cantidad máxima de memoria utilizada
224 Tiempo Máximo de Stop-The-World
225 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
226 .. image:: img/norm-hist-stw.pdf
233 Explicar brevemente división de pruebas (cual es trivial, pequeña, real)
235 Tiempo Máximo de Pausa Real
236 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
237 .. image:: img/norm-hist-pause.pdf
244 Explicar que donde hay grandes diferencias, es por tiempo de barrido
246 Cantidad Máxima de Memoria Utilizada
247 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
248 .. image:: img/norm-hist-mem.pdf
255 Enganchar lo anterior con la relación con el consumo de memoria
257 Tiempo Total de Ejecución
258 ~~~~~~~~~~~~~~~~~~~~~~~~~
259 .. image:: img/norm-hist-time.pdf
266 * mcore y split bajan mucho por caché de tamaño
267 * rnddata baja mucho por marcado preciso
268 * bigarr y sbtree suben porque no hacen más que alocar
273 ==============================================================================
276 --------------------------------------------------
282 Minimizar tiempo de pausa para programas reales
284 Tiempo de pausa de Dil:
286 * *Stop-the-world* **160 veces menor** (1.66s → 0.01s)
287 * Pausa real **40 veces menor** (1.7s → 0.045s)
289 * Objetivo secundario
291 No empeorar mucho el recolector actual en ningún aspecto
293 Utilización de memoria de Dil:
295 **50% mayor** (213MiB → 307MiB)
297 (mucho *overhead* por marcado preciso)
301 Tiempo total de ejecución de Dil:
303 Casi **3 veces menor** (55s → 20s)
309 Problemas, Limitaciones y Puntos Pendientes
310 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
311 * Explosión de uso de memoria con *eager allocation*
312 * Eficiencia del marcado preciso
313 * Mejorar predicción de *early collection*
314 * Experimentar con ``clone(2)``
320 Trabajos Relacionados
321 ~~~~~~~~~~~~~~~~~~~~~
322 * *Memory Management in the D Programming Language*
324 Vladimir Panteleev. Proyecto de licenciatura, Universitatea Tehnică
327 * *Integrate Precise Heap Scanning Into the GC*
329 David Simcha (GC + diseño) y Vincent Lang (compilador). No formal, *bug
332 * *Non-intrusive Cloning Garbage Collection with Stock Operating System Support*
334 Gustavo Rodriguez-Rivera y Vince Russo. Software Practiceand Experience
335 Volumen 27, Número 8. Agosto 1997.
343 * Organización de memoria
346 * Concurrencia → *Lock* **global**
362 .. vim: set et sw=4 sts=4 spell spelllang=es :