]> git.llucax.com Git - z.facultad/75.00/informe.git/blobdiff - source/conclusion.rst
Aclarar qué variables son globales en copying collector
[z.facultad/75.00/informe.git] / source / conclusion.rst
index 945513dbf58dad4bcb0bd93b23f92527b5a43486..f702eef2f7bb4dcea62480065270d33fb42c7106 100644 (file)
@@ -1,10 +1,4 @@
 
-.. Se presentan las conclusiones del trabajo, comparando los resultados
-   obtenidos con el punto de partida. Se mencionan puntos pendientes o
-   nuevas líneas de investigación.
-   ESTADO: EMPEZADO
-
-
 .. _conclusion:
 
 Conclusión
@@ -23,11 +17,11 @@ El objetivo principal fue bajar la latencia del recolector, es decir el tiempo
 máximo de pausa real, y se pudo comprobar que, salvo en casos muy
 particulares, esto fue conseguido de manera contundente (con tiempos de pausa
 hasta 200 veces menores que el recolector original de D_). La inclusión del
-marcado concurrente demostró ser una aproximación correcta al problema.
+marcado concurrente demostró ser una forma eficaz de atacar el problema.
 
 La aceptación de la solución por parte de la comunidad también ha sido un
 objetivo importante de este trabajo, y si bien en este sentido sigue siendo un
-trabajo en curso, la recepción ha sido ampliamente positiva por parte de la
+trabajo en progreso, la recepción ha sido ampliamente positiva por parte de la
 comunidad y se espera que el resultado de este trabajo sea incorporado en el
 corto plazo tanto a `D 1.0`_ a través de Tango_, como a `D 2.0`_.
 
@@ -55,14 +49,16 @@ existen *balas de plata*, y cada programa tiene necesidades particulares en
 cuanto a recolección de basura. Por lo tanto, distintos programas pueden verse
 beneficiados o perjudicados por diferentes configuraciones. Esto hace que la
 posibilidad de configurar el recolector en tiempo de inicialización sea
-particularmente ventajoso.
+particularmente útil.
 
 Finalmente, algunas optimizaciones muy pequeñas demostraron ser también muy
-valiosas para algunos casos particulares, logrando reducciones en el tiempo
+valiosas para ciertos casos particulares, logrando reducciones en el tiempo
 total de ejecución de hasta 5 veces.
 
 
 
+.. _con_pending:
+
 Puntos pendientes, problemas y limitaciones
 ----------------------------------------------------------------------------
 
@@ -75,11 +71,12 @@ y limitaciones conocidas. A continuación se describe cada una de ellos.
   Entre las herramientas de depuración que provee el recolector, no se ha
   mencionado la posibilidad de emitir opcionalmente mensajes informativos para
   ayudar a depurar tanto problemas en el recolector como en el programa que lo
-  usa. El recolector actual tiene esa posibilidad pero es elegible en tiempo de
-  compilación. En este trabajo se agregaron las opciones en tiempo de
-  inicialización ``log_file`` y ``verbose`` con el propósito de poder elegir un
-  archivo en donde guardar los mensajes informativos y el nivel de detalle de
-  dichos mensajes respectivamente, pero finalmente nunca se implementaron.
+  usa. El recolector actual tiene esa posibilidad pero es configurable en
+  tiempo de compilación. En este trabajo se agregaron las opciones en tiempo
+  de inicialización ``log_file`` y ``verbose`` con el propósito de poder
+  elegir un archivo en donde guardar los mensajes informativos y el nivel de
+  detalle de dichos mensajes respectivamente, pero finalmente nunca se
+  implementaron.
 
 * Predicción para estimar cuando lanzar una recolección temprana.
 
@@ -228,9 +225,10 @@ y limitaciones conocidas. A continuación se describe cada una de ellos.
   precio sin obtener los beneficios. Queda pendiente analizar en más detalle
   las causas de esto y posibles optimizaciones para subsanarlo.
 
-  .. ftable:: t:con-staticsize
+  .. flt:: t:con-staticsize
+     :type: table
 
-     Aumento del tamaño de la memoria estática (bytes).
+     Aumento del tamaño de la memoria estática (bytes)
 
      ======== ======== ======== =========== ===========
      Programa TBGC     CDGC     CDGC-TBGC   CDGC/TBGC
@@ -263,7 +261,7 @@ y limitaciones conocidas. A continuación se describe cada una de ellos.
   hay necesidad de que la información de tipos sea parte del *root set*). Esto
   causa que por cada recolección, se tenga que visitar bastante más memoria y,
   lo que es probablemente peor, que aumente la probabilidad de encontrar
-  *falsos punteros*, dado que este área de memoria se marca siempre de forma
+  *falsos positivos*, dado que este área de memoria se marca siempre de forma
   conservativa.
 
   Finalmente, en el cuadro :vref:`t:con-binsize` también se puede observar un
@@ -271,9 +269,10 @@ y limitaciones conocidas. A continuación se describe cada una de ellos.
   pérdida de rendimiento, dado que puede afectar a la localidad de referencia
   del caché, por ejemplo.
 
-  .. ftable:: t:con-binsize
+  .. flt:: t:con-binsize
+     :type: table
 
-     Aumento del tamaño del binario (bytes).
+     Aumento del tamaño del binario (bytes)
 
      ======== ======== ======== =========== ===========
      Programa TBGC     CDGC     CDGC-TBGC   CDGC/TBGC
@@ -298,40 +297,148 @@ y limitaciones conocidas. A continuación se describe cada una de ellos.
 Trabajos relacionados
 ----------------------------------------------------------------------------
 
-Dado que D_ no está muy difundido en ámbitos académicos, la cantidad de
-trabajos relacionados es muy pequeña, sin embargo los hay, y a continuación se
-describen.
+Dado que D_ no ha penetrado en ámbitos académicos, se ha encontrado un solo
+trabajo de investigación relacionado. Sin embargo se ha encontrado otro
+que si bien no es formal, ha sido de mucha importancia para el desarrollo de
+esta tesis.
+
+A continuación se describen ambos.
+
+* *Memory Management in the D Programming Language* [PAN09]_.
+
+  Tesis de licenciatura de Vladimir Panteleev cuya resumen traducido es el
+  siguiente:
+
+      Este reporte describe el estudio de las técnicas de manejo automático de
+      memoria, su implementación en el lenguaje de programación D_, y el
+      trabajo para mejorar el estado del manejo de memoria.
+
+  Si bien plantea pequeñas optimizaciones para el recolector de basura
+  (algunas utilizadas en este trabajo), se centra principalmente en el
+  desarrollo de Diamond, una utilidad para depuración de manejo de memoria en
+  D_.
+
+* Integración de marcado preciso del *heap* al recolector de basura
+  [DBZ3463]_.
+
+  Ya citado varias veces en este trabajo; fue comenzado por David Simcha
+  y publicado en el sistema de seguimiento de fallas de D_ que se limita a una
+  implementación a nivel biblioteca de usuario y sobre `D 2.0`_. Vincent Lang
+  (mejor conocido como *wm4* en la comunidad de D_) da continuidad a este
+  trabajo pero modificando el compilador DMD_ y trabajando con `D 1.0`_
+  y Tango_.
+
+  El soporte de marcado preciso presentado en este trabajo se basa en las
+  modificaciones hechas al compilador DMD_ por Vincent Lang (que aún no fueron
+  integradas de forma oficial).
 
-* Diamond [PAN09]_:
-  http://thecybershadow.net/d/Memory_Management_in_the_D_Programming_Language.pdf
 
 
 Trabajos futuros
 ----------------------------------------------------------------------------
 
-TODO
-
-* Cambiar el layout de memoria (mostrar lo encontrado en el post). Se podría
-  usar un tamaño de bloque por cada tipo de dato (y por lo tanto una lista de
-  libres por cada tipo de dato). Esto podría ahorrar muchos bits (mark,
-  freebits, scan, etc.), el puntero al pointer mask se guardaría una sola vez,
-  no hay ningún desperdicio de espacio salvo algún padding, pero podrían haber
-  esquemas donde ni siquiera (si siempre se alocan tantas páginas como sean
-  necesarias para evitar el padding para un tamaño de bloque). Un tipo de dato
-  NO_SCAN no alocaría directamente bits de noscan, mark y scan. Se podría
-  tratar de forma especial a strings.
-* Lazy sweeping.
-* Concurrent sweeping (lanzar fase de sweep en un thread que no pertenezca al
-  mutator).
-* Continuous collection (lanzar un thread que esté haciendo fullcollect() en
-  un loop). Lo bueno es que el sweep podría correr en ese thread, bajando aún
-  más el tiempo máximo de pausa (aunque esto se puede hacer más allá de hacer
-  continuous collection, ver "concurrent sweeping"), lo malo es que tal vez se
-  estaría recolectando demasiado sin ninguna ganancia substancial.
-* Hacer preciso el static data por el tema de los TypeInfo's que ocupan mucha
-  memoria que debe ser escaneada.
-* Tratar de remover el *lock* global.
-* Implementar un recolector con movimiento.
+En la sección :ref:`con_pending` se mencionan varios aspectos de este trabajo
+que podrían verse beneficiados por trabajos futuros, sin embargo se trata en
+general de pequeñas optimizaciones o mejoras de alcance muy limitado.
+
+A continuación se recopilan varios otros aspectos identificados durante el
+desarrollo del presente trabajo, pero que requieren un nivel de análisis
+y, potencialmente, de desarrollo mayor a los ya presentados en la sección
+mencionada.
+
+* Mejoras en la organización de memoria del recolector.
+
+  Si bien se ha mencionado en un principio la organización actual como un
+  aspecto positivo del recolector, varios resultados han demostrado
+  deficiencias importantes. El nivel de espacio desperdiciado por la división
+  de memoria en bloques puede ser muy significativa y la forma en la que se
+  almacena la información de tipos para el marcado preciso puede incluso
+  acentuarlo todavía más (como se demuestra en los resultados para ``bh``
+  y ``dil``).
+
+  Este problema no solo afecta al consumo de memoria, además genera un efecto
+  dominó por el incremento de la probabilidad de tener *falsos positivos*
+  y perjudica al tiempo total de ejecución por empeorar la localidad de
+  referencia del caché y por hacer que se prolongue la recolección de basura
+  por tener que marcar y barrer más memoria.
+
+  Una posible alternativa es tener una lista de libres por **tipo**, cuyo
+  tamaño de bloque sea exactamente igual al tamaño del tipo que almacena. La
+  información de tipo se almacenaría entonces solo una vez y no habría
+  desperdicio de memoria alguno dejando de lado un posible relleno para
+  completar una página. Este esquema debería tener algún tipo de guarda para
+  programas con una cantidad exuberante de tipos de datos.
+
+  También podría ser conveniente separar los bloques marcados como ``NO_SCAN``
+  de los que sí deben ser marcados, de manera que no necesite almacenar
+  directamente los bits de ``mark`` , ``scan`` y ``noscan``. También se podría
+  proponer algún área de memoria especial para almacenar cadenas de texto
+  (como un caso especial de lo anterior) por tener estas características muy
+  particular (largos muy variables, cambian de tamaño de forma relativamente
+  frecuente, etc.). Las posibilidades son enormes.
+
+* Mejoras en la fase de barrido.
+
+  En este trabajo todas las mejoras propuestas se encargaron de la fase de
+  marcado, pero mucho se pude mejorar en la fase de barrido también. Por un
+  lado se podría agregar barrido perezoso para disminuir aún más el tiempo de
+  pausa real. Se ha mostrado que en muchos casos los tiempos de pausa pueden
+  ser considerablemente altos debido a que la fase de barrido no se realiza en
+  paralelo como el marcado.
+
+  Otra forma de disminuir el tiempo de pausa real sería realizar un barrido
+  concurrente también. Esto no puede realizarse en otro proceso porque el
+  barrido es el encargado de ejecutar los *finalizadores*, pero sí se podría
+  barrer en otro hilo y, por ejemplo, seguir utilizando *eager allocation*
+  hasta que el barrido finalice.
+
+* Mejoras en la precisión del marcado.
+
+  Como se mencionó anteriormente, el área de memoria estática se marca de
+  forma conservativa dada la falta de información de tipos de ésta. Sin
+  embargo es bastante razonable pensar en que el compilador genere información
+  de tipos para el área de memoria estática o que al menos informe mejor al
+  recolector que partes deben ser consideradas parte del *root set* y cuales
+  no. Dado que la memoria estática crece de forma considerable con el
+  incremento de la cantidad de tipos definidos por el usuario, ya solo esa
+  división puede hacer una diferencia importante; en especial considerando
+  como aumenta la memoria estática solamente por usar más tipos de datos en el
+  recolector.
+
+  También podría explorarse el agregado de precisión al *stack* pero esto es
+  realmente muy complicado dado que la única solución que pareciera viable es
+  el uso de *shadow stack* [HEND02]_ que requiere un trabajo extra por cada
+  llamado a función, cosa que va en contra de la filosofía de D_ de pagar solo
+  por lo que se usa. Sin embargo podría explorarse agregar un esquema de ese
+  tipo como una opción del compilador, de forma que el usuario pueda decidir
+  si vale la pena para una aplicación particular o no.
+
+* Mejoras en la concurrencia.
+
+  El *lock* global del recolector es otro aspecto que demostró ser
+  problemático. Podrían analizarse formas de minimizar la necesidad de usar
+  *locks* o de hacerlo de forma más granular, de manera que algunas
+  operaciones del recolector puedan ser ejecutadas en paralelo. También se
+  podría experimentar con el uso de estructura de datos libres de *locks*
+  (*lock-free*).
+
+  Otra forma de minimizar la sincronización es utilizando *pools* por hilo, de
+  manera de poder alocar memoria de forma concurrente y hasta explorar la
+  posibilidad de efectuar recolecciones locales a un solo hilo; aunque esto
+  último probablemente sea equivalente a implementar un recolector de basura
+  con particiones (por ejemplo generacional).
+
+* Recolección con movimiento.
+
+  La información de tipos provista por el trabajo hecho por Vincent Lang
+  [DBZ3463]_ es suficientemente completa como para poder implementar un
+  recolector con movimiento. La efectividad de un recolector de estas
+  características en D_ está por comprobarse, dado que cualquier celda
+  apuntada por alguna palabra que debió ser marcada de forma conservativa debe
+  quedar inmóvil, por lo que gran parte del éxito de un recolector con
+  movimiento en D_ está supeditado a la proporción de celdas que queden
+  inmóviles. Sin embargo sea muy probablemente un área que valga la pena
+  explorar.
 
 
 .. include:: links.rst