:Autor: Leandro Lucarella
:Fecha: Diciembre 2010
-:Organización: FIUBA
+:Organización: Facultad de Ingeniería, UBA
Introducción
==============================================================================
-Presentación
+Introducción
--------------------------------------------------
Motivación
~~~~~~~~~~
* Recolección de basura
-* Lenguaje de programación **D**
-* Utilidad → Software Libre → Contribución
-
+* Lenguaje de programación D
+* Investigación + aplicación
+* Software Libre
Recolección de Basura
---------------------------------------------------
-
-Introducción
-~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~
¿Qué?
* Administración automática de memoria
¿Para qué?
* Simplificar interfaces
-* Mejorar eficiencia (**!**)
* Evitar errores de memoria
-
- * *Dangling pointers*
- * *Memory leaks*
- * *Double free*
+* Mejorar eficiencia (**!**)
¿Cómo?
-Algoritmos clásicos
-~~~~~~~~~~~~~~~~~~~
-* Conteo de referencias
-* **Marcado y barrido**
-* Copia de semi-espacio
-
-.. raw:: latex
-
- \multiinclude[format=pdf,graphics={height=4.5cm}]{img/mark-sweep}
-
-.. dummy: para que ande bien el raw de arriba
-
-Estado del arte
-~~~~~~~~~~~~~~~
-* Medio siglo de investigación y desarrollo (3000+ publicaciones)
-* Objetivo
-
- * ↓ Tiempo total de ejecución
- * ↓ Cantidad de recolecciones
- * ↓ Tiempo de recolección
- * ↓ **Tiempo (máximo) de pausa**
-
-* Técnicas
-
- * Particiones
- * **Concurrencia**
- * Organización de memoria
- * **Precisión**
- * Análisis estático
-
-
-El lenguaje de programación D
---------------------------------------------------
-
-Características generales
-~~~~~~~~~~~~~~~~~~~~~~~~~
-* Sintaxis tipo C/C++
-* Compilado
-* Sistema de tipos estático
-* Multi-paradigma
-
-Paradigmas
-~~~~~~~~~~
-* Programación de bajo nivel (*system-programming*) ← C/C++
-
- * ``asm``
- * ``union``
- * ``extern (C)``
- * ``malloc()``
+* Análisis del grafo de conectividad del *heap*
+* 50+ años de desarrollo
+* 3000+ *papers*
-* Programación de alto nivel ← Python/Ruby/Perl
+Recolector Actual de D
+~~~~~~~~~~~~~~~~~~~~~~
+* Marcado y barrido
- * *GC*
- * ``T[]``, ``T[K]``
+ * Marcado iterativo
-* Orientación a objetos ← Java
+* Conservativo
- * ``~this()``
+ * Con una pizca de *precisión* (``NO_SCAN``)
-* Programación genérica y meta-programación ← C++
-* Programación por contratos ← Eiffel
+* *Stop-the-world*
-.. r2b-note::
+ * Durante el marcado (en teoría)
- * Programación de bajo nivel (*system-programming*) ← C/C++
+* *Lock* global
- * **asm**, ``goto``, **align**, ``struct``, **union**, **link-compitble con C**,
- **malloc**
+ * Muy propenso a extender el tiempo de *stop-the-world* en la práctica
- * Programación de alto nivel ← Python/Ruby/Perl
+Recolector Actual - Lo Bueno
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Anda :)
+* Organización del *heap* (< fragmentación)
+* Marcado iterativo (!\ *overflow*)
+* *Bitset* para bits de marca (*cache friendly*)
- * **GC**, module/import, ``delegate``, ``lazy``, *strings*, **arreglos dinámicos
- y asociativos**, ddoc, inferencia de tipos (ltd), ``foreach``
+(bueno != perfecto)
- * Orientación a objetos ← Java
+Recolector Actual - Lo Malo y lo Feo
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Lo malo
- * Más Java que C++: semántica de referencia, métodos siempre virtuales, herencia
- simple + interfaces, clases anidadas, **destructores**... + Properties
+* ↓ Configurabilidad (*no silver bullet*)
+* ↓ Precisión (información de tipos) → Memoria inmortal
+* ↓ Concurrencia → Grandes pausas
+* ↓ Control sobre el factor de ocupación del *heap*
- * Programación genérica y meta-programación ← C++
+ → Casos patológicos
- * ``static if``, ``typeof``, (*variadic*) ``tamplate``, *CTFE*, (*string*)
- ``mixin``\ s, expresiones ``is``
+Lo feo
- * Programación por contratos ← Eiffel
+* El código (complejo, intrincado, duplicado, poco documentado)
- * Excepciones, ``assert``, pre/post condiciones, ``invariant``, ``unittest``,
- ``scope``, inicialización garantizada, *RAII*, ``synchronized``
+ → Difícil de mantener, modificar y mejorar
-Recolección de Basura en D
+Modificaciones Propuestas
==============================================================================
-Requerimientos
---------------------------------------------------
-
-Según paradigma
-~~~~~~~~~~~~~~~
-* Programación de bajo nivel
-
- * ``asm``
- * ``union``
- * ``extern (C)``
- * ``malloc()``
-
- → Conservativo + Manipulación de *root set*
-
-* Programación de alto nivel ← Python/Ruby/Perl
-
- * ``T[]``, ``T[K]``
-
- → Punteros interiores
-
-* Orientación a objetos ← Java
-
- * ``~this()``
-
- → Finalización
-
-
-Implementación Actual
---------------------------------------------------
-
-Organización del heap
-~~~~~~~~~~~~~~~~~~~~~
-.. image:: img/heap.pdf
- :height: 7cm
-
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
-
-
-Lo Bueno, lo Malo y lo Feo
+Modificaciones Propuestas
--------------------------------------------------
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
-
-Diapositiva 2
+Concurrencia
+~~~~~~~~~~~~
+* Algoritmo basado en el trabajo de Gustavo Rodriguez-Rivera y Vince Russo
+ (*Non-intrusive Cloning Garbage Collector with Stock Operating System
+ Support*)
+* Minimiza tiempo de pausa realizando fase de **marcado concurrente** vía
+ ``fork(2)``
+* Proceso padre sigue corriendo el programa
+* Proceso hijo realiza fase de marcado
+* Se comunican resultados vía memoria compartida
+* Sincronización mínima (``fork(2)`` + ``waitpid(2)``)
+
+Concurrencia - Problemas
+~~~~~~~~~~~~~~~~~~~~~~~~
+* Hilo que disparó la recolección bloqueado hasta fin de recolección completa
+ (marcado concurrente inclusive)
+* Otros hilos potencialmente bloqueados durante toda la recolección también
+ (*lock* global)
+
+→ Tiempo de pausa en la práctica ~= tiempo total de recolección
+
+Concurrencia - Eager Allocation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Pide más memoria al OS antes de lanzar el marcado concurrente
+* Devuelve memoria nueva al programa mientras termina el marcado
+ concurrente
+* Permite al programa (**todos** sus hilos) seguir trabajando mientras se
+ realiza el marcado concurrente
+* Compromiso
+
+ ↑ Consumo de memoria
+
+ ↓ Tiempo de pausa real
+
+Concurrencia - Early Collection
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Dispara una recolección *preventiva* antes de que se agote la memoria
+* Permite al programa (**todos** sus hilos) seguir trabajando mientras la
+ recolección *preventiva* está en progreso
+* Si se agota la memoria antes de que la recolección *preventiva* finalice, se
+ vuelve a bloquear
+* Combinable con *eager allocation* para evitar bloquear
+* Pueden realizarse más recolecciones de las necesarias
+* Compromiso
+
+ ↑ Consumo de procesador (potencialmente)
+
+ ↓ Tiempo de pausa real (no garantizado)
+
+Otras Mejoras
~~~~~~~~~~~~~
-Diapositiva 2
+* Marcado semi-preciso del *heap*
+* Mejora del factor de ocupación del *heap*
+* Caché de consultas críticas para acelerar cuellos de botella
+* Reestructuración, modularización, simplificación y limpieza del código
+* Pre-asignación de memoria
+* Optimizaciones algorítmicas sobre búsquedas frecuentes
+* Registro de pedidos de memoria y recolecciones realizadas
+* Configurabilidad (en *tiempo de inicialización*)
-Modificaciones Propuestas
+Resultados
==============================================================================
-Precisión
+Resultados
--------------------------------------------------
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
+Banco de Pruebas
+~~~~~~~~~~~~~~~~
+* Programas
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
+ * 7 *Micro-benchmarks*
+ * 5 *Olden Benchmark* (400-1000 *SLOC*)
+ * Dil (32K+ *SLOC*, 86 módulos, 300+ *clases*)
+* Métricas
-Concurrencia
---------------------------------------------------
+ * Tiempo total de ejecución
+ * Tiempo máximo de *stop-the-world*
+ * Tiempo máximo de pausa real
+ * Cantidad máxima de memoria utilizada
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
+Tiempo Máximo de Stop-The-World
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. image:: img/norm-hist-stw.pdf
+ :width: 12.5cm
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
+Tiempo Máximo de Pausa Real
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. image:: img/norm-hist-pause.pdf
+ :width: 12.5cm
+Cantidad Máxima de Memoria Utilizada
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.. image:: img/norm-hist-mem.pdf
+ :width: 12.5cm
-Optimizaciones
---------------------------------------------------
-
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
-
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
+Tiempo Total de Ejecución
+~~~~~~~~~~~~~~~~~~~~~~~~~
+.. image:: img/norm-hist-time.pdf
+ :width: 12.5cm
-Resultados
+Conclusión
==============================================================================
-Banco de Pruebas
---------------------------------------------------
-
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
-
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
-
-
-Tiempo de Stop-The-World
+Conclusión
--------------------------------------------------
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
+Resumen
+~~~~~~~
+* Objetivo principal
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
+ Minimizar tiempo de pausa para programas reales
+ Tiempo de pausa de Dil:
-Tiempo de Pausa Real
---------------------------------------------------
+ * *Stop-the-world* **160 veces menor** (1.66s → 0.01s)
+ * Pausa real **40 veces menor** (1.7s → 0.045s)
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
+* Objetivo secundario
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
+ No empeorar mucho el recolector actual en ningún aspecto
+ Utilización de memoria de Dil:
-Tiempo de Ejecución
---------------------------------------------------
+ **50% mayor** (213MiB → 307MiB)
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
+ (mucho *overhead* por marcado preciso)
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
-
-
-Conclusión
-==============================================================================
+* Yapa
-Conclusión
---------------------------------------------------
+ Tiempo total de ejecución de Dil:
-Resumen
-~~~~~~~
-* Recolección de basura → Inagotable
-* D → Multi-paradigma → Desafío
-* Recolección de basura en D → Fértil
-* Mejoras propuestas → Acierto
-* Resultados → Esperados + Inesperados
+ Casi **3 veces menor** (55s → 20s)
-Problemas, limitaciones y Puntos Pendientes
+Problemas, Limitaciones y Puntos Pendientes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-* Predicción de *early collection*
* Explosión de uso de memoria con *eager allocation*
+* Eficiencia del marcado preciso
+* Mejorar predicción de *early collection*
* Experimentar con ``clone(2)``
-* Eficiencia de marcado
Trabajos Relacionados
~~~~~~~~~~~~~~~~~~~~~
* *Integrate Precise Heap Scanning Into the GC*
- David Simcha (GC + diseño) + Vincent Lang (compilador). No formal, *bug
+ David Simcha (GC + diseño) y Vincent Lang (compilador). No formal, *bug
report*, 2009-2010.
+* *Non-intrusive Cloning Garbage Collection with Stock Operating System Support*
+
+ Gustavo Rodriguez-Rivera y Vince Russo. Software Practiceand Experience
+ Volumen 27, Número 8. Agosto 1997.
+
Trabajos Futuros
~~~~~~~~~~~~~~~~
* Organización de memoria
* Barrido
-* Precisión
+* \+ Precisión
* Concurrencia → *Lock* **global**
* Movimiento
~~~
¡Gracias!
+
.. vim: set et sw=4 sts=4 spell spelllang=es :