]> git.llucax.com Git - z.facultad/75.00/presentacion.git/blobdiff - presentacion.rst
Eliminar notas de rst2beamer
[z.facultad/75.00/presentacion.git] / presentacion.rst
index 16f04540904f384c18621f28fa1f61c3577c29e9..243ac79892f174b88d0061f978320bcec669510f 100644 (file)
@@ -5,27 +5,24 @@ Recolección de Basura en D
 
 :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
@@ -33,122 +30,17 @@ Introducción
 ¿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()``
-
-  → Conservativo + Manipulación de *root set*
-
-* Programación de alto nivel ← Python/Ruby/Perl
-
-  * *GC*
-  * ``T[]``, ``T[K]``
+* Análisis del grafo de conectividad del *heap*
+* 50+ años de desarrollo
+* 3000+ *papers*
 
-  → Punteros interiores
-
-* Orientación a objetos ← Java
-
-  * ``~this()``
-
-  → Finalización
-
-
-
-Recolector de basura de D
-==============================================================================
-
-Implementación actual
---------------------------------------------------
-
-Organización del heap
-~~~~~~~~~~~~~~~~~~~~~
-*Heap* → *Pools* → Páginas → Bloques + Listas de libres
-
-.. image:: img/heap.pdf
-    :height: 6.7cm
-
-Bloques
-~~~~~~~
-* Tamaño fijo (por página)
-
-  * Potencias de 2
-  * De 16 a 4096 bytes
-  * Más de 4096 (una página)
-
-    * Objeto **grande**
-    * Múltiplo de páginas: 4096, 8192, ...
-    * En páginas contiguas (y mismo *pool*)
-
-* Indicadores (*bit sets* en *pool*)
-
-  * Marcado
-
-    * *mark*
-    * *scan*
-    * *noscan*
-
-  * Barrido
-
-    * *free*
-    * *finals*
-
-Algoritmo
-~~~~~~~~~
+Recolector Actual de D
+~~~~~~~~~~~~~~~~~~~~~~
 * Marcado y barrido
 
   * Marcado iterativo
@@ -159,68 +51,60 @@ Algoritmo
 
 * *Stop-the-world*
 
-  * Durante el marcado, en teoría
+  * Durante el marcado (en teoría)
 
 * *Lock* global
 
   * Muy propenso a extender el tiempo de *stop-the-world* en la práctica
 
-
-Lo bueno, lo malo y lo feo
---------------------------------------------------
-
-Lo bueno
-~~~~~~~~
+Recolector Actual - Lo Bueno
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Anda :)
-* Organización del *heap* (*two-level allocation*)
+* Organización del *heap* (< fragmentación)
 * Marcado iterativo (!\ *overflow*)
-* *Bit set* para indicadores (caché)
+* *Bitset* para bits de marca (*cache friendly*)
 
 (bueno != perfecto)
 
-Lo malo y lo feo
-~~~~~~~~~~~~~~~~
+Recolector Actual - Lo Malo y lo Feo
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Lo malo
 
 * ↓ Configurabilidad (*no silver bullet*)
 * ↓ Precisión (información de tipos) → Memoria inmortal
 * ↓ Concurrencia → Grandes pausas
-* ↓ Control sobre el factor de ocupación del *heap* → casos patológicos
+* ↓ Control sobre el factor de ocupación del *heap*
+
+  → Casos patológicos
 
 Lo feo
 
-* El código (complejo, intrincado, duplicado, poco documentado) → Difícil de
-  mantener, modificar y mejorar
+* El código (complejo, intrincado, duplicado, poco documentado)
+
+  → Difícil de mantener, modificar y mejorar
 
 
 
 Modificaciones Propuestas
 ==============================================================================
 
-Concurrencia
+Modificaciones Propuestas
 --------------------------------------------------
 
-fork(2)
-~~~~~~~
-* Hijo *nace* con una *fotografía* de la memoria del padre
-* Aisla modificaciones en la memoria de padre e hijo
-* Minimiza copia efectiva de memoria (*COW*)
-* Comienza con un solo hilo (el que llamó a ``fork(2)``)
-* Muy eficiente
-
-Algoritmo principal
-~~~~~~~~~~~~~~~~~~~
-* 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
+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)``)
 
-Problemas
-~~~~~~~~~
+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
@@ -228,10 +112,10 @@ Problemas
 
 → Tiempo de pausa en la práctica ~= tiempo total de recolección
 
-Eager allocation
-~~~~~~~~~~~~~~~~
-* Crea un nuevo *pool* de memoria antes de lanzar el marcado concurrente
-* Devuelve memoria del nuevo *pool* al programa mientras termina el marcado
+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
@@ -241,8 +125,8 @@ Eager allocation
 
   ↓ Tiempo de pausa real
 
-Early collection
-~~~~~~~~~~~~~~~~
+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
@@ -256,128 +140,101 @@ Early collection
 
   ↓ Tiempo de pausa real (no garantizado)
 
-
-Otras mejoras
---------------------------------------------------
-
-Precisión
-~~~~~~~~~
-Adaptación del trabajo de Vincent Lang y David Simcha:
-
-* Compilador genera información sobre ubicación de los punteros en un tipo
-
-  * Indica si una *palabra* debe ser escaneada (uniones)
-  * Indica si una palabra es un puntero
-
-* Se pasa esa información al recolector al momento de pedir memoria
-* Recolector original utiliza esa información
-
-  * Almacena un puntero a la información al final del bloque
-  * Utiliza la información para escanear solo palabras que son punteros (con
-    seguridad o potencialmente)
-
-Optimizaciones y otras mejoras menores
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Otras Mejoras
+~~~~~~~~~~~~~
+* 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*)
 
-Configurabilidad
-~~~~~~~~~~~~~~~~
-* Configurable en *tiempo de arranque*
-* Vía variable de entorno (``D_GC_OPTS``)
-* Viejas opciones convertidas
 
-  * ``mem_stop``
-  * ``sentinel``
 
-* Nuevas opciones
+Resultados
+==============================================================================
 
-  * ``pre_alloc``
-  * ``min_free``
-  * ``malloc_stats_file``
-  * ``collect_stats_file``
-  * ``conservative``
-  * ``fork``
-  * ``eager_alloc``
-  * ``early_collect``
+Resultados
+--------------------------------------------------
 
+Banco de Pruebas
+~~~~~~~~~~~~~~~~
+* Programas
 
+  * 7 *Micro-benchmarks*
+  * 5 *Olden Benchmark* (400-1000 *SLOC*)
+  * Dil (32K+ *SLOC*, 86 módulos, 300+ *clases*)
 
-Resultados
-==============================================================================
+* Métricas
 
-Banco de Pruebas
---------------------------------------------------
+  * 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
 
-Tiempo de Stop-The-World
---------------------------------------------------
+Tiempo Total de Ejecución
+~~~~~~~~~~~~~~~~~~~~~~~~~
+.. image:: img/norm-hist-time.pdf
+    :width: 12.5cm
 
-Diapositiva 1
-~~~~~~~~~~~~~
-Diapositiva 1
 
-Diapositiva 2
-~~~~~~~~~~~~~
-Diapositiva 2
 
+Conclusión
+==============================================================================
 
-Tiempo de Pausa Real
+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 Ejecución
---------------------------------------------------
+  * *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:
 
-Conclusión
-==============================================================================
+  **50% mayor** (213MiB → 307MiB)
 
-Conclusión
---------------------------------------------------
+  (mucho *overhead* por marcado preciso)
 
-Resumen
-~~~~~~~
-* Recolección de basura → Inagotable
-* D → Multi-paradigma → Desafío
-* Recolección de basura en D → Fértil
-* Mejoras propuestas → Efectivas
-* Resultados → Positivos: Esperados + Inesperados
+* Yapa
 
-Problemas, limitaciones y Puntos Pendientes
+  Tiempo total de ejecución de Dil:
+
+  Casi **3 veces menor** (55s → 20s)
+
+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
 ~~~~~~~~~~~~~~~~~~~~~
@@ -400,7 +257,7 @@ Trabajos Futuros
 ~~~~~~~~~~~~~~~~
 * Organización de memoria
 * Barrido
-* Precisión
+* \+ Precisión
 * Concurrencia → *Lock* **global**
 * Movimiento
 
@@ -412,4 +269,5 @@ Fin
 ~~~
 ¡Gracias!
 
+
 .. vim: set et sw=4 sts=4 spell spelllang=es :