X-Git-Url: https://git.llucax.com/z.facultad/75.00/informe.git/blobdiff_plain/e9bfb235dbea88c223f25282d095a10a3320291e..9d97e3ff2b7234037d4e78de0cb126a5ede881ed:/source/gc.rst?ds=inline diff --git a/source/gc.rst b/source/gc.rst index 86463bf..0b91155 100644 --- a/source/gc.rst +++ b/source/gc.rst @@ -1721,21 +1721,22 @@ eficiente de alocar memoria (tan eficiente como alocar memoria en el *stack*). /| /| BB "Tospace" -La segunda mitad (*Tospace*) permanece ociosa hasta que se agota el espacio en -el *Fromspace*; en ese momento comienza el proceso de recolección de basura -que consiste en recorrer el grafo de conectividad, copiando las celdas *vivas* -del *Fromspace* al *Tospace* de manera contigua, como si estuvieran alocando -por primera vez. Como la posición en memoria de las celdas cambia al ser -movidas, es necesario actualizar la dirección de memoria de todas las celdas -*vivas*. Para esto se almacena una dirección de memoria de redirección, -*forwarding address*, en las celdas que mueven. La *forwarding address* sirve -a su vez de marca, para no recorrer una celda dos veces (como se explica en -:ref:`ref_gc_intro_mark`). Cuando se encuentra una celda que ya fue movida, -simplemente se actualiza la referencia por la cual se llegó a esa celda para -que apunte a la nueva dirección, almacenada en la *forwarding address*. Una -vez finalizado este proceso, el *Fromspace* y *Tospace* invierten roles y se -prosigue de la misma manera (todo lo que quedó en el viejo *Fromspace* es -*basura* por definición, por lo que se convierte el *Tospace*). +La segunda mitad (*Tospace*) permanece inutilizada hasta que se agota el +espacio en el *Fromspace*; en ese momento comienza el proceso de recolección +de basura que consiste en recorrer el grafo de conectividad, copiando las +celdas *vivas* del *Fromspace* al *Tospace* de manera contigua, como si +estuvieran alocando por primera vez. Como la posición en memoria de las celdas +cambia al ser movidas, es necesario actualizar la dirección de memoria de +todas las celdas *vivas*. Para esto se almacena una dirección de memoria de +redirección, *forwarding address*, en las celdas que mueven. La *forwarding +address* sirve a su vez de marca, para no recorrer una celda dos veces (como +se explica en :ref:`ref_gc_intro_mark`). Cuando se encuentra una celda que ya +fue movida, simplemente se actualiza la referencia por la cual se llegó a esa +celda para que apunte a la nueva dirección, almacenada en la *forwarding +address*. Una vez finalizado este proceso, el *Fromspace* y *Tospace* +invierten roles y se prosigue de la misma manera (todo lo que quedó en el +viejo *Fromspace* es *basura* por definición, por lo que se convierte el +*Tospace*). A continuación se presenta una implementación sencilla de los servicios provistos por este tipo de recolectores. Cabe destacar que este tipo de