X-Git-Url: https://git.llucax.com/z.facultad/75.00/informe.git/blobdiff_plain/b0956c037ae52da777b06705157486067755ec2c..e46398f1937371a1ac2b293c9425eb14bc1f1888:/source/dgc.rst?ds=sidebyside diff --git a/source/dgc.rst b/source/dgc.rst index bb0f3ba..15d1b72 100644 --- a/source/dgc.rst +++ b/source/dgc.rst @@ -7,7 +7,7 @@ ESTADO: SIN EMPEZAR, REVISAR LO HECHO -.. _ref_dgc: +.. _dgc: Recolección de basura en D ============================================================================ @@ -23,6 +23,8 @@ TODO +.. _dgc_actual: + Recolector de basura actual de D ---------------------------------------------------------------------------- @@ -57,87 +59,82 @@ TODO -Como se ha visto, D_ es un lenguaje de programación muy completo, -pero aún tiene algunos aspectos inconclusos. Su recolector de basura -está en un estado de evolución muy temprana. Se trata de un marcado y -barrido (*mark and sweep*) conservativo que, en ciertas circunstancias, -no se comporta como es debido, ya que revisa toda la memoria del programa -en busca de referencias a objetos en el *heap* (en vez de revisar sólo -las partes que almacenan punteros). Esto produce que, en ciertos casos, -por ejemplo al almacenar arreglos de número o *strings* en la pila, el -recolector de basura se encuentre con *falsos positivos*, pensando que -un área del *heap* está siendo utilizada cuando en realidad el puntero -que hacía referencia a ésta no era tal. Este efecto puede llevar a la -pérdida de memoria masiva, llegando al límite de que eventualmente +Como se ha visto, D_ es un lenguaje de programación muy completo, pero aún +tiene algunos aspectos inconclusos. Su recolector de basura está en un estado +de evolución muy temprana. Se trata de un marcado y barrido (*mark and sweep*) +conservativo que, en ciertas circunstancias, no se comporta como es debido, ya +que revisa toda la memoria del programa en busca de referencias a objetos en +el *heap* (en vez de revisar sólo las partes que almacenan punteros). Esto +produce que, en ciertos casos, por ejemplo al almacenar arreglos de número +o *strings* en la pila, el recolector de basura se encuentre con *falsos +positivos*, pensando que un área del *heap* está siendo utilizada cuando en +realidad el puntero que hacía referencia a ésta no era tal. Este efecto puede +llevar a la pérdida de memoria masiva, llegando al límite de que eventualmente el sistema operativo tenga que matar al programa por falta de memoria -[DNG46407]_. Aún cuando el programa no tenga estos problemas de por sí, -por usar datos que no pueden ser confundidos con direcciones de memoria, -este problema podría ser explotado por ataques de seguridad, inyectando -valores que sí sean punteros válidos y provocando el efecto antes -mencionado que deriva en la terminación abrupta del programa [DNG35364]_. -Finalmente, a estos problemas se suman los problemas de *performance* -[DNG43991]_. - -Es difícil que D_ pueda ser un lenguaje de programación exitoso si -no provee un recolector de basura eficiente y que realmente evite la -pérdida masiva de memoria. Por otro lado, D_ podría atraer a una base de -usuarios mucho más amplia, si la gama de estrategias de recolección es -más amplia, pudiendo lograr adaptarse a más casos de uso sin llegar al -límite de tener que caer en el manejo explícito de memoria y perder por -completo las ventajas de la recolección de basura (con la consecuencia -ya mencionada de que el manejo de memoria tenga que pasar a ser parte -de las interfaces y la complejidad que esto agrega al diseño -y uso- -de una biblioteca). +[DNG46407]_. Aún cuando el programa no tenga estos problemas de por sí, por +usar datos que no pueden ser confundidos con direcciones de memoria, este +problema podría ser explotado por ataques de seguridad, inyectando valores que +sí sean punteros válidos y provocando el efecto antes mencionado que deriva en +la terminación abrupta del programa [DNG35364]_. Finalmente, a estos problemas +se suman los problemas de *performance* [DNG43991]_. + +Es difícil que D_ pueda ser un lenguaje de programación exitoso si no provee un +recolector de basura eficiente y que realmente evite la pérdida masiva de +memoria. Por otro lado, D_ podría atraer a una base de usuarios mucho más +amplia, si la gama de estrategias de recolección es más amplia, pudiendo lograr +adaptarse a más casos de uso sin llegar al límite de tener que caer en el +manejo explícito de memoria y perder por completo las ventajas de la +recolección de basura (con la consecuencia ya mencionada de que el manejo de +memoria tenga que pasar a ser parte de las interfaces y la complejidad que esto +agrega al diseño -y uso- de una biblioteca). Soluciones Propuestas -Para poder implementar un recolector de basura no conservativo es -necesario disponer de un soporte de reflexión (en tiempo de compilación -[DNG44607]_ y de ejecución [DNG29291]_) bastante completo . De otra forma -es imposible distinguir si un área de memoria de la pila es utilizada -como un puntero o como un simple conjunto de datos. D_ provee algún -grado de reflexión, pero muy limitado como para poder obtener este -tipo de información. Ya hay un plan para agregar mayores capacidades -de reflexibilidad [DNG6842]_, y un pequeño avance en este sentido en la -`versión 1.001`_, pero con algunos problemas [DNG6890]_ [DNG6893]_. +Para poder implementar un recolector de basura no conservativo es necesario +disponer de un soporte de reflexión (en tiempo de compilación [DNG44607]_ y de +ejecución [DNG29291]_) bastante completo . De otra forma es imposible +distinguir si un área de memoria de la pila es utilizada como un puntero o como +un simple conjunto de datos. D_ provee algún grado de reflexión, pero muy +limitado como para poder obtener este tipo de información. Ya hay un plan para +agregar mayores capacidades de reflexibilidad [DNG6842]_, y un pequeño avance +en este sentido en la `versión 1.001`_, pero con algunos problemas [DNG6890]_ +[DNG6893]_. .. _`versión 1.001`: http://www.digitalmars.com/d/changelog.html#new1_001 -Se han propuesto otros métodos e implementaciones de recolector de basura, -por ejemplo colectores con movimiento (*moving collectors*) [DNG42557]_ -y conteo de referencias [DNG38689]_. Pero D_ es un lenguaje muy particular -en cuanto a la recolección de basura (al permitir :ref:d_low_level hay -muchas consideraciones a las que otros lenguajes no deben enfrentarse) y no -es sencillo pensar en otras implementaciones sin hacer modificaciones de -base al lenguaje. +Se han propuesto otros métodos e implementaciones de recolector de basura, por +ejemplo colectores con movimiento (*moving collectors*) [DNG42557]_ y conteo de +referencias [DNG38689]_. Pero D_ es un lenguaje muy particular en cuanto a la +recolección de basura (al permitir :ref:d_low_level hay muchas consideraciones +a las que otros lenguajes no deben enfrentarse) y no es sencillo pensar en +otras implementaciones sin hacer modificaciones de base al lenguaje. Problemas para Implementar Colectores con Movimiento -El principal problema es la capacidad de D_ de manipular punteros y -otras estructuras de bajo nivel, como uniones. O incluso la capacidad -de interactuar con C. Al mover un objeto de un área de memoria a otro, -es necesario actualizar todos los punteros que apuntan a éste. En D_ -esta tarea no es trivial [DNG42564]_ +El principal problema es la capacidad de D_ de manipular punteros y otras +estructuras de bajo nivel, como uniones. O incluso la capacidad de interactuar +con C. Al mover un objeto de un área de memoria a otro, es necesario actualizar +todos los punteros que apuntan a éste. En D_ esta tarea no es trivial +[DNG42564]_ Problemas para Implementar Conteo de Referencias -Este tipo de recolectores reparten la carga de la recolección de forma -uniforme a lo largo (y a la par) de la ejecución del programa. El -problema principal para implementar este tipo de recolección es -la necesidad de soporte en el compilador (cada asignación debe ser -acompañada por el incremento/decremento de contadores de referencia), a -menos que se implemente en una biblioteca. Por otro lado, características -como el rebanado de arreglos (ver :ref:d_high_level) son -difíciles de proveer con el conteo de referencias, entre otros problemas +Este tipo de recolectores reparten la carga de la recolección de forma uniforme +a lo largo (y a la par) de la ejecución del programa. El problema principal +para implementar este tipo de recolección es la necesidad de soporte en el +compilador (cada asignación debe ser acompañada por el incremento/decremento de +contadores de referencia), a menos que se implemente en una biblioteca. Por +otro lado, características como el rebanado de arreglos (ver :ref:d_high_level) +son difíciles de proveer con el conteo de referencias, entre otros problemas [DNG38704]_. .. include:: links.rst -.. vim: set ts=2 sts=2 sw=2 et tw=75 : +.. vim: set ts=3 sts=3 sw=3 et tw=78 :