-.. Describe más detalladamente los problemas actuales del recolector de
- basura de D, sentando las bases para el análisis de los requerimientos
- de recolección de basura en dicho lenguaje (se explica por qué las
- particularidades descriptas en la sección anterior complican la
- recolección de basura y cuales son las que más molestan).
- ESTADO: TERMINADO
-
-
.. _dgc:
Recolección de basura en D
El control sobre la alineación de memoria es otra complicación sobre el
recolector de basura, incluso aunque éste sea conservativo. Dado que tratar la
memoria de forma conservativa byte a byte sería impracticable (tanto por la
-cantidad de falsos positivos que esto provocaría como por el impacto en el
+cantidad de *falsos positivos* que esto provocaría como por el impacto en el
rendimiento por el exceso de posibles punteros a revisar, además de lo
ineficiente que es operar sobre memoria no alineada), en general el recolector
asume que el usuario nunca va a tener la única referencia a un objeto en una
que el recolector, al encontrar que no hay más referencias a un objeto, debe
ejecutar el destructor.
-La especificación dice:
+La especificación dice [DWDE]_:
The garbage collector is not guaranteed to run the destructor for all
unreferenced objects. Furthermore, the order in which the garbage collector
de marcado (que es iterativa y realiza varias pasadas sobre **todo** el
*heap*, incluyendo las celdas libres) no visite las celdas libres perdiendo
tiempo sin sentido y potencialmente manteniendo *vivas* celdas que en
-realidad son *basura* (falsos positivos)::
+realidad son *basura* (*falsos positivos*)::
function mark_free_lists() is
foreach free_list in heap
Finalización
^^^^^^^^^^^^
El recolector actual no garantiza la finalización de objetos. En particular
-los objetos no son finalizados (es decir, no se llama a sus destructores)
-si aún alcanzables desde el *root set* cuando el programa termina. Cabe
-destacar que esto puede darse porque hay una referencia real desde el *root
-set* (en cuyo caso queda bajo el control del usuario) pero también, dado que
-el *root set* se visita de forma conservativa, se puede deber a un falso
-positivo, en cuyo caso la omisión de la finalización queda por completo fuera
-del control del usuario (y lo que es aún peor, el usuario no puede ser
-siquiera notificado de esta anomalía).
+los objetos no son finalizados (es decir, no se llama a sus destructores) si
+aún alcanzables desde el *root set* cuando el programa termina. Cabe destacar
+que esto puede darse porque hay una referencia real desde el *root set* (en
+cuyo caso queda bajo el control del usuario) pero también, dado que el *root
+set* se visita de forma conservativa, se puede deber a un *falso positivo*, en
+cuyo caso la omisión de la finalización queda por completo fuera del control
+del usuario (y lo que es aún peor, el usuario no puede ser siquiera notificado
+de esta anomalía).
Si bien la especificación de D_ no requiere esta capacidad (de hecho,
rigurosamente hablando la especificación de D_ no garantiza la finalización de
-.. Esto sería muy similar a la sección de "Recolección de basura) pero en
- vez de ir describiendo los algoritmos iría comentando por qué los tomo
- o descarto
- ESTADO: INCOMPLETO
-
-
.. _dgc_via:
Análisis de viabilidad
:ref:`concurrente <gc_concurrent>` y parcialmente más :ref:`preciso
<gc_conserv>`. Estas dos mejoras solamente alcanzarían para mejorar de forma
notable el tiempo de pausa en las recolecciones y la cantidad de memoria
-retenida debido a falsos positivos.
+retenida debido a *falsos positivos*.
Más adelante veremos detalles sobre algunos de estos aspectos y sobre algunos
algoritmos particulares que permiten hacer concurrente al recolector actual.