Última Atualização: 9 Dezembro de 2001, 13:13 BRDT

Memória Compartilhada Distribuída em Java

    O projeto tenciona permitir o uso de um sitema distribuído de alocação de objetos em Java. Através do pacote, será possível desenvolver aplicações que usam memória distribuída como se elas usassem memória compartilhada local. Também seria interessante reaproveitar código desenvolvido no segundo modelo para construir aplicações rodando modelo distribuído sem grande esforço.
    Uma pesquisa preliminar mostrou que diversos esforços foram feitos nesse sentido, muitos deram certo. Todos eles são melhores para algumas aplicações e piores para outras. Nosso projeto também não promete ser definitivo e/ou melhor que os outros, mas pode se tornar ponto de partida para algo maior.

Índice

Introdução
O produto
Detalhes de desenho
Os autores
Arquitetura
Utilizando uma referência global
Operações em uma referência global
Leases - mantendo a consistência
Transações
Compartilhando um objeto
Construindo e utilizando proxies
Entranhas: trocas de mensagens
Tipos de mensagem
Tabela - mensagens trocadas em cada operação
Desenvolvimento
O que falta para ficar perfeito?
Código-fonte
Javadoc do pacote

O produto

   Ao longo do semestre, o produto final não se distanciou da idéia inicial: uma biblioteca para desenvolvimento de aplicações usando memória distribuída como se fosse memória compartilhada local. O desenho, como se vê a seguir, não mudou muito:

Detalhes de desenho

    Todo objeto compartilhado deve ser serializável, isto é, implementar a interface java.io.Serializable. Além disso, cada objeto é acessado indiretamente, através de uma SharedReference(br.shmem.SharedReference). Detalhes sobre o funcionamento e uso de SharedReferences está em
Utilizando uma referência global.

Nosso primeiro protótipo funcional já pode ser baixado na página de downloads.

O controle de concorrência ficou bastante simples, mas causa uma pequena sobrecarga na rede, uma vez que os locks de escrita ficam no servidor, e é necessário trocar mensagens com ele mesmo que o lock tenha sido pego por uma thread do mesmo host. Ao contrário do que pensávamos, o pacote do Doug Lea que tencionávamos usar não foi muito útil. Apenas utilizamos um semáforo para exclusão mútua. O pacote seria mais útil se a arquitetura ficasse mais complexa (veja O que falta para ficar perfeito).

A parte de segurança de dados e autenticação de dados e hosts também ficou muito simples: A confiança ficou inteiramente depositada no servidor: os clientes só aceitam timestamps gerados pelo servidor, e identificam outros clientes verificando suas assinaturas com as chaves públicas que ele fornece. O Servidor foi construído de tal forma que ele aceita qualquer login. Fica a cargo da aplicação extender o br.shmem.server.Server para restringir o acesso ao espaço global.

Como todos os timestamps são gerados pelo servidor e a consistência dos dados não é muito rígida, não é necessário sincronizar relógios entre os hosts da aplicação. Isso torna o pacote muito mais maleável e permite que usuários sem direito de modificar o relógio do seu host criem aplicações com ele.

Autores: