Está en la página 1de 10

Monografia de Seminários em Sistemas Distribuídos

Uma Análise da Evolução da Coleta de Lixo Distribuída


Alexandra Barros1
1
Departamento de Informática – PUC-Rio
abarros@inf.puc-rio.br

Resumo. Este trabalho revisa os principais conceitos de coleta de lixo local e


distribuída e descreve os principais algoritmos de cada área. É apresentada
uma análise das semelhanças entre os algoritmos inicias de coleta de lixo
distribuída. Em seguida, algoritmos mais atuais são descritos para que se
possa observar a mudança de foco da área, o que tornou os algoritmos bem
mais específicos.

1. Introdução
Muitas linguagens de programação provêem coleta de lixo a fim de desalocar
automaticamente objetos incessíveis. Os coletores de lixo livram o programador da
responsabilidade de desalocar a memória, simplificando assim a implementação de
algoritmos complexos e eliminando os erros por falta de memória que são difíceis de
detectar e reparar. Quando estamos lidando com apenas um processo, o gerenciamento
do heap dinâmico já é bastante suscetível a erros. A questão fica impraticável com o
aumento da complexidade do sistema, como no caso de um heap compartilhado por
várias aplicações escritas por programadores diferentes, acessado em paralelo e com
acesso distribuído.
Com sua importância já bem fundamentada no gerenciamento local de memória, é
natural se beneficiar dos coletores de lixo também em ambientes distribuídos. As
motivações para tal serviço são inúmeras. Sistemas distribuídos modernos provêem
alocação e invocação uniforme e transparente de objetos locais e remotos. Da mesma
forma, tais sistemas também devem prover transparência no gerenciamento de objetos,
o que é alcançado através de um coletor de lixo distribuído. Além disso, o
gerenciamento de memória é uma tarefa extremamente complexa e não deve ser uma
responsabilidade do programador.
Esta monografia está organizada como a seguir. A sessão 2 descreve os fundamentos
básicos relacionados à coleta de lixo local e distribuída, assim como as técnicas mais
conhecidos. A sessão 3 caracteriza os algoritmos de coleta de lixo distribuída iniciais,
mostrando suas diferenças e seus elementos em comum e também quais eram suas
principais preocupações. A seguir, é feita uma análise de alguns algoritmos mais atuais
de coleta de lixo distribuída, mostrando em as mudanças no foco principal e como o
objetivo se tornou muito mais específico. Por fim, são apresentadas as conclusões deste
trabalho.
2. Fundamentos
Coleta de lixo [Jones, 1996] é uma forma automática de realizar gerenciamento de
memória. Com este recurso, é possível recuperar zonas de memória que o programa não
utiliza mais. Enquanto, em muitos sistemas, os programadores devem gerenciar
explicitamente a memória, utilizando, por exemplo, as declarações “free” ou “dispose”,
sistemas com coletores de lixo livram o programador desse fardo. A função do coletor
de lixo é achar objetos de dados que não são mais usados e tornar seu espaço de
armazenamento disponível para reuso pelo programa em execução. Um objeto é
considerado lixo caso não existam referências para ele. Neste caso, o coletor de lixo irá
marcar para desalocação a área de memória onde reside tal objeto. Objetos vivos
(potencialmente alcançáveis) são preservados pelo coletor, assegurando que o programa
nunca terá uma referência para um objeto desalocado.
A coleta de lixo automática elimina a grande quantidade de erros que podem ser
introduzidos pelo programador quando este deve gerenciar explicitamente a memória.
Além disso, permite uma programação mais modular, já que um módulo não precisa
saber se um objeto está sendo referenciado por outros módulos para que possa coletá-lo,
ou não, explicitamente. Não desalocar a memória no momento correto pode acarretar
erros como memory leak (vazamento de memória), onde objetos não mais referenciados
pelo programa em execução foram sendo acumulados na memória até que não houvesse
mais espaço de armazenamento. Devido ao custo extra do gerenciamento manual de
memória, sistema sem coleta de lixo automática são mais difíceis de desenvolver e de
manter.
Por estes motivos, linguagens que possuem coleta de lixo automática há muito tempo
vêm sendo usadas para a implementação de algoritmos sofisticados que utilizam
estruturas de dados complexas. O funcionamento básico de um coletor de lixo consiste
de duas fases:
1. Distinguir de alguma forma o lixo dos objetos vivos (detecção de lixo);
2. Desalocar a memória ocupada pelos objetos considerados lixo para que o
programa possa reusá-la (desalocação de memória).
Na prática, essas duas fases podem ser temporariamente e funcionalmente intercaladas.
Além disso, a fase de desalocação de memória depende fortemente a técnica de
detecção de lixo. As duas sessões 2.1 e 2.2 a seguir descrevem os principais algoritmos
de coleta de lixo local e distribuída respectivamente.

2.1 Coleta de Lixo Local


A coleta de lixo local lida apenas com um único processador. Os algoritmos básicos
incluem contagem de referências, mark-sweep, mark-compact e o de coleta implícita
copying [Wilson, 1992]. Existem várias formas de realizar as operações básicas de um
coletor de lixo citadas acima. Em especial, a detecção de lixo pode ser feita de duas
formas: por contagem de referências (primeiro algoritmo citado acima) ou por
rastreamento, também conhecido como tracing (demais algoritmos).
2.1.1 Contagem de Referências
Em sistemas que utilizam o algoritmo de contagem de referências, cada objeto possui
associado a si um contador de referências (ou ponteiros). Cada vez que uma referência
para um objeto é criada, o contador desse objeto é incrementado. Quando uma
referência existente é eliminada, o contador é decrementado. A memória ocupada por
um objeto pode ser reusada quando seu contador for igual a zero, já que isso indica que
não existem referências para esse objeto e o programa não pode mais acessa-lo. A coleta
de um objeto pode levar a transitivos decrementos em contadores de outros objetos e,
consequentemente, a novas remoções, pois referências vindas de um objeto
considerado lixo não devem ser contadas como referências. O algoritmo de contagem de
referências possui uma natureza incremental, podendo ser usado em sistemas de tempo
real. Porém, esse algoritmo possui um grande problema: ele não é capaz de detectar
ciclos. Se os ponteiros de um grupo de objeto criam um clico direcionado, seus
contadores nunca serão reduzidos a zero, mesmo que não exista um caminho do
programa para os objetos.

2.1.2 Mark-sweep e mark-compact


O algoritmo mark-sweep tem seu nome originado das duas fases de um coletor de lixo
descritas anteriormente. A primeira delas, detecção de lixo, é feita por rastreamento.
Partindo do que é chamado conjunto raiz (variáveis globais alocadas estaticamente,
variáveis em registradores, etc.), o grafo das relações entre os objetos (onde as arestas
são as referências) é rastreado, normalmente usando busca em largura ou busca em
profundidade. Os objetos alcançados são marcados, seja alterando alguns bits nos
próprios objetos ou gravando os mesmos em uma tabela especial. Uma vez que os
objetos vivos se tornaram distinguíveis, inicia-se a segunda fase, desalocação de
memória. Nessa fase, a memória é varrida, ou melhor, exaustivamente examinada, a fim
de achar todos os objetos não marcados e liberar o espaço que ocupam para reuso.
Com mark-sweep, o problema dos ciclos que existia no algoritmo de contagem de
referências é eliminado. Porém, alguns problemas ainda persistem. Para ser realizada a
coleta, o programa para sua execução de tempos em tempos e inicia a fase de detecção
de lixo. Somente quando a segunda fase estiver completa o programa volta a sua
execução normal. Isso diminui a eficiência e impossibilita o uso em sistemas de tempo
real. Outro problema é a fragmentação de memória, que dificulta o tratamento de
grandes objetos, e a localidade de referências, já que objetos de diferentes idades ficarão
intercalados na memória. Para resolver a fragmentação da memória foi criado o
algoritmo mark-compact, que, após a segunda fase, percorre novamente a memória
movendo os objetos vivos até que eles ocupem um espaço contínuo de memória.

2.1.3 Copying
O algoritmo copying não coleta o lixo propriamente, ao invés disso, ele move todos os
objetos vivos para uma área e notifica o sistema que o resto to heap está disponível para
reuso, pois contém apenas lixo. Enquanto o algoritmo mark-compact usa uma terceira
fase para mover os objetos, o algoritmo copying integra o rastreamento dos dados com o
processo de cópia. À medida que vão sendo visitados pelo rastreamento, os objetos são
movidos para uma área adjacente da memória. Assim é possível eliminar o problema da
fragmentação de memória de forma mais eficiente.
2.1.4 Outras técnicas
Além dos algoritmos básicos, ainda existem as técnicas incrementais e generacionais.
As técnicas incrementais permitem que a coleta de lixo seja realizada a curtos passos,
intercalada com a execução da aplicação. Essas técnicas podem reduzir o impacto da
inicialização da coleta de lixo, já que o programa não precisa parar e esperar que a
coleta termine. Isso possibilita o uso de coletores de lixo em sistemas de tempo real. As
técnicas incrementais também podem ser generalizadas a fim de realizar coletas
concorrentes que são executadas em outro processador e em paralelo com a execução do
programa.
As técnicas generacionais aumentam a eficiência e a localidade realizando a coleta de
lixo em uma área menor e mais frequentemente. Essas técnicas exploram o tempo de
vida dos objetos para evitar o trabalho extra ocorrido no tratamento de objetos com um
longo tempo de vida. Como a maioria das coletas são realizadas em pequenas áreas, os
momentos em que o programa pausa para a coleta são curtos. Para muitas aplicações, as
técnicas generacionais são uma razoável alternativa às técnicas incrementais.

2.1 Coleta de Lixo Distribuída


Coletores de lixo distribuídos são muitas vezes mais complexos que coletores de lixo
locais. Ao migrar para um ambiente distribuído, muitos aspectos, como troca de
mensagens e disponibilidade da rede, devem ser levados em consideração. Esta sessão
apenas descreve alguns dos algoritmos iniciais de coleta de lixo distribuída. As
principais dificuldades e limitações encontradas são discutidas na sessão 3. O trabalho
de Plainfossé e Shapiro [Plainfossé, 1995] contém uma análise mais detalhada dos
algoritmos a seguir e de outros algoritmos de coleta de lixo distribuída. Abaixo segue
uma parte da taxonomia usada por esse trabalho e que também será usada aqui:
• O sistema distribuído está particionado em espaços disjuntos que interagem
entre si através de troca de mensagens, usando canais de comunicação não
confiáveis;
• Chamamos de referência remota uma referência para um objeto localizado em
outro espaço;
• Por sua vez, uma referência local é uma referência para um objeto localizado no
mesmo espaço;
• A criação de uma referência ocorre quando um espaço A envia um espaço B
uma referência para um objeto localizado em A;
• Quando um espaço B, cliente de um objeto público remoto localizado em outro
espaço (por exemplo, A), envia para um espaço C uma referência para este
objeto, dizemos ocorreu uma duplicação de referêcia. Note que o espaço A não
toma conhecimento de tal operação;
• A remoção de referência se dá quando, localmente, um espaço remove uma
referência que possui para um objeto remoto. A remoção de referência pode
levar a criação de lixo.
2.1.1 Contagem de Referências Distribuídas
A forma mais simples de contagem de referências distribuídas é uma simples extensão
da contagem de referências locais. Num sistema fracamente acoplado, a criação de uma
nova referência para um objeto requer que uma mensagem seja enviada para esse objeto
a fim de que seu contador de referências seja incrementado. Da mesma forma, caso uma
referência remota seja removida, uma mensagem deve ser enviada informando ao objeto
que seu contador deve ser decrementado. Deve-se ter um cuidado especial para prevenir
que um objeto seja coletado enquanto ainda existe uma referência remota para ele. Isso
pode acontecer quando as mensagens são recebidas numa ordem diferente da esperada.
Por exemplo, se uma mensagem informando a remoção da última referência para um
objeto chega antes de uma mensagem informando a duplicação da referência. Uma
solução para esse problema pode ser encontrada no trabalho de Lerman e Maurer
[Lermen, 1986]. Seu protocolo de comunicação requer que as mensagens entre pares de
objetos sejam entregues na ordem em que foram enviadas. As mensagens devem ser
confirmadas e um objeto só pode ser coletado se um número igual de mensagens de
duplicação, remoção e confirmação foi recebido por esse objeto. Esse protocolo fornece
um esquema de contagem de referências distribuídas ao custo de três mensagens por
referência entre espaços.

2.1.2 Mark-sweep Distribuído


Uma abordagem padrão dos algoritmos de mark-sweep distribuído é combinar as
coletas locais e independentes com um coletor de lixo global. O principal problema é
sincronizar a fase global de detecção de lixo com as fases locais de desalocação de
memória. Durante a fase de detecção de lixo, os coletores locais enviam e recebem
mensagens indicando que determinados objetos devem ser marcados. O coletor local
retoma sua execução sempre que recebe uma mensagem indicando a marcação de um
objeto local, e pára sua execução quando envia uma mensagem solicitando a marcação
de um objeto remoto. Sendo assim, os espaços estão cooperando alternadamente para a
detecção de lixo global. A fase de detecção de lixo está completa quando todos os
objetos públicos alcançáveis foram marcados e não existem mais mensagens de
marcação ou confirmação em trânsito. Em seguida, os coletores locais iniciam
individualmente a fase de desalocação de memória a fim de se desfazer dos objetos
públicos e locais que não serão mais utilizados.
O algoritmo para coleta de lixo distribuída descrito por [Hughes, 1985] substitui os bits
referentes à marcação de um objeto por timestamps. O algoritmo assume a existência de
um relógio global e que a comunicação é feita de modo instantâneo, evitando problemas
com mensagens em trânsito. Um coletor de lixo global marca os objetos com o tempo
em que eles foram iniciados. Um objeto é considerado como não marcado quando o
tempo atribuído ao mesmo é menor do que o tempo global atual. Objetos criados após o
início da coleta de lixo são automaticamente considerados marcados. Os coletores de
lixo locais propagam os tempos dos objetos do conjunto raiz para suas folhas,
executando parte da fase de detecção de lixo. Ao final da coleta de lixo local,
mensagens de atualização são enviadas aos objetos remotos alcançáveis para que estes
aumentem suas marcas de tempo. A detecção do término da fase de marcação pode ser
feita através de uma adaptação do algoritmo apresentado no trabalho de Rana [Rana,
1983].
Liskov e Ladin tomam uma abordagem diferente do gerenciamento distribuído de
memória [Liskov, 1986]. Ao invés de distribuir a decisão de marcar um objeto, o
serviço é logicamente centralizado, mas fisicamente replicado a fim obter alta tolerância
a falhas e disponibilidade. Esse algoritmo assume que todos os objetos estão
armazenados de forma estável, os relógios estão sincronizados e os atrasos nas entregas
das mensagens são limitados. Isso permite que o serviço centralizado construa uma
visão consistente do sistema distribuído. As referências remotas e seus caminhos são
informados pelos coletores locais ao serviço centralizado. Baseado nas informações
fornecidas, o serviço centralizado constrói um grafo das referências entre espaços. Em
seguida, executa um algoritmo local de mark-sweep nesse grafo e informa ao coletores
de lixo locais quais objetos são acessíveis e quais não são. Essa informação é usada
pelos coletores locais, que também executam o algoritmo local de mark-sweep, para
detectar o lixo.

3. O Início da Coleta de Lixo Distribuída


É possível apontar elementos em comum entre os algoritmos citados na sessão anterior
e outros algoritmos de coleta de lixo distribuída presentes no trabalho de Plainfossé e
Shapiro [Plainfossé, 1995]. Primeiramente, nenhum desses algoritmos consegue
satisfazer ao mesmo tempo os requisitos de eficiência, escalabilidade, tolerância a
falhas e coleta de todos os tipos de estruturas de dados.
As técnicas baseadas em contagem de referências são frágeis no sentido de que tentam
manter uma contagem precisa das referências. Tais técnicas apresentam falhas quando
as mensagens são perdidas ou duplicadas e também não são capazes de coletar ciclos.
Uma vantagem das técnicas baseadas em contagem de referências é a possibilidade de
intercalar a execução do coletor de lixo com a execução do programa, tornando-as mais
adequadas para sistemas distribuídos que possuem requisitos de tempo real.
As técnicas baseadas em mark-sweep são inerentemente cíclicas e potencialmente mais
tolerantes a falhas, pois a execução de uma coleta de lixo não é afetada por falhas que
possam ter ocorrido numa coleta anterior. Essas técnicas requerem que todos os espaços
cooperem na coleta distribuída. Sendo assim, elas não podem continuar a coleta caso
algum espaço falhe, mesmo que esse espaço não possua nenhuma parte do grafo de
objetos distribuídos. As técnicas baseadas em mark-sweep também possuem um alto
custo de terminação e algumas delas não são escaláveis.
Um grande problema enfrentado pelas técnicas de mark-sweep é a decisão sobre quando
iniciar a coleta de lixo. Algumas delas optam pelo modelo de sincronização mais
simples chamado stop-the-world, ou seja, o sistema distribuído para a sua execução de
tempos em tempos para que seja feita a coleta de lixo. Isso acarreta desvantagem
obvias, como por exemplo, a impossibilidade de usar tais algoritmos em alguns sistemas
iterativos e principalmente em sistemas de tempo real. Algumas abordagens tentam
intercalar a execução do algoritmo de mark-sweep distribuído com a execução do
programa, ou mesmo torná-las concorrentes. Porém, muitas vezes é inviável tentar
manter um estado aproximado e consistente da coleta de lixo.
É possível notar que os algoritmos iniciais de coleta de lixo dão muita ênfase na troca
de mensagens, implementando soluções para tratar a entrega fora de ordem das mesmas.
Outra preocupação bastante comum diz respeito a quando iniciar a coleta, como
descrito no parágrafo acima. Generalizando ainda mais, vê-se que tais algoritmos tratam
de todos os tipos de objeto, locais ou remotos, e podem ser inseridos como uma camada
de coleta de lixo sobra a qual o sistema distribuído pode rodar. É importante ressaltar
aqui esse fato, pois a próxima sessão mostrará alguns exemplos de algoritmos que não
são baseados em objetos e sim em modelos mais específicos.

4. Preocupações Atuais
Sem dúvida, a coleta de lixo distribuída é uma área onde podem ocorrer mudanças
rápidas e possivelmente drásticas. A tecnologia na área de redes evolui rapidamente,
levando a construção de sistemas distribuídos cada vez mais sofisticados. O requisito de
transparência deve ser levado ao extremo, permitindo a implementação de poderosos
sistemas distribuídos que irão rodar sobre uma camada de coleta de lixo distribuída de
um protocolo de comunicação.
É muito difícil falar dos algoritmos de coleta de lixo distribuída sem correr o risco de
levantar questões relativas à evolução da tecnologia de redes. É razoável assumir que,
em uma rede local, a comunicação é confiável, de baixo custo e bastante rápida.
Também é possível assumir a existência de algum tipo de sincronização global. Assim,
os algoritmos de coleta de lixo distribuída para redes locais, como os citados acima,
podem ser vistos como uma extensão dos algoritmos de coleta de lixo local. Embora
não seja explicitamente mencionado na literatura, é justo dizer que quase todos os
algoritmos de coleta de lixo até 1995, ano de publicação do trabalho de Plainfossé e
Shapiro [Plainfossé, 1995], visam redes locais, pois assumem que as mensagens sempre
são entregues, que o custo de envio é relativamente baixo ou que existe algum
mecanismo de sincronização. Algoritmos que pretendem rodar em WANs (Wide Área
Networks) não podem fazer tais suposições. Porém, à medida que a tecnologia evolui,
as máquinas e as redes se tornam mais velozes e confiáveis. Um problema
computacional que hoje é endereçado por uma rede local pode amanhã estar rodando
sobre uma WAN. A mesma escala evolucionária se aplica a protocolos de coleta de lixo
distribuída.
Algoritmos atuais de coleta de lixo distribuída possuem um enfoque bastante diferente
dos inicias. Por exemplo, eles não mais se preocupam em determinar quando iniciar a
coleta de lixo. Alguns deles, ao invés de se basearem em um sistema orientado a
objetos, procuram tratar de outros tipos de entidades, como atores. Essas entidades
possuem um comportamento bastante diferente dos objetos passivos comuns. As
mesmas regras usadas para se determinar se um objeto é lixo não podem ser
consideradas num sistema de atores, como pode ser visto na sessão 4.1.
Outros trabalhos apresentam algoritmos que procuram resolver o problema da
sincronização, não assumindo a existência de um relógio global ou uma troca de
mensagens confiável. Como exemplo, podemos citar o trabalho de Veiga e Ferreira
[Veiga, 2005] que descreve um algoritmo de coleta de lixo distribuída capaz de coletar
ciclos distribuídos de forma assíncrona e eficiente, sem necessitar de nenhum tipo de
coordenação entre espaços e tolerando perda de mensagens. Na sessão 4.2, é
apresentado um trabalho que trata de checkpoints ao invés de objetos e toma como
principal requisito o assincronismo, mostrando claramente como os algoritmos foram se
tornando mais específicos.
4.1 Coleta de Lixo Distribuída para Sistemas de Atores Móveis
O conceito de atore unifica as noções de processo (thread de controle), memória
(variáveis encapsuladas) e comunicação (troca de mensagens). Atores são objetos
atualmente ativos. Não existem entidades passivas. Cada ator é unicamente identificado
pelo endereço de sua caixa de mensagens. Atores-raiz são aqueles designados para estar
sempre em execução e também aqueles que podem interagir com o mundo externo, via
mecanismo de entrada e saída por exemplo. Um ator pode estar desbloqueado, quando
está processando uma mensagem ou quando possui mensagens em sua caixa, ou pode
estar bloqueado. A comunicação entre atores e puramente assíncrona, no entanto, a
comunicação é garantida, todas as mensagens são eventualmente enviadas e recebidas.
Existe uma dificuldade adicional enfrentada por um coletor de lixo para atores:
simplesmente seguir as referências a partir dos atores-raiz não garante que todo o lixo
será detectado. A figura 1 mostra a diferença entre um sistema de coleta de lixo baseado
em objetos passivos e um sistema baseado em atores. Essa figura foi extraída do
trabalho de Wang e Varela [Wang, 2006] que usa uma abordagem chamada pseudo-raíz
para tratar a coleta de lixo em sistemas baseados em atores. Nessa abordagem, os
autores introduzem um conjunto de pseudo-raízes dinâmicas que podem ser vista como
o conjunto raiz da coleta de lixo. As pseudo-raízes usam referências protegidas (que não
podem ser apagadas) para assegurar que atores não sejam coletados erroneamente,
mesmo com mensagens em trânsito.

8 1 2 3 4

9 5 6 7

Ator-raiz Ator bloqueado Ator desbloqueado Referência Ator vivo


Grafo de referências entre atores

8 1 2 3 4

9 5 6 7

Objeto-raiz Objeto Referência Objeto vivo


Grafo de referências entre objetos

Figura 1. Os atores 3, 4 e 8 estão vivos, pois podem enviar mensagens para os atores-
raíz. Os Objetos 3, 4 e 8 são lixo, pois não podem ser alcançados a partir da raíz.
Um ator pode ser considerado lixo quando ele não mais interage com o sistema, mas
continua consumindo memória e tempo de processamento. Sendo assim, um ator é
considerado lixo quando não está mais ativo e nem pode se tornar ativo no futuro ou
quando não pode mais enviar mensagens para os atores-raiz e nem receber mensagens
dos mesmos. A propriedade chave de um ator considerado lixo é que ele não pode
deixar de ser lixo. Isso se deve pelo fato de não é mais possível para esses atores se
comunicarem com atores-raiz.

4.2 Coleta de Lixo Assíncrona para Protocolos de Checkpointing


Checkpoiting é uma técnica bastante conhecida e usada para se obter tolerância a falhas
em sistemas distribuídos. De tempos em tempos, cada processo salva o estado local da
aplicação como um checkpoint. Quando uma falha ocorre, o programa distribuído
retoma a sua execução a partir do checkpoint global consistente mais recente, também
chamado de linha de recuperação. Para evitar o efeito dominó, quando uma falha faz a
aplicação voltar ao estado inicial, pois os checkpoints globais eram todos inconsistentes,
foram criados protocolos de checkpointings de comunicação induzida. Esses protocolos
inserem nas mensagens da aplicação informações de controle e ordenam aos processos a
criação de checkpoints forçados. Outra importante propriedade de sistema baseados em
checkpoints é a capacidade de percorrer as dependências entre checkpoints durante a
execução da aplicação. Essa propriedade é chamada de rollback-dependency
trackability (RDT).
Um problema enfrentado por esses sistemas é a possível criação de checkpoints
obsoletos, ou seja, checkpoints que não serão mais usados em linhas de recuperação
futuras. Esses checkpoints ficam apenas ocupando espaço de armazenamento. Para
contornar esse problema, Schmidt [Schmidt, 2005] criou um algoritmo de coleta de lixo
distribuída para protocolos de checkpoints. O ponto interessante do trabalho é que ele
descreve o primeiro algoritmo para protocolos de checkpoints que não usa nenhum tipo
de sincronização entre processos e também não depende de uma troca de mensagens
confiável. O trabalho apresenta uma solução ótima para quando a coordenação é feita
apenas através de informações inseridas nas mensagens da aplicação, ou seja, o
algoritmo não requer a troca de mensagens de controle extra para a realização da coleta
de lixo.

5. Conclusão
Algoritmos de coleta de lixo distribuída são essenciais para a implementação de
sistemas distribuídos sofisticados. Inicialmente, ao partir para um ambiente distribuído,
tentou-se fazer uma tradução direta dos algoritmos básicos de coleta de lixo local para
algoritmos de coleta de lixo distribuída. Sendo assim, os algoritmos iniciais podem ser
vistos como uma extensão dos algoritmos básicos de coleta de lixo local. Esse trabalho
apresentou uma análise das semelhanças e diferenças dos algoritmos iniciais de coleta
de lixo distribuída e também quais eram as primeiras preocupações da área.
Ao saltar anos à frente, podemos observar a mudança de foco na área de coleta de lixo
distribuída. Os algoritmos se tornam mais específicos, procurando não tratar de objetos
em geral, mas de outras entidades que possuem um comportamento diferente dos
objetos. Também é possível notar que os algoritmos mais recentes evitam fortes
suposições sobre a infra-estrutura de rede, como a existência de um relógio global e
uma troca de mensagens confiável. Alguns deles, por exemplo, passam a dar um grande
enfoque ao problema do assincronismo.
Referências
[Hughes, 1985] John Hughes. A distributed garbage collection algorithm. Nos anais
da ACM Conference on Functional Programming Languages and Computer
Architecture, número 201 da série Lecture Notes in Computer Science,
páginas 256-272, Nacy, França, Software Practice and Experience 1985.
Springer-Verlag.
[Jones, 1996] Richard Jones e Rafael Lins. (1996), Garbage Collection: Algorithms
for Automatic Dynamic Memory Management, Wiley, 1a edição.
[Lermen, 1986] C.W. Lermen e Dieter Maurer. A protocol for distributed reference
counting. Em [LFP, 1986], páginas 343-350.
[Liskov, 1986] Barbare Liskov e Rivka Ladin. Highly available distributed services
and fault-tolerant distributed garbage collection. Nos anais do 5o Annual
Symposium on the Principles on Distributed Computing, páginas 29-39.
Calgary, agosto de 1986. ACM Press.
[Plainfossé, 1995] David Plainfossé e Marc Shapiro. A survey of distributed garbage
collection techiniques. Nos anais do International Workshop on Memory
Management. Kinross, Escócia, Setembro de 1995.
[Rana, 1983] S. P. Rana. A distributed solution to the distributed termination
problem. Information Processing Letters, 17:43-46, julho de 1983.
[Schmidt, 2005] Rodrigo Schmidt, Islene C. Garcia, Fernando Pedone e Luiz E.
Buzato. Optimal asynchronous garbage collection for RDT checkpointing
protocols. Nos anais da 25a International Conference on Distributed
Computing Systems (ICDCS'05). Columbus, Ohio, EUA, Junho de 2005
[Veiga, 2005] Luís Veiga e Paulo Ferreira. Asynchronous complete distributed
garbage collection. Nos anais do 19o IEEE International Parallel and
Distributed Processing Symposium (IPDPS’05).
[Wang, 2006] Wei-Jen Wang e Carlos A. Varela. Distributed garbage collection for
mobile actor systems: the pseudo root aproach. Nos anais da 1a International
Conference on Grid and Pervasive Computing (GPC 2006), volume 3947 de
Lecture Notes in Computer Science, páginas 360-372, Taichung, Taiwan,
Maio de 2006.
[Wilson, 1992] Paul R. Wilson. Uniprocessor garbage collection techniques. Nos
anais do International Workshop on Memory Management na série Lecture
Notes in Computer Science. St. Malo, França, Setembro de 1992. Springer-
Verlag.

También podría gustarte