X-Git-Url: https://git.llucax.com/z.facultad/75.00/informe.git/blobdiff_plain/b8053b99e21ece3bf1972cb75c3b1e2410e11838..7024d6c53ac7bf2f10720fa6693c1d24329bdac1:/source/gc.rst diff --git a/source/gc.rst b/source/gc.rst index 4f9f91a..96da51b 100644 --- a/source/gc.rst +++ b/source/gc.rst @@ -10,6 +10,8 @@ Recolección de basura ============================================================================ +.. _ref_gc_intro: + Introducción ---------------------------------------------------------------------------- @@ -183,6 +185,7 @@ normalmente se lo llama *mutator* (mutador). +.. _ref_gc_intro_mark: Recorrido del grafo de conectividad ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -328,14 +331,14 @@ Un algoritmo simple (recursivo) de marcado *primero a lo alto* puede ser el siguiente (asumiendo que partimos con todos los vértices sin marcar) [#gcpseudo]_:: - mark(v) + function mark(v) is if not v.marked v.marked = true for (src, dst) in v.edges mark(dst) - mark_phase() - for r in root_set + function mark_phase() is + foreach r in root_set mark(r) .. [#gcpseudo] Para presentar los algoritmos se utiliza una forma simple de @@ -583,7 +586,7 @@ dejando sin marcar solamente las celdas *basura* (en blanco). -.. _ref_gc_tricolor: +.. _ref_gc_intro_tricolor: Abstracción tricolor ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -612,8 +615,8 @@ que todas las celdas parten pintadas de blanco, es decir, el conjunto blanco contiene todas las celdas de memoria y los conjuntos negro y gris están vacíos):: - mark_phase() - for r in root_set + function mark_phase() is + foreach r in root_set gray_set.add(r) while not gray_set.empty() v = gray_set.pop() @@ -628,7 +631,7 @@ por sí ya presenta una ventaja sobre el marcado *bicolor*. -.. _ref_gc_services: +.. _ref_gc_intro_services: Servicios ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -713,7 +716,7 @@ usuario también. -.. _ref_gc_clasic: +.. _ref_gc_classic: Algoritmos clásicos ---------------------------------------------------------------------------- @@ -783,21 +786,21 @@ teóricamente la complejidad de eliminar una referencia puede ser Las primitivas implementadas para este tipo de recolector son las siguientes (acompañadas de una implementación básica):: - new() + function new() is cell = alloc() if cell is null throw out_of_memory cell.rc = 1 return cell - del(cell) + function del(cell) is cell.rc = cell.rc - 1 if cell.rc is 0 - for child* in cell.children + foreach child* in cell.children del(*child) free(cell) - update(ref*, cell) + function update(ref*, cell) is cell.rc = cell.rc + 1 del(*ref) *ref = cell @@ -1601,6 +1604,7 @@ figura :vref:`fig:gc-rc-cycle`). +.. _ref_gc_mark_sweep: Marcado y barrido ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~