610 likes | 768 Views
Garbage Collection. Rafael Dueire Lins Departamento de Informática Universidade Federal de Pernambuco. 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.
E N D
Garbage Collection Rafael Dueire Lins Departamento de Informática Universidade Federal de Pernambuco
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-de-compilação.
Programa Principal Subrotina A Subrotina B Subrotina C Alocação Estática:Organização da Memória
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
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
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
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
Alocação Estática:Chamada a Procedimentos ... z = 6 w = 4 ... Programa Principal DSucc DSucc(2) temp1 = 4 return temp1 Subrotina B Subrotina C
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.
Alocação em Pilha fac 2 é re-escrito como fac 2 => 2 * fac ( 2 - 1) => 2 * fac 1 => 2 * (1 * fac ( 1 - 1)) => 2 * (1 * fac 0) => 2 * (1 * 1) => 2 * 1 => 2
Subrotina A Subrotina A Subrotina A Alocação em Pilha:Organização da Memória Pilha de Registros de Ativação Programa Principal Subrotina B Memória de Trabalho Subrotina C
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.
Subrotina A Subrotina A Garbage Collection:Organização da Memória Pilha de Registros de Ativação Programa Principal Subrotina B Subrotina C raiz 2 raiz 1 Memória de Trabalho Heap Lixo
Garbage Collection:Mark-Scan (J.McCarthy 1960) Free-list 1.Todas as célulasestão na free-list Heap
Garbage Collection:Mark-Scan (J.McCarthy 1960) 1.Todas as célulasestão na free-list. 2.O processo do usuário usa células Raiz Free-list Heap
Garbage Collection:Mark-Scan (J.McCarthy 1960) 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. Raiz Free-list Heap
Garbage Collection:Mark-Scan (J.McCarthy 1960) 3.A reescrita do grafo gera lixo. 4.A free-list fica vazia. Raiz Heap Free-list
Garbage Collection:Mark-Scan (J.McCarthy 1960) 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. Raiz Heap Free-list
Garbage Collection:Mark-Scan (J.McCarthy 1960) 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 Raiz Free-list 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.
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.
1 2 1 1 1 1 1 Reference Counting (Collins 1960) • NEW: tira uma célula da free-list e conecta-a ao grafo. Free-list B Root C A New(A.esq)
1 2 1 1 1 1 1 Reference Counting (Collins 1960) • NEW: tira uma célula da free-list e conecta-a ao grafo. B Root C A Free-list New(A.esq)
1 1 1 1 1 1 2 Reference Counting (Collins 1960) • COPY: copia um ponteiro. Root Copy(C.dir, A->B) C A Free-list B
1 2 1 1 1 1 2 Reference Counting (Collins 1960) • COPY: copia um ponteiro. Root Copy(C.dir, A->B) C A Free-list B
1 1 2 1 1 1 2 Reference Counting (Collins 1960) • DELETE: retira um ponteiro. Root C Delete(A->B) A Free-list B
1 1 2 1 1 1 2 Reference Counting (Collins 1960) • DELETE: retira um ponteiro. Root C Delete(A->B); Delete(Sons_B) A Free-list B
1 1 1 1 1 1 2 Reference Counting (Collins 1960) • DELETE: retira um ponteiro. Root Delete(A->B); Delete(Sons_B); Free(B). C Free-list A B
2 1 Cyclic Reference Counting McBeth 1963 • Deleção de ponteiro a cíclo: Root A Delete(Root->A) B
1 1 Cyclic Reference Counting McBeth 1963 • Space-leak. Root A Delete(Root->A) B
2 2 2 Cyclic Reference Counting Brownbridge 1985 • Algoritmo errado!!!! Root A B C
2 2 2 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Algoritmo geral!! Root A B C Delete(Root->A)
1 2 2 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Age em RF > 1 (sharing) Root A B C Delete(Root->A) Mark_red(A)
0 0 1 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Mark-Scan local Root A B C Delete(Root->A) Mark_red(A) Scan_green(A)
0 0 1 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Busca referências externas. Root A B C Delete(Root->A) Mark_red(A) Scan_green(A)
0 0 1 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Encontrada referência externa. Root A B C Delete(Root->A) Mark_red(A) Scan_green(A)
0 0 1 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Sub-grafo em uso. Root A B C Delete(Root->A) Mark_red(A) Scan_green(C)
0 1 2 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Referências atualizadas. Root A B C Delete(Root->A) Mark_red(A) Scan_green(C)
1 2 2 Cyclic Reference Counting Martinez-Wachenchauzer-Lins • Busca de lixo reciclável! Root A B C Delete(Root->A) Mark_red(A) Scan_green(A) Collect_blue(A) Publicado em: Information Processing Letters 1990
2 2 2 Lazy Cyclic Reference Counting Lins • Mark-Scan postergado. Root A B C Delete(Root->A)
1 2 2 Lazy Cyclic Reference Counting Lins • Mark-Scan postergado. Root Pilha A B C Delete(Root->A) Publicado em: Information Processing Letters 1992
1 2 2 Lazy Cyclic Reference Counting Lins • Mark-Scan só é chamado se necessário!! Root Pilha A B C Delete(Root->A)
Garbage Collection:Cópia (Fenichel-Yochelson 1969) • A Heap é dividida em dois semi-espaç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.
heap_1 heap_2 Garbage Collection:Cópia (Fenichel-Yochelson 1969) raiz hp
heap_1 heap_2 Garbage Collection:Cópia (Fenichel-Yochelson 1969) raiz hp
heap_1 heap_2 Garbage Collection:Cópia (Fenichel-Yochelson 1969) raiz hp
heap_1 heap_2 Garbage Collection:Cópia (Fenichel-Yochelson 1969) raiz hp
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.
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.
Garbage Collection:Cópia (Cheney 1970) • 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.