Garbage Collection
Rafael Dueire Lins
Departamento de Informática
Universidade Federal de Pernambuco
1
Gerenciamento Estático
Mais simples.
 Utilizado na versão original de
FORTRAN.
 A cada vez que um procedimento é
chamado utilizam-se as mesmas posições
de memória.
 Alocação decidida em tempo-decompilação.

2
Alocação Estática:
Organização da Memória
Programa Principal
Subrotina A
Subrotina B
Subrotina C
3
Alocação Estática:
Chamada a Procedimentos
...
z = DSucc (3)
w = DSucc (2)
...
Programa Principal
DSucc
DSucc(n)
temp1 = n + n
return temp1
Subrotina B
Subrotina C
4
Alocação Estática:
Chamada a Procedimentos
...
z = DSucc(3)
w = DSucc(2)
...
Programa Principal
DSucc
DSucc(3)
temp1 = 6
return temp1
Subrotina B
Subrotina C
5
Alocação Estática:
Chamada a Procedimentos
...
z = 6
w = DSucc(2)
...
Programa Principal
DSucc
DSucc(3)
temp1 = 6
return temp1
Subrotina B
Subrotina C
6
Alocação Estática:
Chamada a Procedimentos
...
z = 6
w = DSucc(2)
...
Programa Principal
DSucc
DSucc(2)
temp1 = 4
return temp1
Subrotina B
Subrotina C
7
Alocação Estática:
Chamada a Procedimentos
...
z = 6
w= 4
...
Programa Principal
DSucc
DSucc(2)
temp1 = 4
return temp1
Subrotina B
Subrotina C
8
Alocação em Pilha
Surgiu com Algol
 Possibilidade de procedimentos
recursivos.
fac n = n * fac ( n - 1 ) , n > 0
=1
, otherwise
 Se ProcA chama ProcB, ProcA nunca
termina antes do ProcB.
 Gerenciamento simples.

9
Alocação em Pilha
fac 2 é re-escrito como
10
fac 2 => 2 * fac ( 2 - 1)
=> 2 * fac 1
=> 2 * (1 * fac ( 1 - 1))
=> 2 * (1 * fac 0)
=> 2 * (1 * 1)
=> 2 * 1
=> 2
Alocação em Pilha:
Organização da Memória
Programa Principal
Subrotina A
Subrotina B
Subrotina A
11
Memória
de
Trabalho
Subrotina A
Subrotina C
Pilha de Registros
de Ativação
Garbage Collection:
Alocação Dinâmica de Memória
Listas: quebra da disciplina de pilha.
 Uma rotina chamada pode gerar uma
estrutura de dados que viva após o
término da sua chamada.
 IPL-5 foi a primeira linguagem a ter
listas como tipo primitivos. A falta de
um GC foi a causa do seu insucesso.
 LISP (J.McCarthy - 1960) foi a
primeira linguagem a ter GC.

12
Garbage Collection:
Organização da Memória
Programa Principal
Pilha de Registros
de Ativação
Subrotina A
Subrotina B
Subrotina C
Subrotina A
Memória
de
Trabalho
13
Lixo
raiz 1
raiz 2
Heap
Garbage Collection:
Mark-Scan (J.McCarthy 1960)
Free-list
14
1.Todas as
célulasestão
na free-list
Heap
Garbage Collection:
Mark-Scan (J.McCarthy 1960)
Raiz
15
Free-list
1.Todas as
célulasestão
na free-list.
2.O processo
do usuário
usa células
Heap
Garbage Collection:
Mark-Scan (J.McCarthy 1960)
Raiz
1.Todas as
célulasestão
na free-list.
2.O processo
do usuário
usa células.
3.A reescrita
do grafo
gera lixo.
Free-list
16
Heap
Garbage Collection:
Mark-Scan (J.McCarthy 1960)
Raiz
17
Heap
3.A reescrita
do grafo
gera lixo.
4.A free-list
fica vazia.
Free-list
Garbage Collection:
Mark-Scan (J.McCarthy 1960)
Raiz
18
Heap
3.A reescrita
do grafo
gera lixo.
4.A free-list
fica vazia.
5.Suspenso o
processo do
usuário.
6.Fá-se a
marcação.
Free-list
Garbage Collection:
Mark-Scan (J.McCarthy 1960)
Raiz
Free-list
19
6.Fá-se a
marcação.
7.Fá-se a
varredura,
retornando
as células
de lixo a
free-list.
8.Retoma-se o
processo do
usúario
Heap
Garbage Collection:
Mark-Scan (J.McCarthy 1960)
Tempo de suspensão do processo do
usuário:
Grafo_em_uso + Tamanho_da_Heap
 Imprevisibilidade do tempo de
suspensão.
 Necessita de 1-bit para a marcação.

20
Reference Counting (Collins 1960)
Desenvolvido para LISP.
 Evita a suspensão do processo de
usuário.
 Efetuado em pequenos passos
intercalados com as transformações
ao grafo.
 Exige a inclusão de um contador por
célula.

21
Reference Counting (Collins 1960)

NEW: tira uma célula da free-list e
conecta-a ao grafo.
Free-list
B
1
Root
C
1
1
1
2
22
A
New(A.esq)
1
1
Reference Counting (Collins 1960)

NEW: tira uma célula da free-list e
conecta-a ao grafo.
B
1
Root
C
1
1
1
2
23
A
New(A.esq)
Free-list
1
1
Reference Counting (Collins 1960)

COPY: copia um ponteiro.
Root
C
1
Copy(C.dir, A->B)
2
A
1
1
1
1
24
B
Free-list
1
Reference Counting (Collins 1960)

COPY: copia um ponteiro.
Root
C
1
Copy(C.dir, A->B)
2
A
1
2
1
1
25
B
Free-list
1
Reference Counting (Collins 1960)

DELETE: retira um ponteiro.
Root
C
1
Delete(A->B)
2
A
1
1
1
2
26
B
Free-list
1
Reference Counting (Collins 1960)

DELETE: retira um ponteiro.
Root
C
1
Delete(A->B);
Delete(Sons_B)
2
A
1
1
1
2
27
B
Free-list
1
Reference Counting (Collins 1960)

DELETE: retira um ponteiro.
Root
C
1
2
A
1
1
Free-list
B
1
1
28
Delete(A->B);
Delete(Sons_B);
Free(B).
1
Cyclic Reference Counting
McBeth 1963

Deleção de ponteiro a cíclo:
Root
A
2
Delete(Root->A)
1
29
B
Cyclic Reference Counting
McBeth 1963

Space-leak.
Root
A
1
Delete(Root->A)
1
30
B
Cyclic Reference Counting
Brownbridge 1985

Algoritmo errado!!!!
Root
2
2
A
31
2
B
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Algoritmo geral!!
Root
2
2
A
32
2
B
Delete(Root->A)
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Age em RF > 1 (sharing)
Root
1
2
A
33
2
B
Delete(Root->A)
Mark_red(A)
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Mark-Scan local
Root
0
0
A
34
1
B
Delete(Root->A)
Mark_red(A)
Scan_green(A)
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Busca referências externas.
Root
0
0
A
35
1
B
Delete(Root->A)
Mark_red(A)
Scan_green(A)
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Encontrada referência externa.
Root
0
0
A
36
1
B
Delete(Root->A)
Mark_red(A)
Scan_green(A)
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Sub-grafo em uso.
Root
0
0
A
37
1
B
Delete(Root->A)
Mark_red(A)
Scan_green(C)
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Referências atualizadas.
Root
0
1
A
38
2
B
Delete(Root->A)
Mark_red(A)
Scan_green(C)
C
Cyclic Reference Counting
Martinez-Wachenchauzer-Lins

Busca de lixo reciclável!
Root
1
2
A
39
2
B
Publicado em:
Information Processing Letters 1990
C
Delete(Root->A)
Mark_red(A)
Scan_green(A)
Collect_blue(A)
Lazy Cyclic Reference Counting
Lins

Mark-Scan postergado.
Root
2
2
A
2
B
C
Delete(Root->A)
40
Lazy Cyclic Reference Counting
Lins

Mark-Scan postergado.
Root
Pilha
1
2
A
2
B
C
Delete(Root->A)
41
Publicado em:
Information Processing Letters 1992
Lazy Cyclic Reference Counting
Lins

Mark-Scan só é chamado se
necessário!!
Root
Pilha
1
2
A
2
B
C
Delete(Root->A)
42
Garbage Collection:
Cópia (Fenichel-Yochelson 1969)
A Heap é dividida em dois semiespaços de igual tamanho.
 Quando o semi-espaço em uso fica
esgotado cópia-se o grafo-em-uso
para o outro semi-espaço deixando o
lixo para trás.

43
Garbage Collection:
Cópia (Fenichel-Yochelson 1969)
heap_1
raiz
44 hp
heap_2
Garbage Collection:
Cópia (Fenichel-Yochelson 1969)
raiz
heap_1
45
hp
heap_2
Garbage Collection:
Cópia (Fenichel-Yochelson 1969)
raiz
heap_1
heap_2
hp
46
Garbage Collection:
Cópia (Fenichel-Yochelson 1969)
raiz
heap_1
heap_2
hp
47
Garbage Collection:
Cópia (Fenichel-Yochelson 1969)
A cópia é recursiva.
 Há suspensão do processo de
usuário.
 Eficiente em máquinas com memória
virtual.
 Não necessita de espaço extra na
célula para marcação.

48
Garbage Collection:
Cópia (Fenichel-Yochelson 1969)
Complexidade computacional
proporcional ao grafo-em-uso.
 Degrada com a ocupância.
 Compacta os dados sem custo extra.
 Adequado para células de tamanho
variável.

49
Garbage Collection:
Cópia (Cheney 1970)
50

Algoritmo mais amplamente usado.

Não utiliza recursividade ou qualquer
outra estrutura de dados extra para
“lembrar” o caminho da cópia.

Utiliza dois apontadores.
Garbage Collection:
Cópia (Cheney 1970)
raiz
heap_1
cp
51
hp
heap_2
Garbage Collection:
Cópia (Cheney 1970)
raiz
heap_1
cp
52
hp
heap_2
Garbage Collection:
Cópia (Cheney 1970)
raiz
heap_1
cp
53
hp
heap_2
Garbage Collection:
Cópia
O algoritmo de Fenichel-Yochelson
faz uma varredura no grafo em
profundidade (depth-first).
 O algoritmo de Cheney varre o grafo
breadth-first.
 Experimentalmente encontra-se que
a varredura depth-first traz maior
localidade entre as células.
 Há versões de Cheney depth-first.

54
Garbage Collection:
Cópia Generacional.
55

Otimiza o algoritmo de cópia.

Células novas morrem cedo.

Células velhas vivem muito.

Segrega as células por idade:
várias heaps utilizadas.

Evidência experimental.
Garbage Collection:
Cópia Generacional.
Raiz
Heap 0
Celulas
Velhas
Heap 1
56
Celulas
Novas
Heap 2
Garbage Collection:
Cópia Generacional.

Minor Garbage Collection:
– Heaps mais novas.
– Mais freqüênte.

Major Garbage Collection:
– Equivalente ao algoritmo original de cópia.
– Heap mais velha.

57
Problema do algoritmo:
ponteiros intergeneracionais sobretudo
célula_mais_nova -> célula_mais_velha
Parallel Garbage Collection:
Cópia - Appel-Ellis-Li (1988)
Baseado em Baker.
 Usa informação do Sistema
Operacional para bloquear páginas de
memória.
 Faltando espaço:
 Suspende todos os threads do
mutador.
 O coletor varre os objetos ainda não
varridos.

58
Parallel Garbage Collection:
Cópia - Appel-Ellis-Li (1988)
Faltando espaço:
 Troca os semi-espaços.
 Copia os objetos acessíveis para
to-space.
 Proteje as páginas ainda não
copiadas.
 Re-inicia os threads de mutadores.
 Algoritmo eficiente.

59
60
61
Download

Garbage Collection