Um Estudo sobre Mobilidade em Sistemas Distribuídos

Propaganda
UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL
INSTITUTO DE INFORMÁTICA
CURSO DE PÓS-GRADUAÇÃO EM CIÊNCIA DA COMPUTAÇÃO
Um Estudo sobre Mobilidade
em Sistemas Distribuídos
por
DÉBORA NICE FERRARI
T.I. 780 CPGCC-UFRGS
Trabalho Individual II
Prof. Dr. Cláudio Fernando Resin Geyer
Orientador
Porto Alegre, fevereiro de 1999
2
UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL
Reitora: Profa. Wrana Panizzi
Pró-Reitora de Pós-graduação: Profa. Lorena Holzmann da Silva
Diretor do instituto de Informática: Philipe Oliver Navaux
Coordenador do CPGCC: Carla Freitas
Bibliotecária-Chefe do Instituto de Informática: Zita Prates de Oliveira
3
Sumário
SUMÁRIO................................................................................................................................................... 3
LISTA DE FIGURAS.................................................................................................................................4
LISTA DE TABELAS ................................................................................................................................ 5
RESUMO .................................................................................................................................................... 6
ABSTRACT ................................................................................................................................................ 6
1
1.1
1.2
1.3
1.4
2
2.1
2.2
2.3
2.3.1
2.3.2
2.3.3
2.4
3
3.1
3.2
3.3
3.4
4
4.1
4.1.1
4.1.2
4.1.3
4.1.4
4.2
4.2.1
4.2.2
4.2.3
4.3
4.4
5
5.1
5.2
6
INTRODUÇÃO .................................................................................................................................7
TEMA .............................................................................................................................................. 7
MOTIVAÇÃO .................................................................................................................................... 7
OBJETIVOS ...................................................................................................................................... 9
ESTRUTURA DO TEXTO ................................................................................................................... 9
MOBILIDADE ................................................................................................................................ 10
CONCEITOS ................................................................................................................................... 10
MECANISMOS ................................................................................................................................ 11
PARADIGMAS PARA MOBILIDADE................................................................................................... 14
Avaliação Remota......................................................................................................................... 15
Código em Demanda .................................................................................................................... 15
Agentes Móveis............................................................................................................................. 16
CONCLUSÕES ................................................................................................................................ 16
MOBILIDADE EM OBJETOS E AGENTES.............................................................................. 17
PARADIGMA ORIENTADO À OBJETOS ............................................................................................ 17
PARADIGMA ORIENTADO A AGENTES ............................................................................................ 18
AGENTES MÓVEIS ......................................................................................................................... 20
CONCLUSÕES ................................................................................................................................ 23
TECNOLOGIAS PARA SUPORTE À MOBILIDADE .............................................................. 24
FERRAMENTAS PARA SUPORTE À MOBILIDADE .............................................................................. 24
Java .............................................................................................................................................. 24
Obliq............................................................................................................................................. 25
Oz Distribuído .............................................................................................................................. 26
CORBA ......................................................................................................................................... 27
AMBIENTES QUE PERMITEM EXPLORAR MOBILIDADE .................................................................... 30
Voyager ........................................................................................................................................ 30
Aglets ............................................................................................................................................ 33
Concordia..................................................................................................................................... 35
APLICAÇÕES .................................................................................................................................. 37
CONCLUSÕES ................................................................................................................................ 38
ANÁLISE COMPARATIVA DAS TECNOLOGIAS QUE SUPORTAM MOBILIDADE .....40
ANÁLISE COMPARATIVA DAS FERRAMENTAS ................................................................................. 40
CONCLUSÕES ................................................................................................................................ 44
CONCLUSÃO .................................................................................................................................45
BIBLIOGRAFIA ...................................................................................................................................... 47
4
Lista de Figuras
FIGURA 2.1 - Mecanismos de Mobilidade
13
FIGURA 4.1 - Arquitetura de Gerenciamento de Objetos (OMA)
29
FIGURA 4.2 - Objeto Voyager
32
FIGURA 4.3 - Criação de um programa Voyager
32
FIGURA 4.5 - Arquitetura do Concordia
35
5
Lista de Tabelas
TABELA 1 - Ferramentas para suporte à mobilidade
42
TABELA 2 - Ambientes para explorar mobilidade
44
6
Resumo
O número de aplicações distribuídas criadas para serem usadas na Internet aumentou
consideravelmente nos últimos anos. Uma das mais complexas questões nestas
aplicações diz respeito à mobilidade das entidades envolvidas na computação
distribuída. Neste texto define-se mobilidade como a capacidade das entidades
computacional deslocar-se de um ambiente para outro, através do sistema distribuído.
Os estudos sobre mobilidade intensificaram-se com o uso em grande escala da Internet.
Atualmente, a maioria das aplicações de mobilidade são desenvolvidas utilizando ou
baseando-se nos paradigmas de orientação a objetos ou de agentes. Pode-se observar
que estes dois paradigmas, estão cada vez mais presentes no desenvolvimento de
aplicações para Internet.
Considerando os aspectos acima mencionados e o interesse crescente da comunidade
científica com relação à mobilidade, este trabalho procura estudar aspectos referente à
mobilidade em sistemas distribuídos envolvendo agentes e objetos. Neste texto são
abordados assuntos importantes como os fundamentos que envolvem os estudos em
mobilidade, resultados dos estudos envolvendo mobilidade em objetos e agentes,
tecnologias e aplicações para suporte à mobilidade. Apresenta-se também uma análise
comparativa referente à mobilidade dos sistemas distribuídos apresentados neste
trabalho.
Palavras-chave: Orientação a Objetos, Agentes Móveis, Mobilidade, Sistemas
Distribuídos.
Abstract
In the last few years, the number of Internet-based distributed applications increased
meaningfully. One of the most complex issues involving these applications are related
to entity mobility. This text defines mobility as the capacity of an computational entity
to relocate itself from an environment to another one, through the distributed system.
Research on mobility had been intensified with the Internet large-scale use. Currently,
the majority of mobility applications is developed using or being based on
object oriented or agents paradigms. Note that these two paradigms are even more
present in the development of applications for Internet.
Considering the aspects mentioned above and the scientific community increasing
interest with relation to mobility, in this work are presented mobility aspects in
distributed systems involving agents and objects. These aspects include: the
fundamental concepts of mobility research, results of studies involving mobility in
objects and agents, technologies and applications for mobility support. An comparative
analysis related to mobility in distributed systems is also presented in this work.
Keyword: Objects, Mobile Agents, Mobility, Distributed Systems.
7
1 Introdução
1.1 Tema
O paradigma orientado a objetos e o paradigma de agentes são interesses constantes da
comunidade científica, principalmente em ambientes distribuídos. Sendo assim,
surgiram modelos para computação distribuída de objetos e agentes. Uma das mais
complicadas questões envolvendo ambientes distribuídos com estas características diz
respeito à mobilidade nesses dois paradigmas. O texto [GLA 98] define mobilidade
como a habilidade de mover-se independentemente de um dispositivo para outro através
da rede. Como é visto no capítulo 2, vários conceitos sobre mobilidade são encontrados
na literatura. O tema deste trabalho é o estudo da mobilidade em sistemas distribuídos,
principalmente envolvendo objetos e agentes.
1.2 Motivação
A rápida disseminação de microcomputadores e estações de trabalho, o aumento nas
suas capacidades de processamento, e o surgimento de redes de comunicação com
grande largura de banda, têm levado ao desenvolvimento cada vez maior de aplicações
distribuídas. Os sistemas distribuídos apresentam várias características que são objetos
de constante pesquisa na busca de soluções, tais como: afastamento, concorrência,
ausência de estado global, ocorrência de falhas parciais, assincronismo,
heterogeneidade, autonomia e mobilidade.
Diversos modelos de arquitetura distribuída têm sido desenvolvidos com o objetivo de
oferecer conceitos que auxiliem o tratamento das características de distribuição citadas
acima. A característica de heterogeneidade, presente em grande parte destes modelos,
impõe a necessidade de especificações abertas, com interfaces padronizadas e públicas,
levando ao desenvolvimento de middlewares abertos.
Um middleware é uma camada de software, residente acima do sistema operacional e da
camada de comunicação, que oferece abstrações de alto nível, com objetivo de facilitar a
programação distribuída. As abstrações oferecidas fornecem uma visão uniforme na
utilização de recursos heterogêneos existentes nas camadas de sistema operacional e
redes[OMG 95].
Ambientes de sistemas abertos permitem aos usuários escolherem entre um grupo de
computadores e tecnologias, aqueles que se adequam a suas necessidades. Esses
sistemas oferecem também uma crescente interoperabilidade, escalabilidade e
portabilidade. A interoperabilidade permite que sistemas diferentes convivam juntos. Já
a portabilidade permite que um software desenvolvido em uma plataforma possa
executar em outra com adaptações mínimas. A escalabilidade permite que novos
recursos, tanto hardware quanto software, sejam adicionados ao sistema a medida que
há necessidade de novos recursos ou de aumento do poder de processamento.
Juntamente com estes adventos quanto aos sistemas distribuídos, surgiram várias frentes
de pesquisas para que as organizações pudessem explorar ao máximo os sistemas
8
distribuídos. Dentre estas linhas de pesquisa, este texto destaca à mobilidade em
sistemas distribuídos como sendo a principal motivação para este trabalho. O estudo
sobre mobilidade abrange tanto aspectos conceituais, quanto sistemas e linguagens.
A orientação a objetos tornou-se um dos principais padrões no desenvolvimento de
sistemas. As linguagens orientadas a objeto tentam propor a diminuição da distância
semântica existente entre a modelagem computacional e o mundo real. Neste sentido,
surgem os objetos e suas diversas características (herança, polimorfismo,
encapsulamento, etc). Desta forma, a orientação a objetos tenta alcançar um nível de
abstração que aproxima a programação de computadores à forma usual do homem
interagir com o mundo.
Da mesma forma, nos últimos anos vem crescendo o interesse dos cientistas da
computação pelo paradigma orientado a agentes. O desenvolvimento orientado a agentes
possui uma forte relação com o desenvolvimento orientado a objetos. O conceito de
agentes introduz consciência no universo inanimado dos objetos. Esta é uma das
contribuições do paradigma orientado a agentes [BAR 98].
Tanto objetos como agentes são amplamente usados pela comunidade científica em
ambientes distribuídos. Sendo assim, surgiram modelos para computação distribuída de
objetos e agentes. Um dos fatores principais nestes ambientes diz respeito à mobilidade
destas entidades.
Os estudos sobre mobilidade intensificaram-se com o uso em grande escala da Internet.
Embora à mobilidade não seja uma concepção nova, pois redes locais já usam uma
formas de mobilidade como migração, a Internet trouxe a possibilidade de explorar
mobilidade através de redes heterogêneas, conectadas por diferentes links de
comunicação e distantes uma das outras.
Atualmente, a maioria das aplicações são desenvolvidas utilizando ou baseando-se na
orientação a objetos. Da mesma forma, várias aplicações, principalmente na área de
Informática na Educação e Inteligência Artificial, são desenvolvidas usando como
entidade base o agente. O que pode-se observar é que estas duas entidades, objetos e
agentes, estão cada vez mais presentes no desenvolvimento de aplicações para serem
usadas na Internet. Talvez o que tenha auxiliado muito para que isto acontecesse é o uso
cada vez maior da linguagem Java [SUN 96], como linguagem de programação destas
aplicações.
É importante observar que a exploração da mobilidade envolve muito a questão da
localização. Uma premissa básica é que o usuário não necessita saber, se assim o
quiser, onde a sua computação está sendo desenvolvida, pois a aplicação deve abstrair
aspectos de localização do usuário. Outra questão importante em mobilidade é a
segurança. Como a computação é distribuída através da rede, a integridade desta
computação deve ser preservada. No desenvolvimento de aplicações que suportem
mobilidade, a tolerância a falhas e segurança da computação deve sempre estar presente.
Além destes aspectos, à mobilidade traz novos desafios ao desenvolvimento de
aplicações distribuídas, como pensar à mobilidade durante o projeto de software. Para
suportar mobilidade de forma transparente para o usuário, a noção de ambiente
computacional deve estar presente. Este ambiente será elemento principal no suporte à
mobilidade das entidades envolvidas.
9
Considerando os aspectos acima mencionados e o interesse crescente da comunidade
científica com relação à mobilidade em ambientes distribuídos, este trabalho procura
compreender o estado da arte e os problemas relacionados à mobilidade em sistemas
distribuídos.
1.3 Objetivos
O objetivo geral deste trabalho consiste em estudar os aspectos relacionados à
mobilidade de objetos e agentes em ambientes distribuídos.
Como objetivos específicos podem ser destacados:
• Pesquisar conceitos relacionados à mobilidade;
• Pesquisar o estado da arte relacionado à mobilidade em sistemas distribuídos,
em especial envolvendo objetos e agentes;
• Estudar tecnologias para o desenvolvimento de aplicações que suportem
mobilidade;
• Identificar características necessárias para que uma tecnologia de apoio ao
desenvolvimento de aplicações que suportem mobilidade.
1.4 Estrutura do Texto
Este texto é composto de seis capítulos. O capítulo 2 descreve os fundamentos que
envolvem os estudos em mobilidade. O capítulo 3 apresenta o resultado dos estudos
envolvendo mobilidade em sistemas distribuídos. Além disso, será apresentado,
brevemente, os fundamentos dos paradigmas orientado a agentes e orientado a objetos.
No capítulo 4 são apresentadas algumas tecnologias e aplicações para suporte à
mobilidade. Merece destaque neste capítulo Voyager [OBJ 97] [OBJ 98]. No capítulo 5
é feita uma comparação referente à mobilidade em sistemas distribuídos apresentadas
neste trabalho. Finalmente, o capítulo 6 contém as conclusões deste trabalho.
10
2 Mobilidade
Este capítulo descreve os fundamentos que envolvem os estudos de mobilidade. As
seções contêm os conceitos necessários para compreender o universo que envolve as
aplicações que utilizam mobilidade. A seção 2.1 analisa conceitos relacionados à
mobilidade conforme vários autores. A seção 2.2 descreve os mecanismos que permitem
explorar mobilidade. A seção 2.3 explora aspectos relacionados aos paradigmas que
exploram mobilidade. Finalmente, a Seção 2.4 faz uma síntese das demais seções
concluindo o capítulo.
2.1 Conceitos
Por ser uma área de pesquisa relativamente nova, as pesquisas que envolvem
mobilidade conceituam este termo de várias formas. A maioria refere-se à mobilidade
através do termos código móvel (mobile code) [FUG 98] [CAR 97] [THO 97] [CUG
96] e agentes móveis (mobile agent) [DÖM 97] [CHE 96] [KNA 96] . Estes termos são
conceituados de diferentes formas por diferentes pesquisadores:
• Mobilidade é a habilidade de mover-se independentemente de um dispositivo para
outro através da rede [GLA 98];
• Código móvel pode ser definido como a capacidade de dinamicamente trocar as
ligações entre os fragmentos de código e a localização onde o código é executado
[CUG 98] [FUG 98] [CAR 97];
• Código móvel é um software que viaja através de redes heterogêneas, atravessando
vários domínios, sendo que é automaticamente executado quando chega em seu
destino [THO 97];
• Agentes móveis são programas que podem ser disparados de um computador cliente
e transportado para um computador remoto para ser executado [CHE 96];
• Agentes móveis são programas que podem se mover através de uma rede de
computadores conforme queiram seus usuários [DÖM 96];
• Agentes móveis são programas “inteligentes” que podem ser transmitidos entre os
diversos computadores de um sistema distribuído [KNA 96].
Observando os itens acima, pode-se notar um elemento presente em todos os conceitos:
o deslocamento das entidades envolvidas (objetos ou agentes). Sendo assim, pode-se
dizer que mobilidade é a ca pacidade das entidades envolvidas na computação
deslocarem-se através de um sistema distribuído.
Mobilidade não é uma concepção nova, embora sua aplicação na Internet seja. Um
exemplo é a migração, pois migrar processos ou objetos é uma forma de mobilidade,
que já é usada em pequena escala. As pesquisas em mobilidade vem crescendo muito
atualmente devido principalmente a possibilidade de explorar código móvel em grande
escala através da Internet, onde as redes interligadas são heterogêneas e gerenciadas por
organizações diferentes.
11
2.2 Mecanismos
Tecnologias que exploram mobilidade devem prover mecanismos que suportem o
deslocamento de suas entidades. Estes mecanismos necessitam de uma estrutura
computacional que suporte à mobilidade. Sendo assim, a concepção de um ambiente
computacional (Computational Environment) deve ser introduzida para suportar os
diversos mecanismos necessários à mobilidade. Um ambiente computacional retêm a
identidade do nodo onde está localizado dando suporte para que as aplicações tenham a
capacidade de recolocar dinamicamente seus componentes em diferentes ambientes
computacionais. Um exemplo de ambiente computacional é a máquina virtual Java
(Java Virtual Machine).
O texto [FUG 98] trata mobilidade através do termo código móvel. O texto também
destaca que um ambiente computacional é uma espécie de “container” para as entidades
envolvidas na computação, chamadas componentes. Estes podem ser unidades de
execução ou recursos. Unidade de execução representa a entidade básica da linguagem,
um objeto por exemplo, através de um fluxo seqüencial da computação. Uma unidade
de execução é composta pelo segmento de código, que contém a descrição estática do
comportamento da computação, e um estado. Recursos representam entidades que
podem ser compartilhadas por múltiplas unidades de execução, como uma variável do
sistema operacional por exemplo.
A princípio, cada unidade de execução pode mover-se independentemente. Em alguns
sistemas que exploram código móvel, o código e o estado da unidade de execução
podem estar em diferentes ambientes computacionais. À mobilidade é determinada pela
característica do sistema. Por exemplo, em Java é possível mover somente o código de
um Applet [SUN 96]. Já em Java Aglet [LAN 97], tanto o código quanto o estado são
movidos.
Podem ser identificadas duas formas de mobilidade [FUG 98]: mobilidade forte e
mobilidade fraca.
Mobilidade forte permite que a unidade de execução possa mover seu código e o estado
da computação para diferentes ambientes computacionais. Neste caso, a execução é
suspensa, transmitida para o ambiente computacional destino, e sua execução é
retomada. Mobilidade fraca permite transferir código de um ambiente computacional
para outro. O código pode conter alguns dados inicializados, mas o estado da unidade de
execução não é movido. A figura 2.1 apresenta uma classificação dos mecanismos de
mobilidade [FUG 98].
12
Mobility
mechanisms
Code and
execution state
management
Strong
mobility
Weake
mobility
Migration
Proactive
Reactive
Remote
Cloning
Proactive
Code
shipping
Stand-alone
code
Reactive
Synchronous
Asynchronous
Imediate
Deferred
Code
fragment
Synchronous
Asynchronous
Imediate
Deferred
Code
fetching
Data space
management
Stand-alone
code
Re-binding
Asynchronous
Imediate
Binding removal
Network reference
Synchronous
Deferred
Code
fragment
Synchronous
Asynchronous
By copy
Imediate
By Move
Deferred
FIGURA 2.1 - Mecanismos de Mobilidade
Mobilidade forte pode ser explorada através de dois mecanismos: migração (migration)
e clone remoto (remote cloning). O mecanismo de migração suspende a execução de
uma unidade de execução, transmite para o ambiente computacional destino e retoma
sua execução. A migração pode ser proativa (proactive) ou reativa (reactive). Na
primeira, o tempo e o destino da migração são determinadas pela unidade de execução
migrante. Na segunda, a migração é acionada por diferentes unidades de execução que
tenham alguma espécie de ligação com a unidade de execução migrante. O mecanismo
de clone remoto cria uma cópia da unidade de execução no ambiente computacional
remoto. A unidade de execução não é isolada do ambiente computacional origem. Como
na migração, o clone remoto pode ser proativo ou reativo.
Mecanismos que suportam mobilidade fraca têm a capacidade de transferir código
através de ambientes computacionais e ligar-se dinamicamente com uma unidade de
execução ativa ou criar uma nova unidade de execução no ambiente remoto para a
execução. Estes mecanismos podem ser classificados de acordo com a direção da
transferência do código, a natureza do código movido, a sincronização envolvida e o
momento em que o código é executado no ambiente remoto.
Conforme a direção do código a ser transferido, uma unidade de execução pode trazer
(fetching) o código para ser dinamicamente ligado e/ou executado, ou pode levar
(shipping) o código para outro ambiente computacional. Nos dois casos, o código a ser
transferido pode ser um código autônomo (stand-alone code) ou fragmentado (code
13
fragment). No primeiro caso, no ambiente computacional destino é criada uma unidade
de execução para executar o código que chega. No segundo caso, a unidade de execução
deve ligar-se com um contexto que esteja executando o código ou que eventualmente o
tenha executado. Além disso, tanto no código autônomo como no fragmentado, estes
mecanismos podem ser síncronos (synchronous) ou assíncronos (asynchronous),
dependendo se a unidade de execução que solicita a transferência fica suspensa ou não
até que o código seja executado. No modo assíncrono, a execução do código transferido
pode ser imediata (imediate), isto é, o código é executado logo que recebido ou
postergada (deferred), isto é, espera alguma condição ser satisfeita para iniciar a
execução.
Após a migração de uma unidade de execução para um novo ambiente computacional,
sua ligação com os recursos que acessa deve ser reorganizada. Por exemplo, a unidade
de execução pode necessitar acessar um arquivo, portanto, ela deve estar apta a acessar
este arquivo mesmo que este esteja em outro local. Isto pode envolver novas ligações ou
sempre migrar alguns recursos necessários a computação junto com a unidade de
execução, dependendo da natureza do recurso e da aplicação. Por isto é necessário o
gerenciamento do espaço de dados.
Os recursos podem ser transferíveis ou não-transferíveis através da rede. Por exemplo,
um recurso do tipo arquivo pode ser transferível mas um recurso do tipo impressora não.
Recursos transferíveis podem ser marcados como livres ou fixos. O primeiro pode
migrar para outro ambiente computacional, enquanto que o último deve sempre
permanecer associado ao ambiente computacional.
Na reorganização dos recursos, duas classes de problemas devem ser analisados quando
uma unidade de execução desloca-se através da rede: realocação de recursos e
reconfiguração das ligações. Para isto deve ter um gerenciamento do espaço de dados
(data space management). A estratégia para gerenciar os recursos e os dados envolvidos
na transferência de código pode variar de sistema para sistema. Os mecanismos mais
usados são:
• remoção das ligações (binding removal) - quando a unidade de execução migra, as
ligações são simplesmente descartadas. Pode-se observar que esta estratégia
geralmente é usada quando há migração da entidade envolvida na computação,
portanto, num tipo de mobilidade forte;
• referência na rede (network reference)- quando um recurso é não transferível, a
ligação na unidade de execução com o recurso é modificada para referenciar o
recurso no ambiente computacional fonte, depois que a unidade de execução tenha
alcançado o ambiente computacional destino. Referência na rede geralmente é usada
quando à mobilidade forte é explorada, através do clone remoto;
• re-ligação (re-binding) - no ambiente computacional remoto há um recurso do
mesmo tipo que é referenciado na unidade de execução que chega. Sendo assim, a
ligação com o recurso no ambiente computacional fonte é desfeita, e uma nova
ligação apontando para o recurso no ambiente computacional destino é criada. Esta
estratégia é usada quando à mobilidade fraca é explorada, na forma de levar ou trazer
código fragmentado;
14
• por cópia (by copy)- uma copia do recurso é criada, e a ligação é modificada para
referenciar a cópia e esta é transferida junto com a unidade de execução para o
ambiente computacional destino. Pode-se observar que o mecanismo por cópia é
associado ao clone remoto, portanto explorando uma mobilidade forte;
• por movimento (by move)- o recurso é transferido junto com a unidade de execução
para o ambiente computacional destino mas a ligação com o ambiente computacional
fonte não é desfeita. Esta estratégia é usada em aplicações que exploram mobilidade
fraca.
2.3 Paradigmas para mobilidade
Abordagens tradicionais para projeto de software não são suficientes quando necessitase projetar aplicações distribuídas em larga escala que exploram código móvel e
reconfiguração dinâmica dos componentes do software. Neste caso, a distribuição dos
componentes para diferentes ambientes deve ser pensada durante o projeto de software.
Também deve-se considerar os aspectos que diferenciam a interação entre componentes
locais em ambientes remotos. Dentre esses aspectos cita-se uma maior latência de
comunicação, maior tempo para acesso a memória não local, mais pontos de falha e
necessidade de utilização de mecanismos para controle de concorrência e sincronização.
Portanto, é importante identificar paradigmas para projeto de sistemas distribuídos
explorando código móvel. Além disso, deve-se identificar a tecnologia mais adequada
para implementação do paradigma. Os paradigmas apresentados a seguir podem ser
vistos como um guia de referência para o projeto de aplicações distribuídas que
comportam mobilidade. Antes de introduzir os paradigmas, é necessário apresentar
algumas concepções básicas que abstraem as entidades envolvidas no sistema como
arquivos, variáveis, código executável ou processos. As abstrações básicas são as
seguintes [CAR 97]:
• Componentes - são os elementos que compõem a arquitetura. Podem estar dividos
em :
• componente recurso: é o componente embutido na arquitetura que representa
dados passivos ou dispositivos físicos;
• componente computacional: representa o fluxo de controle da computação. É
caracterizado por um estado e ligações com outros componentes;
• Interações - são eventos que envolvem dois ou mais componentes. Por exemplo, uma
mensagem trocada entre dois componentes computacionais pode ser considerada
como uma interação entre eles;
• Sites - são os ambientes de execução. Eles suportam a execução dos componentes
computacionais. Sites tem ligados a si a noção de localização [FUG 98]. Interações
entre componentes no mesmo site são consideradas pouco expressivas se
relacionadas com interações em sites diferentes, pois como os recursos estão locais,
as interações acontecem de forma mais rápida e sem problemas de latência da rede,
acesso aos recursos, tempo de acesso, etc.
15
O paradigma é descrito em termos de padrões de interações que definem a re-colocação
e a coordenação entre componentes necessários para realizar um serviço.
Conforme [FUG 98], são três os principais paradigmas que exploram código móvel:
Avaliação Remota, Código em Demanda e Agentes Móveis. Estes paradigmas são
caracterizados pela localização dos componentes antes e depois da execução dos
serviços, pelo componente computacional que é responsável para execução do código e
onde a computação acontece.
Paradigmas para código móvel tem explicitamente a noção de localização. Assim, é
possível modelar, a nível de projeto, custos para interações entre componentes. Em
geral, conforme [FUG 98], interações entre componentes que compartilham a mesma
localização tem um custo considerado negligenciável quando comparado a interações
entre sites através da rede. A escolha do paradigma a ser explorado deve ser pensado
caso a caso, de acordo com o tipo de aplicação.
2.3.1 Avaliação Remota
De acordo com o paradigma de Avaliação Remota, um componente de um sistema
que suporta mobilidade pode invocar serviços providos por outros componentes, que
estão distribuídos pelos nodos da rede, através do fornecimento dos dados necessários
para desenvolver o serviço bem como o código que descreve como o serviço é feito.
Avaliação Remota pode ser explicada da seguinte forma: um componente A, no site A ,
sabe (conhecimento) como realizar uma determinada tarefa (serviço) mas não tem os
recursos necessários para que ela seja feita. Estes recursos estão localizados em outro
site (site B). Conseqüentemente, A envia o conhecimento de como fazer o serviço para o
componente computacional localizado no site remoto. O componente B realiza o serviço
utilizando os recursos nele contidos. Após a execução, há novamente uma interação
entre os dois componentes para enviar o resultado da computação de volta para A.
Este paradigma é semelhante a abordagem cliente-servidor, onde os serviços são
executados em um servidor que contém os recursos e o conhecimento necessário para
executar uma tarefa. A semelhança pode ser verdadeira se todos os recursos, e a forma
de manipulação destes, estão ligados a um servidor da rede. No paradigma de
Avaliação Remota, o “cliente” sabe como executar uma tarefa, mas o recurso pode
encontrar-se em outro computador da rede. Neste caso, o conhecimento é transmitido
para onde está o recurso, sendo que no computador destino pode existir somente o
recurso em si, mas não o conhecimento necessário para manipulá-lo.
2.3.2 Código em Demanda
Na abordagem de Código em Demanda, o código que descreve o comportamento de
um componente em um sistema que suporta mobilidade pode ser buscado em um site
remoto para ser executado localmente. Exemplificando este paradigma, um componente
A tem acesso aos recursos localizados no Site A mas não tem o conhecimento de como
manipular estes recursos. Portanto, A interage com o componente B no Site B,
requisitando o conhecimento para acessar o recurso. Uma segunda interação acontece
16
quando B envia o conhecimento para A e este realiza a computação (abordagem
contraria a Avaliação Remota).
2.3.3 Agentes Móveis
No paradigma Agentes Móveis, onde os agentes são considerados unidades de execução
[CUG 96], todo o componente computacional é movido para o site remoto, inclusive o
seu estado, o código e alguns recursos necessários para o desenvolvimento da tarefa.
Para exemplificar, um componente A é dono do conhecimento, que esta no Site A, para
realizar alguns serviços. Só que em um determinado momento da execução, ele
necessita de alguns recursos que estão no Site B. Então A migra para o Site B
carregando o conhecimento necessário para executar uma tarefa. Ao mover-se para o
site remoto, A completa o serviço neste site. Este paradigma é diferentes dos outros
paradigmas, pois nestes o foco é a transferência de código entre componentes enquanto
que no paradigma de agentes móveis o código e o estado da computação são movidos
para o site remoto (migração).
2.4 Conclusões
Este Capítulo descreveu os fundamentos que envolvem os estudos em mobilidade,
necessários para compreender o universo que envolve as aplicações que utilizam
mobilidade. Pode-se observar que o conceito de mobilidade não é consenso entre a
comunidade científica que se dedica a estudar o assunto. Vários autores entendem
mobilidade de forma diferenciada, embora sejam unânime em um aspecto: o
deslocamento da entidade envolvida na computação móvel. Desta forma, pode-se dizer
que mobilidade, como o próprio nome diz, pressupõe que a entidade base da
computação possa mover-se de um ambiente computacional para outro.
O texto [FUG 98] apresenta uma estrutura conceitual para compreender código móvel.
O texto tem várias contribuições. Entre elas, um conjunto de termos e conceitos para
compreender e comparar as abordagens baseadas na noção de código móvel, através de
mecanismos e paradigmas que auxiliam o desenvolvimento de aplicações para código
móvel. Além disso, apresenta algumas tecnologias que suportam mobilidade e algumas
aplicações.
A capítulo 3 aborda aspectos de mobilidade em sistemas distribuídos.
17
3 Mobilidade em Objetos e Agentes
A maioria das tecnologias distribuídas que suportam mobilidade são construídas a partir
do paradigma orientado a agente. Como em alguns ambientes um agente é considerado
um objeto especial [OBJ 97] [OBJ 98], os conceitos da orientação a objetos são
amplamente utilizados por tecnologias que suportam mobilidade. Sendo assim, este
Capítulo apresenta aspectos relacionados à mobilidade em sistemas distribuídos,
especialmente envolvendo objetos e agentes. Para isto, são abordados aspectos
referentes a orientação a objetos, orientação a agentes e agentes móveis. A seção 3.1
aborda o paradigma orientado a objetos. A seção 3.2 apresenta o paradigma orientado a
agentes. A Seção 3.3 apresenta aspectos referentes a agentes móveis. Finalmente, a
seção 3.4 apresenta as conclusões do capítulo.
3.1 Paradigma Orientado à Objetos
O objetivo desta seção é “lembrar” vários aspectos relacionados à objetos que são
importantes para entender porque mobilidade é explorada usando objetos e agentes.
Além disso, em tecnologias como Voyager [OBJ 97], um agente é visto como um objeto
especial. Desta forma, os conceitos da orientação à objetos são muito utilizados no que
se refere a agentes. Amandi no texto [AMA 97], diz que observando as definições de
objeto e de agente, vê-se que existem características em comuns entre estas entidades e
entre sistemas multi-agentes e sistemas orientado à objetos.
Segundo [AMA 97], objetos são representações de entidades físicas ou abstratas do
mundo real, que pertencem ao contexto do sistema a ser projetado. Este possui como
características fundamentais: os atributos, os métodos e as mensagens. Conceitos
importantes relacionados com o paradigma orientado a objetos, tais como: mensagem,
encapsulamento, classe, instância, herança, associação dinâmica, polimorfismo e
reusabilidade devem ser observados em tecnologias que exploram mobilidade em
objetos. Estes conceitos podem ser encontrados, de forma descritiva, no livro de James
Rumbaugh ([RUM 96]), um clássico da orientação a objetos.
Outra característica importante é a concorrência. Quanto a concorrência em objetos,
existem dois tipos naturais:
•
Concorrência intra-objetos - a concorrência surge da existência de vários acessos
concorrentes a um mesmo objeto, que pode implicar a execução concorrente de
métodos de um mesmo objeto;
•
Concorrência inter-objetos - a forma de concorrência mais natural, que está
associada ao fato de vários objetos poderem executar simultaneamente.
Havendo concorrência, deve haver sincronização. Em objetos, é necessário sincronizar
os vários objetos, no caso de concorrência inter-objetos e as várias threads em um
objetos, no caso de concorrência intra-objetos.
A comunicação entre objetos pode ser feita de duas formas: síncrona e assíncrona. Na
síncrona, após o envio de uma mensagem a um objeto, a execução do emissor fica
suspensa enquanto não houver retorno por parte do receptor. Num contexto concorrente,
18
deve-se tomar precauções para evitar que o emissor de uma mensagem fique
indefinidamente bloqueado caso não receba resposta. Este tipo de problema levou a
utilização de mecanismos de mensagens assíncronas. Neste caso, o emissor ao enviar
uma mensagem ao um objeto não fica bloqueado, podendo seguir sua execução.
A associação entre concorrência e paralelismo é bastante natural, pois a concorrência
pode ser visto como paralelismo lógico entre tarefas. Embora sejam conceitos
independentes, na prática a diferença entre os dois torna-se difuso, pois cada vez mais os
sistemas concorrentes apoiam-se em sistemas paralelos. Isto acontece porque grande
parte dos conceitos associados a concorrência tem correspondência nos sistemas
paralelos: mecanismos de troca de mensagens, mecanismos de sincronização, etc.
Sendo assim, a passagem de um modelo de objetos concorrente para um modelo de
objetos paralelo é relativamente natural, pois o objeto como unidade de execução
concorrente assegura a localidade em termos de código e dados (encapsulamento). Além
disso, a troca de mensagens permite grande liberdade em termos de implementações em
ambientes paralelos.
Com referência a objetos distribuídos, pode-se dizer que um objeto distribuído é uma
espécie de código que pode “viver” em qualquer lugar de uma rede. Eles são uma
espécie de pacotes com código independente que podem ser acessados por clientes
remotos via invocação de métodos. O cliente não precisa saber em que lugar, na rede, o
objeto distribuído reside. Os objetos podem ser executados em sistemas operacionais
diferentes e podem trocar mensagens com outros objetos em qualquer parte da rede
[ORF 96].
Existe recentemente uma tendência de se construir sistemas computacionais abertos
utilizando objetos distribuídos. Estes possuem as mesmas características principais dos
objetos das linguagens de programação: encapsulamento, polimorfismo e herança,
tendo, dessa forma, as mesmas principais vantagens: fácil reusabilidade, manutenção e
depuração, só para citar algumas.
3.2 Paradigma Orientado a Agentes
A comunidade científica têm proposto uma variedade de definições, cada qual tentando
explicar o seu uso da palavra “agente”. Essas definições vão de um nível elementar até
um nível mais elaborado. Pesquisadores inventaram também novos termos para
referenciar seus agentes, tais como: agentes inteligentes, interfaces inteligentes,
interfaces adaptativas, knowbots, softbots, userbots, taskbots, personal agentes e
network agentes.
Durante o estudo, observou-se que não há uma definição unificada e universal a respeito
do termo "agente". Vários pesquisadores salientam a dificuldade para criação de uma
definição de agente. Amandi em [AMA 97] afirma que um agente representa uma
entidade computacional com um comportamento autônomo, que pode comunicar-se
com outros agentes com o fim de participar na realização de uma tarefa. Os agentes
podem auxiliar outros agentes e usuários de diferentes formas: eles ocultam a
complexidade de tarefas difíceis, podem treinar ou ensinar, ajudam em diferentes
colaborações, monitoram eventos e procedimentos, etc. Um sistema multiagentes é
19
definido por um conjunto de agentes que colaboram entre si para cumprir com as
responsabilidades do sistema.
Um agente deve apresentar algumas propriedades. Elas definem qual é a classificação
do agente, ou seja, um agente inteligente, reativo, capaz de aprender, etc. Propriedades
de agentes correspondem a características de um sistema que são resultados diretos da
arquitetura do sistema ou são níveis de operação que existem sobre a arquitetura que
tem um efeito no comportamento global do sistema. Por arquitetura se entende a porção
do sistema que fornece e gerência os recursos primitivos de um agente [FLE 98]. Para
que o sistema seja considerado agente, ele não necessita apresentar todas as
propriedades mas algumas delas são recomendáveis. Algumas propriedades são:
•
Autonomia - é a capacidade de perseguir uma agenda independentemente de seu
usuário. Isso requer aspectos de ação periódica, execução espontânea e iniciativa, em
que o agente precisa ser capaz de tomar ações preemptivas (optativas) e
independentes que eventualmente beneficiarão o usuário [FLE 98]. Em outras
palavras, a autonomia permite ao agente ter algum tipo de controle sobre suas ações
e estado interno.
•
Mobilidade - conforme [FLE 98], é a habilidade para mover-se de uma localização
para outra, enquanto preservam seu estado interno.
•
Comunicabilidade - é a capacidade de trocar informações com outras entidades
(agentes, humanos, objetos, seu ambiente) [FLE 98]. Nas interfaces entre os agentes,
é necessário decidir que tipo de declaração os agentes serão capazes de gerar e
compreender. Obviamente, o projeto da interface é cuidadosamente relatado para o
projeto da arquitetura de todo o sistema. Há ainda um outro problema na
comunicação que é a interpretação e significado das declarações do agente. Um
termo pode ter diferentes significados para diferentes agentes, o que é chamado de
conflito. Diferentes termos podem, entretanto, ter significado similar, o que significa
uma correspondência.
•
Aprendizagem - agentes são capazes de examinar o ambiente externo (por
exemplo, a Web) e o "sucesso" de ações prévias levam condições similares, e
adaptam suas ações para melhorar a probabilidade de atingir prosperamente suas
metas.
•
Reatividade - um agente está inserido em um ambiente que pode ser o mundo
físico, um usuário via uma interface gráfica, uma coleção de agentes, a Internet, ou
talvez todos esse combinados. A reatividade é a capacidade de um agente responder
de uma maneira oportuna à mudanças que ocorre nele e no ambiente.
•
Iniciativa - Possuir iniciativa é a habilidade de exibir comportamento direcionado
ao objetivo, oportunístico e que não reage simplesmente ao seu ambiente.
•
Sociabilidade - significa interagir com outros agentes (e possivelmente humanos)
através de algum tipo de linguagem para comunicação de agente.
•
Racionalidade - é a suposição de que um agente atuará para atingir seus objetivos,
e não atuará de modo que impeça que seu objetivo seja alcançado - pelo menos até
onde sua opinião permitir.
20
•
Percepção - os agentes sentem o mundo e geram conhecimentos acessíveis para
processar o que a razão está dizendo para perceber no mundo.
•
Cooperação - agentes inteligentes precisam ter um "espírito" cooperativo para
existir e ter sucesso em "sistemas orientados a agentes". O que se quer é que agentes
inteligentes trabalhem juntos para que possam executar tarefas mutuamente
benéficas mais complexas .
Dentro das propriedades, tem-se observado que os agentes as possuem em níveis. Por
exemplo: a autonomia de um agente é demonstrada diferentemente de agente para
agente, o que leva a considerar que os agentes apresentam níveis de propriedades. Da
mesma forma que as definições de agente ainda não estão estabelecidas pelo meio
científico de forma homogênea, as propriedades também apresentam esta característica.
As definições das propriedades parecem ser mais convergentes, porém oferecem
margem à várias interpretações. Dependendo das característica que um agente apresenta
ele pode ser classificado em categorias distintas de agentes.
Para poder dizer que um agente é desta ou daquela forma, é necessário que o agente
atenda algumas características peculiares. Por exemplo, para um agente ser considerado
um agente móvel, ele precisa possuir a propriedade de mobilidade. Algumas
classificações de agentes, como agentes inteligentes, agentes autônomos, agentes
reativos, etc, podem ser encontradas no texto [FLE 98].
3.3 Agentes Móveis
Agentes móveis são programas que podem ser disparados em um computador e
enviados para executar em um computador remoto. Chegando no computador remoto
ele apresenta suas “credenciais” e obtêm acesso aos serviços locais e aos dados [LAN
97]. É uma tecnologia emergente que promete tornar sistemas distribuídos mais fáceis
de projetar, implementar e manter. Agentes móveis não estão restritos aos sistemas em
que iniciaram sua execução, pois eles têm a habilidade de se transportar de um sistema
para outro através de uma rede. Este recurso permite a um agente móvel mover-se para o
sistema que possui um objeto com o qual o agente deseja interagir, obtendo a vantagem
de residir na mesma máquina ou rede do objeto.
Agentes móveis podem oferecer um paradigma uniforme para objetos distribuídos,
englobando passagem de mensagens síncronas e assíncronas, passagem de objetos e
objetos móveis e estacionários. Além de suportar os serviços existentes em uma rede,
agentes móveis também tornam possíveis novos serviços e novas oportunidades de
negócios. Características como cooperação, autonomia e representatividade foram
herdadas da própria origem de agentes, entretanto, foram acopladas outras a fim de
suprir as necessidades exigidas para o bom funcionamento de modelos que utiliza o
paradigma de agentes móveis, tais como objetos passantes, assincronismo, interação
local, operações sem conexão e execução paralela. Estas características são definidas
como [LAN 97]:
•
Objetos passantes - quando um agente móvel é transferido, todo o objeto é movido,
ou seja, o código, os dados, o itinerário para chegar ao servidor necessário, o estado
de execução, etc;
21
•
Assincronismo - o agente móvel possui sua própria thread de execução e esse não
precisa ser executado sincronamente;
•
Interação local - o agente móvel interage com outros agentes móveis ou objetos
estacionários locais. Se necessário, um agente mensageiro é enviado para facilitar a
interação com agentes remotos;
•
Operações sem conexão - o agente móvel pode executar tarefas mesmo com a
conexão fechada. Quando se faz necessário transferência de agentes, aguarda-se até
que a conexão seja restabelecida;
•
Execução paralela - múltiplos agentes podem ser disparados para diferentes
servidores a fim de executar tarefas em paralelo.
Apesar de conter semelhanças entre esse novo paradigma e outros métodos de despacho
remoto, os agentes móveis primam por segurança, uma característica fracamente
explorada em sistemas antigos. Isso deve-se, principalmente, ao fato dos sistemas
anteriores não terem sido projetados para utilização em redes geograficamente
distribuídas, sem opções, que hoje fazem parte do cotidiano, como o uso de cartões de
crédito em algum tipo de comércio eletrônico. A nível de segurança os agentes móveis
realizam tarefas relacionadas à autenticação de usuário/servidor e autorização de
serviços no servidor. Aplicações que utilizam os conceitos de agentes seguem o
paradígma atual de funções/procedimentos ou Orientação a Objetos como paradígma de
implementação.
A aplicação cliente é um ambiente de interação com o usuário que utiliza os conceitos
de agentes móveis. Além disso, essa aplicação tem interface com o ambiente agente.
Logo, quando as tarefas são executadas, o ambiente agente de execução envia o agente
móvel, através do subsistema de mensagens. No servidor, ocorre a ação contrária: o
agente é recebido através do subsistema de mensagem e é encaminhado ao ambiente
agente de execução, que deve ser compatível com o ambiente do cliente. Daí, as tarefas
são realizadas a nível de aplicação servidora e se necessário, um agente mensageiro é
disparado.
Segundo [LAN 97], agentes móveis apresentam uma série de vantagens como:
•
Redução do tráfego da rede - Sistemas distribuídos demandam um grande volume
de comunicação (interação) para realizar uma determinada tarefa, principalmente
quando há restrições de segurança envolvidos. Agentes móveis permitem reduzir o
tráfego da rede, pois permitem despachar tarefas que podem executar suas interações
localmente. Agentes móveis podem ainda reduzir o tráfego de dados da rede, pois
permitem mover o processamento para o local onde os dados estão armazenados ao
invés de transferir os dados para depois processá-los. O princípio é simples: "Mover
o processamento para os dados ao invés de mover os dados para o local de
processamento".
•
Oculta a latência da rede - Sistemas críticos necessitam de respostas em tempo real
para mudanças no ambiente. O controle desses sistemas através de uma rede
substancialmente grande ocasiona uma latência inaceitável. Agentes móveis
oferece uma solução, pois podem ser enviados pelo controlador central para
realizarem suas tarefas localmente.
22
•
Encapsulamento de protocolo - Cada máquina em um sistema distribuído possui
seu próprio código necessário para implementar a transferência de dados. Porém,
novos requisitos de segurança e eficiência demandam mudanças no protocolo que
podem ocasionar problemas na manutenção do código existente. Agentes móveis,
por outro lado, podem mover-se para máquinas remotas a fim de estabelecer canais
de comunicação baseados em protocolos proprietários.
•
Execução assíncrona e autônoma - Tarefas podem ser embutidas em agentes
móveis que podem ser enviados pela rede. Após serem enviados, os agentes são
autônomos e independentes da criação de processo, podendo executar
assincronamente. Este recurso é útil principalmente porque um dispositivo móvel
(ex. laptops) pode se reconectar na rede para coletar o agente mais tarde.
•
Adaptação dinâmica - Agentes móveis possuem a habilidade de perceber
mudanças no ambiente de execução e reagir autonomamente. Múltiplos agentes
podem interagir entre si e se distribuir pela rede, de modo a manter uma
configuração ótima para resolver um problema em particular.
•
Independência de plataforma - Redes de computadores, geralmente são
heterogêneas, tanto na perspectiva de hardware como a de software. Agentes móveis
são independentes da máquina e também da rede, sendo dependentes somente do seu
ambiente de execução, não dificultando a integração de sistemas. Mas é necessário
que o ambiente de execução do agente esteja disponível para um determinado
hardware ou software.
•
Robustez e tolerância a falhas - A habilidade dos agentes móveis de reagirem
dinamicamente a situações e eventos desfavoráveis torna fácil a construção de
sistemas distribuídos robustos e tolerantes a falhas. Por exemplo, se uma máquina
está para ser desligada, todos os agentes em execução na máquina podem ser
advertidos para que possam ser enviados e continuar suas tarefas em outra máquina
da rede.
Para comunicação entre os agentes, merece destaque o Protocolo de Transferência de
Agentes (ATP - Agent Transfer Protocol). Este é um protocolo a nível de aplicação para
sistemas distribuídos baseados em agentes. Enquanto agentes móveis podem ser
programados em diferentes linguagens e para diferentes plataformas, através de uma
máquina virtual e de bibliotecas, o ATP oferece a oportunidade de manejar agentes
móveis através de uma forma geral e uniforme.
Uma máquina que suporta agentes tem um serviço de agente baseado em ATP, que é um
componente capaz de enviar e receber agentes de um computador remoto via protocolo
ATP. O serviço de agente é identificado por um endereço único, independente da
plataforma específica de agente suportada pela máquina. Uma máquina pode rodar
múltiplos serviços de agentes. Além disso, uma mensagem ATP carrega informações
suficientes para identificar a plataforma de agente específica, na máquina receptora, e
um gerenciador ATP é chamado para gerenciar a mensagem.
O protocolo ATP é baseado no paradigma de requisição/resposta entre serviços ATP.
Um serviço ATP A estabelece uma conexão com um serviço ATP B, e envia uma
requisição para B esperando uma resposta. ATP/0.1 pode ser obtido no endereço
http://www.trl.ibm.co.jp/aglets/ e faz parte do IBM Aglets Workbench.
23
Além disso, para que os agentes possam se comunicar com outros agentes distribuídos
através da rede, é desejável que eles se comuniquem através de um protocolo comum.
Desta forma, existe um esforço da comunidade científica no sentido de normalizar a
linguagem de comunicação entre os agentes. Uma proposta é a linguagem KQML
(Knowledge Query Manipulation Language) [FIN 94] e um outro para a representação e
intercâmbio do conhecimento adquirido pelos agentes através do formato KIF
(Knowledge Interchange Format). Estes padrões são importantes para haver um
consenso no desenvolvimento de aplicações com suporte a agentes móveis.
A linguagem Java viabilizou a concepção de diversos sistemas experimentais de agentes
móveis. Numerosos sistemas estão atualmente em desenvolvimento ou já
comercializados tais como: Voyager [OBJ 97] [OBJ 98], Aglets [LAN 97] e Concordia
[WONG 97] [CAS 98]. Estes são apresentados no capítulo 4. Os sistemas citados acima
possuem muitas características em comum, como a utilização da máquina virtual Java
padrão, mecanismos de serialização de objetos e arquitetura baseada em servidor.
Contudo, os mecanismos de transporte de agentes e interação variam
consideravelmente. Estas diferenças são apresentadas no capítulo 5.
3.4 Conclusões
Este capítulo apresentou aspectos de mobilidade em sistemas distribuídos,
especialmente envolvendo objetos e agentes. Como a maioria das aplicações
distribuídas que suportam mobilidade são construídas a partir do paradigma orientado a
agente e algumas aplicações consideram o agente um objeto especial, os conceitos da
orientação a objetos são amplamente utilizados por tecnologias que suportam
mobilidade.
Pode-se concluir que não há diferença entre objetos e agentes móveis que justifiquem
um estudo separado destas duas entidades. A filosofia da orientação a objetos é
absorvida pela orientação a agentes, portanto, um agente pode ser considerado um
objeto, mas com autonomia, isto é, pode-se dizer que um agente é uma evolução do
objeto. Um exemplo do uso deste conceito é Voyager [OBJ 97] [OBJ 98]. Esta é uma
tecnologia promissora para desenvolvimento de aplicações com suporte à mobilidade
que considera agente um objeto especial, isto é, que tem autonomia.
O Capítulo 4 apresenta as tecnologias usadas para implementar mobilidade e algumas
aplicações que utilizam mobilidade.
24
4 Tecnologias para Suporte à Mobilidade
Este capítulo apresenta algumas ferramentas usadas para desenvolver sistemas que
suportem mobilidade e alguns ambientes que permitem explorar mobilidade. A seção
4.1 apresenta as ferramentas para suporte à mobilidade, tais como Java [SUN 96], Obliq
[CAR 95] e Oz Distribuído [ROY 97], que são linguagens de programação que
permitem implementar mobilidade. Além disso apresenta CORBA [OMG 95],
destacando sua contribuição para exploração da mobilidade. A seção 4.2 apresenta
alguns ambientes que suportam mobilidade, tais como Voyager[OBJ 97] [OBJ 98],
Aglets [OSH 98] e Concordia [WON 97]. A seção 4.3 apresenta alguns exemplos de
aplicações onde à mobilidade pode ser aplicada. Finalmente, a seção 4.4 apresenta as
conclusões do capítulo.
4.1 Ferramentas para suporte à mobilidade
4.1.1 Java
Java [SUN 96] é uma linguagem orienta a objetos, baseada em classes, criada pela Sun
Microsystems, com ênfase em portabilidade e segurança. O compilador Java transforma
programas fontes em uma linguagem independente de plataforma chamada Java Byte
Code. Este é interpretado pela Java Virtual Machine (JVM) - a implementação do
ambiente computacional Java. Através da rede, a carga das classes é feita através do
ClassLoader. Este é invocado pela JVM quando, na execução de um código corrente,
uma classe que ainda não foi carregada é referenciada. O ClassLoader busca a classe
correspondente, possivelmente de uma máquina remota, e carrega na JVM. Neste
ponto, o código correspondente é executado.
Java foi criada com a concepção de segurança, essencial em um sistema distribuído,
garantindo que regras de acesso sejam sempre respeitadas. Muitos recursos que
requerem controle de acesso dinâmico, como um sistema de arquivo ou um acesso a
rede, são controlados por um monitor chamado SecurityManager.
Um dos fatores de sucesso de Java é o seu uso na Internet. Browsers suportam JVM e
carregam classes chamadas Applet. Estas podem ser carregadas em páginas HTML
permitindo acesso a pequenas aplicações. Sendo assim, um Applet é um tipo de
aplicação em menor escala para executar em um Web Browser. Toda Applet é criada a
partir de uma subclasse da classe Applet. Esta hierarquia determina muito do que a
Applet não pode fazer. Uma Applet executada pela internet é considerada, por default,
código não confiável.
Sendo assim, pode-se concluir que Java possui uma estrutura computacional própria,
que consiste em seu ambiente computacional, isto é, a máquina virtual Java. Através
desta, Java provê suporte aos mecanismos da linguagem que permitem implementar
mobilidade. A sua entidade computacional é o objeto. Além disso, Java explora
mobilidade fraca, do tipo autônoma, pois permite que os programas sejam carregados
dinâmicamente pela rede, através do ClassLoader. Com estas características, Java é a
25
linguagem mais usada para implementar mobilidade. Ainda pode-se observar que
aplicações móveis desenvolvidas através do paradigma de Código em Demanda podem
ser desenvolvidas utilizando Java. Um exemplo do uso deste paradigma em Java é o
Applet, pois este é buscado em um site remoto para ser executado localmente.
Maiores informações sobre a linguagem Java pode ser encontrado em [SUN 96].
4.1.2 Obliq
Obliq [CAR 95] da DEC System Research Center, é uma linguagem com um escopo
léxico, é dinamicamente tipada, baseada em protótipo, projetada para computação
distribuída orientada a objeto. A computação é transparente da rede, isto é, não tem
nenhuma dependência de localização quanto a computação, mas a distribuição é
gerenciada explicitamente à nível de linguagem.
A linguagem tem três principais características:
• A migração de um objetos pode ser programada com a combinação de transmissão
fechada (como se fosse uma caixa preta), apelidos (outro nome para um objeto) e
objeto clone (cópia do objeto). Depois da migração, operações no objeto original
são redirecionadas para o site remoto e executadas nele. A migração pode ser
serializada através das primitivas serialized e protected para que o estado do objeto
não possa trocar durante a chamada migrate.
• Obliq pertence a uma classe de linguagens orientada a objetos chamada “baseada em
protótipo”. Nestas linguagens não existem classes e objetos são criados por cópia
(clone) de objetos existentes (os protótipos);
• Obliq é tipada dinamicamente. Erros com relação aos tipos da linguagem são
descobertos claramente e propagados para o site origem.
São quatro as operações básicas em um objeto: seleção/invocação, atualização, clone e
apelido.
Na seleção/invocação, quando o valor de um objeto é selecionado, este valor é
transmitido através da rede para o site que selecionou. Quando o método de um objeto
remoto é invocado, os argumentos são transmitidos através da rede para o site remoto, o
resultado é realizado no computador remoto, e o valor final é retornado para o site que
invocou.
Na atualização, quando um objeto remoto é atualizado, um valor é transmitido através
da rede para o objeto remoto.
Pode-se notar neste ponto que Obliq suporta o paradigma de Avaliação Remota, pois o
conhecimento vai para onde está o recurso e depois retorna ao site requisitante.
No Clone, uma cópia do objeto é criada, mas a estrutura dos valores é compartilhada.
Por exemplo, os elementos de um vetor são compartilhados entre o clone e o objeto
original. No apelido, atributos podem ser redirecionados para atributos em outros
objetos. Apelidos são usados para criar procuradores.
26
Objetos podem ser protegidos através da palavra protected. Interfaces seguras podem ser
construídas através do uso do mecanismo de proteção e procuradores. Para tratar acessos
concorrentes, Obliq suporta objetos serializados. Um objeto é serializado se mais de
uma thread pode acessar o objeto. Isto é feito usando mecanismos de exclusão mutua,
que é adquirido quando um dos métodos é invocado e solto quando retorna do método.
O escopo léxico oculta valores chamados externamente e o sistema de execução
assegura que o escopo seja cumprido. Comunicações entre servidores independentes são
mediadas através de uma variável global compartilhada contendo o nome do servidor
(endereço IP da máquina por exemplo), permitindo servidores importar e exportar
valores. Para um procedimento ser executado em um servidor distante, o nome do
servidor é solicitado para a máquina de execução (execution engine) receber o
procedimento. Máquina de execução implementa um tipo de ambiente de execução,
permitindo execução remota de procedimentos. Uma thread, que é a unidade de
execução Obliq, pode requisitar a execução de um procedimento em uma máquina de
execução remota. O código para o procedimento é enviado para a máquina destino e
executada nela em uma nova thread. As referências do objeto local usadas pelo
procedimento são automaticamente transformados em referências para rede.
Sendo assim, Obliq suporta mobilidade forte, tanto através de migração quanto através
de clone remoto. No primeiro caso o gerenciamento do espaço de dados se dá através da
remoção das ligações e no segundo através de referências na rede e por cópia. Além
disso, a máquina de execução Obliq oferece um ambiente computacional propício a
exploração da mobilidade e sua entidade base é o objeto.
Maiores informações sobre Obliq pode ser encontrado em [CAR 95].
4.1.3 Oz Distribuído
A linguagem Oz distribuída [ROY 97] é uma linguagem projetada para processamento
simbólico concorrente. O Oz integra vários paradigmas de programação, incluindo
orientação a objetos, funcional e restrições lógicas, em um único modelo.
A semântica distribuída estende a semântica da linguagem através do controle da
mobilidade. Mobilidade em OZ é a habilidade que uma entidade stateful, que pode
mudar seu estado, tem de migrar entre os sites ou de permanecer estacionária entre os
sites, dependendo das intenções do programamador [ROY 97].
A construção do Oz distribuído tem quatro características essenciais [ROY97]: (1) é
uma linguagem concorrente; (2) tem um fluxo de dados sincronizado. Threads são
bloqueadas quando um dado é requisitado por ela mas ainda não está disponível. Este
bloqueio é transparente do ponto de vista da thread; (3) tem procedimentos de primeiraclasse com escopo léxico; (4) tem informação de estados (state-aware), distinguindo
dados stateless (não mudam seus estados e são replicados entre os sites ) e stateful.
A linguagem satisfaz a semântica centralizada garantindo a transparência na rede. Este
requisito requer mecanismo como um espaço de computação compartilhado (shared
computation space) e concorrência (concurrency). O primeiro provê a ilusão de uma
grande memória comum (espaço de endereçamento para as entidades) para todos os
dados. Além disto, um programa que executa em muitos sites deve se comportar da
27
mesma maneira quando executado em um site. Portanto, outro mecanismo necessário é
a concorrência, isto é, várias computações ativas devem coexistir independentemente.
São usados dois mecanismos para identificar a rede: informação de estado (stateawareness) e controle da mobilidade (mobility control). O sistema deve distinguir
entre estas duas formas de dados através de uma informação de estado. Para dados
stateful, é necessário um controle maior da localização. Para isto surge o controle da
mobilidade. Entidades móveis migram para sites remotos invocando estes. Isto é
implementado usando um protocolo para mobilidade [ROY 98].
Pode-se observar neste ponto que OZ Distribuído pode suportar mobilidade forte através
da migração do tipo proativa, onde a unidade migrante determina quando migrar. Sua
entidade base é o objeto. Seu ambiente computacional é a Oz Virtual Machine que,
como em Java, é portável, podendo executar tanto em Unix como em Windows.
A meta do projeto de distribuição é não impedir a implementação centralizada, para isto,
o espaço de computação pode ser representado em termos de dois grafos: o grafo para
linguagem, onde não existe a noção de site e o grafo de distribuição, que faz
explicitamente a noção de site.
A execução distribuída é feita em dois passos: no primeiro passo o espaço
computacional é modelado em um grafo chamado grafo da linguagem. O segundo passo
é estender o grafo da linguagem para o grafo de distribuição, com a noção de site,
introduzindo um conjunto finito de site e colocando em cada nodo o grafo da linguagem
com o site. Se um nodo é referenciado por um nodo em outro site, ele é mapeado para
um conjunto de nodos no grafo de distribuição. Este conjunto é chamado de estrutura de
acesso do nodo o riginal. Uma estrutra de acesso consiste em um conjunto de nodos
globais, um chamado procurador (proxy) pelo site e outro de gerenciador por toda a
estrutura.
As células tem ponteiro para os dados (content-edge), que são conhecidos somente por
um procurador. Os procuradores geralmente não conhecem onde o ponteiro para os
dados está localizado. Se procurador quer fazer uma operação de troca e não tem o
ponteiro para os dados, este deve perguntar ao gerenciador. Isto diminui a latência da
rede.
OZ tem um modelo simples para tolerância a falhas. A detecção de falhas deve
realmente informar ao programador se e onde a falha ocorreu. O modelo suporta
somente falha no site, não suportando falha na rede. Cada espécie de falhas torna-se
visível somente a um procurador, quando este tenta fazer uma operação na célula e
descobre que ocorreu uma falha. O procurador tem então um nodo falho e algumas
mensagens para este são ignoradas. Excepcionalmente é criada uma thread que
inicicializa as operações na célula.
Maiores informações sobre o modelo de programação do Oz distribuído podem ser
encontrados em [ROY 98] e [ROY 97].
4.1.4 CORBA
A organização OMG (Object Management Group) estabeleceu a arquitetura CORBA
(Common Object Request Broker Architecture) [OMG 95] como uma forma de
28
especificar um middleware aberto composto de objetos distribuídos. O objetivo primário
é alcançar sistemas baseados em objetos em ambientes distribuídos heterogêneos com
características de reusabilidade, portabilidade e interoperabilidade.
Em 1990, a OMG criou o OMA (Object Management Architecture) com o objetivo de
fomentar o crescimento de tecnologias baseadas em objetos e fornecer uma infraestrutura conceitual para todas especificações OMG. O OMA é composto por quatro
elementos principais: ORB (Object Request Broker), Serviços de Objetos, Facilidades
Comuns e Objetos de Aplicação. Para este texto, o elemento que merece destaque é o
ORB. Este habilita os objetos enviarem e receberem requisições e, da mesma maneira,
receberem respostas a suas requisições, de forma transparente em um sistema
distribuído. O ORB é a base para a construção de aplicações, utilizando objetos
distribuídos, que possuam características de interoperabilidade entre aplicações em
ambientes heterogêneos ou homogêneos.
A Figura 4.1 dá uma idéia geral da estrutura e dos elementos que compõe o OMA.
FIGURA 4.1 - Arquitetura de Gerenciamento de Objetos (OMA)
O principal objetivo de se definir uma arquitetura comum para ORB's é para se obter a
interoperabilidade entre diferentes implementações. A grande diversidade dessas
implementações mostra que fazê-las interoperar não será tarefa simples, bem como não
foi interconectar redes distintas com diferentes protocolos, por isso, este último vem
sendo usado como modelo para se alcançar o objetivo, a interoperabilidade.
Objetos clientes requisitam serviços às implementações de objetos através de um ORB.
O ORB é responsável por todos os mecanismos requeridos para encontrar o objeto,
preparar a implementação de objeto para receber a requisição, e executar a requisição. O
cliente vê a requisição de forma independente de onde o objeto está localizado, qual
linguagem de programação ele foi implementado, ou qualquer outro aspecto que não
está refletido na interface do objeto.
O primeiro requisito para se obter a interoperabilidade é definir um modelo de alto nível
para que suas diferenças sejam disfarçadas. No caso do ORB esse modelo é uma IDL
(Interface Definition Language). CORBA utiliza a OMG IDL como uma forma de
descrever interfaces, isto é, de especificar um contrato entre os objetos. OMG IDL é
uma linguagem puramente declarativa baseada em C++. E por ser definida
independentemente do ORB, permite que clientes e implementações se comuniquem
transpassando vários ORB's distintos preservando a semântica dos pedidos de forma
transparente para clientes e implementações. Isso garante que os componentes em
29
CORBA sejam auto-documentáveis, permitindo que diferentes objetos, escritos em
diferentes linguagens, possam interoperar através das redes e de sistemas operacionais
[ORF 96].
Para fazer uma requisição, um cliente pode usar a Interface de Invocação Dinâmica (DII
- Dynamic Invocation Interface) ou um Stub de IDL. Para algumas poucas e
determinadas funções, um cliente pode interagir diretamente com a interface do ORB.
O fato de permitir tanto a invocação dinâmica quanto a estática, torna CORBA bastante
flexível. A invocação estática possui uma série de vantagens sobre a invocação dinâmica
[ORF 96]: é mais fácil de programar, faz verificação de tipos mais robusta, executa mais
rápido e é auto-documentável. Já a invocação dinâmica permite a adição de novos
serviços às implementações de objetos sem alterações nos clientes. Dessa forma, os
clientes podem descobrir em tempo de execução quais são os serviços oferecidos.
A invocação dinâmica é possível através dos serviços do Repositório de Interfaces. Um
Repositório de Interfaces é uma base de dados que contém interfaces OMG IDL, e seus
serviços basicamente permitem o acesso, armazenagem e atualização dessas interfaces.
Ao receber uma requisição, o ORB localiza o código da implementação transmite
parâmetros e transfere o controle para a implementação do objeto. Quando a requisição
é completada, o controle e os valores de saída são retornados ao cliente. De forma
parecida ao que ocorre na requisição de um cliente, o ORB pode invocar a
implementação de objeto através de um Esqueleto de IDL Estático ou Dinâmico. A
Interface de Esqueleto de IDL Dinâmica (DSI - Dynamic Skeleton Interface) é uma
forma de se enviar requisições de um ORB para uma implementação de objetos que não
possui informações sobre a implementação do objeto em tempo de compilação.
Para executar a requisição, a implementação de objeto pode obter alguns serviços do
ORB através do Adaptador de Objetos. O Adaptador de Objetos se situa no topo dos
serviços de comunicação do Núcleo de ORB. Ele fornece o ambiente para instanciar
objetos, atribuir referências de objetos, e passar requisições a eles. Com um adaptador
de objetos, é possível a uma implementação de objeto ter acesso a um serviço
independentemente se ele está implementado no Núcleo de ORB — se o Núcleo de
ORB oferecer o serviço, o adaptador simplesmente fornece uma interface para ele, caso
contrário, o adaptador deve implementá-lo no topo do Núcleo de ORB.
Para localizar e ativar implementações de objetos, um ORB se utiliza de Repositórios de
Implementações. Esses repositórios servem adicionalmente para armazenar informações
adicionais associadas com implementações de ORBs, tais como, informações de
depuração, controles administrativos, segurança, dentre outras.
A especificação de interfaces de objetos obrigatoriamente em OMG IDL, garante a
portabilidade dos objetos através de diferentes linguagens, ferramentas, sistemas
operacionais e redes. Entretanto, a característica de interoperabilidade entre objetos só
foi coberta na versão 2.0 do CORBA, introduzida em dezembro de 1994.
O protocolo entre ORBs genérico (GIOP - Generic Inter-ORB Protocol) especifica uma
sintaxe de transferência padrão e um conjunto de formatos de mensagens para
comunicação entre ORBs. O protocolo entre ORBs para Internet (IIOP - Internet InterORB Protocol) especifica como mensagens GIOP são trocadas usando conexões
TCP/IP. Ele especifica um protocolo de interoperabilidade padrão para Internet.
30
O ORB, por si só, não executa todas as tarefas necessárias para os objetos
interoperarem. Ele só fornece os mecanismos básicos. Outros serviços - como serviço
de nomes, de controle de concorrência, de tempo - necessários são oferecidos por
objetos com interface IDL, que a OMG vem padronizando para os objetos de aplicação
poderem utilizar.
Analisando as características CORBA, pode-se observar que suporta o paradigma de
Avaliação Remota, pois através do ORB, objetos podem enviar requisições e receber
suas respostas. CORBA é usado para o desenvolvimento de aplicações que envolvem
objetos distribuídos, isto é, não suporta em sua essência mobilidade. O papel de
CORBA na mobilidade, e também neste texto, advém do fato de que esta tecnologia
serviu de inspiração para várias outras tecnologias que suportam mobilidade. Voyager
[OBJ 97] [OBJ 98], que será visto a seguir, é um exemplo de tecnologia que
implementa mobilidade e que usa uma plataforma ORB, além de permitir integração
com CORBA.
Maiores informações a respeito da tecnologia CORBA pode se encontrada nas
referências [OMG 95] e [ORF 96].
4.2 Ambientes que permitem explorar mobilidade
4.2.1 Voyager
Conforme [GLA 98], ObjectSpace VoyagerTM Core Technology - Voyager [OBJ 97]
[OBJ 98] - consiste de uma plataforma ORB implementado em Java e com suporte a
agentes. É uma plataforma que integra computação distribuída com tecnologia de
agentes, suportando objetos móveis e agentes autônomos. Permite que objetos e agentes
possam enviar mensagens padrão Java para um agente mesmo sem saber sua localização
atual. Além disso, também inclui um conjunto de serviços que implementa, de forma
transparente, persistência, comunicação em grupo e serviço básico de diretório.
Uma das habilidades de Java é carregar classes na máquina virtual em tempo de
execução. Isto habilita uma infra-estrutura para usar objetos móveis e agentes
autônomos bem como ferramentas para construção de sistemas distribuídos. Tem
sintaxe própria para construir, enviar mensagens e mover objetos e agentes e permite
implementar persistência distribuída. Desta forma, Voyager provê suporte para
mobilidade de objetos e agentes, utilizando o modelo de objetos Java.
Voyager permite integração com CORBA desde 1997. Um pacote adicional Java
permite ao Voyager criar uma interface para ser usada em um cliente ou servidor
CORBA. Sem modificação do código, por exemplo, pode-se exportar algumas classes
Java para servidores CORBA, gerando automaticamente IDL para ser usada pela
implementação CORBA.
Redes de computadores são, geralmente, compostas de hardware e sistema operacional
diferentes. Sistemas usando ORBs freqüentemente necessitam código binário em
separado para cada plataforma. Isto aumenta o tempo de desenvolvimento e
complexidade para manutenção do sistema. Como Voyager é implementado em Java,
31
portanto portável, as aplicações são escritas somente uma vez, podendo executar em
cima de qualquer arquitetura que suporte Java.
Resursos em sistemas distribuídos necessitam ser usados sabiamente. Quando uma
máquina está sobrecarregada, parte da carga deve ser levada para uma máquina que não
esteja sobrecarregada. O desenvolvimento somente com ORBs não auxilia aos
programadores resolverem este problema [GLA 98]. Em Voyager, objetos e agentes
móveis podem ser usados para encapsular processamento e migrar através da rede,
levando a carga de trabalho com eles. Sendo assim, voyager permite balanceamento
dinâmico de carga.
Um objeto Voyager é um componente de software que tem um conjunto bem definido
de funções e dados encapsulados.
Quando um programa Voyager inicia, ele automaticamente cria threads que provêem
algum serviço, como garbage collection e verificação do tráfego da rede. Cada
programa Voyager tem um endereço na rede consistindo no nome da máquina e o
número da porta de comunicação, que é um inteiro único para a máquina. Números de
portas são alocados aleatoriamente para os programas. Isto é suficiente para clientes
comunicarem-se com objetos remotos, criar e lançar agentes através da rede. Contudo,
se um programa pode ser endereçado por outro programa, pode-se atribuir um número
de porta conhecido para o programa em inicialização.
Uma classe controla instâncias remotas se sua instância pode ser criada fora do espaço
de endereçamento local do programa e se esta instância pode receber mensagens como
se ela estivesse localmente. Sendo assim, no Voyager, esta classe "esconde" o fato de
estar remota. É importante salientar que fora do contexto Voyager, uma classe remota
não esconde o fato de estar remota. Para simplificar, este trabalho denomina classes
que controlam instâncias remotas como classes remotas. Voyager permite um objeto
comunicar-se com uma instância de uma classe remota através de referências virtuais.
Mensagens enviadas para referências virtuais são automaticamente repassadas para a
instância da classe remota. Se uma mensagem retorna um valor, o objeto receptor envia
o valor de retorno para a referência virtual, que retorna este valor para o emissor.
Após a criação de uma classe remota, pode-se construir instâncias remotamente,
mesmo se o código da classe não exista na máquina remota; enviar mensagens para
instâncias remotas usando uma sintaxe Java regular; conectar instâncias remotas
existentes em outros programas; mover instâncias remotas para outros programas,
mesmo se o código da classe não esteja no programa destino e construir instâncias
remotas persistentes.
Depois de criar uma classe remota, pode-se criar instâncias remotas da classe original
(objetos remotos). As instâncias remotas podem residir no programa corrente ou num
programa diferente, e uma referência virtual para a instância remota é criada no
programa corrente. Para construir uma instância remota de uma classe, dá-se ao
construtor de classes virtuais o endereço do programa destino onde a instância remota
deve residir. Se o código original da classe para a instância remota não existir no
programa destino, Voyager carrega automaticamente o código da classe original no
programa destino.
Neste ponto nota-se que Voyager suporta o paradigma de Código em Demanda.
32
Quando um objeto remoto é criado, é automaticamente atribuído a ele um identificador
global único, que identifica o objeto em todos os programas da rede. Opcionalmente,
pode-se atribuir um alias para um objeto remoto durante a criação. O identificador ou o
alias podem ser usados para localizar ou conectar o objeto em qualquer ponto da rede.
Um objeto remoto pode ser referenciado por qualquer número de referência virtual.
Para criar uma nova referência virtual e associa-la com o objeto remoto existente, devese fornecer o endereço do programa onde o objeto remoto existente reside e o seu alias
para o método VObject.forObjectAt( ).
Quanto à mobilidade, pode-se mover qualquer objeto serializado de um programa para
outro enviando a mensagem moveTo( ) para o objeto via refêrencia remota, fornecendo o
endereço do programa destino como parâmetro. Mobilidade é a habilidade de mover-se
independentemente de um dispositivo para outro através da rede [GLA 98].
Uma mensagem pode ser enviada para um objeto mesmo que o objeto tenha-se movido
de um programa para outro, simplesmente enviando a mensagem para o objeto no
último endereço conhecido. Quando a mensagem não localiza o objeto destino, a
mensagem procura por um retransmissor representando o objeto. Se um retransmissor é
localizado, este envia a mensagem para o objeto na nova localização. O valor retornado
é marcado como a nova localização do objeto remoto, para que a referencia virtual possa
atualizar a localização do objeto. Após isto, mensagens são enviadas diretamente para a
nova localização do objeto, sem necessitar do retransmissor.
Mobilidade é útil porque os objetos que trocam grande número de mensagens podem
ser movidos para junto um do outro, reduzindo assim o tráfego na rede. Um programa
pode mover objetos dentro de um dispositivo móvel. Assim o programa pode
permanecer com o dispositivo depois de ele ser desconectado da rede.
Analisando o texto até o momento, observa-se que Voyager também pode dar suporte ao
desenvolvimento através do paradigma de Avaliação Remota. Sendo assim, os objetos
podem mover-se para onde está o recurso.
Voyager também suporta agentes móveis. A filosofia do Voyager é que o agente é
simplesmente uma espécie especial de objeto que pode mover-se independentemente,
podendo continuar sua execução ao se mover, e no entanto comportar-se exatamente
como qualquer outro objeto. Um agente é um tipo especial de objeto pois ele tem
autonomia, isto é, ele é um objeto que pode existir mesmo sem ter uma referência para
ele. Um agente autônomo pode ser programado para satisfazer uma ou mais metas,
mesmo se, ao mover-se, perder contato com seu criador.
Neste ponto fica claro que não há diferença entre objetos e agentes móveis que
justifiquem um estudo separado destas duas entidades. A filosofia da orientação a
objetos é absorvida pela orientação a agentes, portanto, um agente pode ser considerado
um objeto, mas com autonomia, isto é, pode-se dizer que um agente é uma evolução do
objeto.
Um agente em Voyager suporta, além da autonomia, mobilidade. Além disso, um agente
tem todas as características de um objeto simples: pode ser atribuído um alias,
referências virtuais, comunicação com objetos remotos, etc. Sendo assim, um agente
pode mover-se de um programa para outro. Mas, diferentemente de objetos simples, um
agente pode mover-se de forma autônoma.
33
Através dos agentes, nota-se que Voyager também suporta o desenvolvimento de
aplicações através do paradigma de Agentes Móveis. Além disso, pode implementar
uma mobilidade forte através da migração destes agentes.
Existem várias vantagens em usar agentes móveis em Voyager:
•
Se uma tarefa tem que ser desempenhada independentemente do computador que a
inicializou, um agente pode ser criado para desempenhar esta tarefa. Ele pode
mover-se dentro da rede e completar a tarefa num programa remoto;
•
Se um programa precisa enviar um grande número de mensagens a objeto em
programas remotos, um agente pode ser construído para visitar cada programa e
enviar mensagens localmente;
•
Para particionar um programa e tê-lo executando em paralelo, o processamento pode
ser distribuído por vários agentes que migram para programas remotos e se
comunicam para atingir a meta final. Se um objeto remoto precisa ser monitorado
periodicamente, ter um agente que o encontra e o monitora localmente é mais
eficiente que monitorá-lo através da rede.
Voyager suporta persistência. Um objeto persistente tem uma cópia backup na base de
dados, chamada VoyagerDb, e é automaticamente recuperado se o seu programa
termina inesperadamente.
Maiores informações a respeito da tecnologia Voyager pode ser encontrada em [OBJ 97]
e [OBJ 98].
4.2.2 Aglets
Aglets [IBM 97] são objetos Java com a capacidade de se mover de uma máquina para
outra em uma rede, levando consigo o código de programa e o estado dos objetos que
compõe o Aglet. Este é um agente móvel porque suporta a idéia de execução autônoma
e rota dinâmica de seu etinerário. A biblioteca de classes de um Aglet tem os seguintes
objetivos:
• fornecer um modelo simples de programação utilizando agentes móveis, sem no
entanto implicar em modificação na JVM ou em código nativo;
• disponibilizar mecanismos de comunicação poderosos e dinâmicos que
permitam agentes se comunicarem com outros agentes;
• projetar uma arquitetura de agentes móveis que permita extensibilidade e
reusabilidade;
• obter uma arquitetura altamente coerente com o modelo tecnológico Web/Java.
A biblioteca Aglets/API (J-AAPI - Java Aglet Application Programming Interface) é
uma proposta padrão para criar Aglets. Contém métodos para inicialização, mensagens,
movimento, ativação/desativação, etc. Plataformas escritas com estas bibliotecas podem
ser escritas e executadas em qualquer computador que suporte a interface para Aglet. O
modelo define um conjunto de abstrações e de comportamento necessários para que a
tecnologia de agentes móveis seja usada na Internet. As principais abstrações do modelo
34
são o Aglet, o contexto, o procurador, a mensagem, o itinerário e o identificador, como é
visto a seguir:
• Aglet - é o elemento básico da biblioteca e consiste em um objeto Java móvel
autônomo (pois possui sua própria thread de execução) e reativo pois pode
responder a mensagem externas.
• Contexto (context) - é um objeto estacionário que provê um ambiente para
manutenção e gerenciamento de aglets em execução.
• Procurador (proxy) - é um objeto que representa um Aglet, e tem por objetivo
fornecer transparência de localidade e proteção a métodos públicos.
• Mensagem (message) - é um objeto transmitido entre Aglets, permitindo passagem
de mensagens síncronas e assíncronas, usados para colaboração e troca de
informações.
• Itinerário (itinerary) - é o plano de viagem do Aglet. Isto provê uma conveniente
abstração de padrões de viagens e rota.
• Identificador (identifier) - cada aglet possui um único e global identificador que é
imutável durante todo seu ciclo de vida.
O modelo Aglet provê comportamentos essenciais com relação a um agente tais como:
criação, clonagem, envio, retirada, desativação, ativação, liberação, mensagem e
nomeação [LAN 97].
A criação de um Aglet coloca ele no contexto. Ao novo Aglet é atribuído um
identificador, inserido no contexto e inicializado. O Aglet começa a execução assim que
ele seja inicializado com sucesso. A clonagem produz uma cópia quase idêntica do
Aglet original no mesmo contexto. Somente há diferença na atribuição do identificador
e o fato da execução reiniciar em um novo Aglet. Com isto, a thread em execução não é
clonada. O envio de um Aglet de um contexto para outro remove ele do contexto
corrente e insere dentro do contexto destino, onde a execução da thread é reinicializada.
Sendo assim, embora Java suporte mobilidade fraca, a biblioteca Aglet suporta
mobilidade forte através de migração, pois como colocado no parágrafo acima, o envio
de um Aglet tira ele de um contexto e o coloca em outro. Além disso, o contexto pode
ser considerado o ambiente computacional que dá suporte à mobilidade dos agentes em
Aglet. A entidade base do Aglet é o agente.
A retirada de um Aglet remove ele do contexto corrente e o insere dentro do contexto ao
qual a retirada foi requisitada. A desativação de um Aglet remove temporariamente do
contexto corrente e o coloca em um armazenamento secundário. A ativação restaura o
Aglet para o contexto corrente. A liberação de um Aglet pára a execução corrente e o
remove do contexto corrente. Mensagens entre Aglet envolvem envio, recebimento e
parada de mensagens síncronas bem como assíncronas. O mecanismo de nomeação
automático atribui um identificador imutável para um novo Aglet.
Voyager utiliza o protocolo ATP (Agente Transfer Protocol), abordado no Capítulo 3,
para a comunicação e transferência de agentes entre os contextos.
35
Quanto a segurança dos agentes, o Modelo de Segurança Aglet provê vários framework
para segurança em Aglet. Como Aglets são objetos Java que podem migrar de uma
máquina para outra, eles tem um potencial de acesso para todos os recursos da máquina.
Eles também confiam na segurança do interpretador Java para sua própria execução.
Assim, segurança em Aglet e segurança em Java andam juntas.
Maiores informações sobre Aglet podem ser encontradas em [IBM 97] , [OSH 98] e
[LAN 97].
4.2.3 Concordia
O Concordia [WONG 97] [CAS 98], concebido pela Mitsubishi constitui-se de um
framework para o desenvolvimento e gerenciamento de aplicações de agentes móveis.
O Concordia compreende múltiplos componentes, todos escritos em Java, na qual são
combinados para prover um ambiente para aplicações distribuídas. Este sistema é
simples, e requer somente uma implementação padrão do servidor Concordia, feito em
cima da máquina virtual Java, e seu ambiente é composto de um servidor e um conjunto
de agentes. O agente é também um programa Java que é gerenciado pelo servidor
Concordia. Cada agente está associado a um usuário particular e carrega uma
especificação que contém o caminho de migração e o método a ser executado em cada
máquina. Nota-se que a entidade base do Concordia é o agente.
Quanto a arquitetura do sistema, cada nodo num sistema Concordia consiste em um
servidor Concordia e provê serviços básicos para criação, migração, execução,
comunicação e administração de agentes móveis. O servidor pode ser executado em uma
ou mais máquinas virtuais Java. A figura 4.5 mostra como é formada a arquitetura do
Concordia [WON 97].
Java Virtual Machine
Security
Manager
Administration
Manager
Agents
Persistent
Manager
Event
Manager
remote queue
managers
Conduit
Manager
Queue
Manager
remote conduit
servers
Corporate
DB server
FIGURA 4.5 - Arquitetura do Concordia
36
O Servidor Concordia é um componente completo, instalado e executando em uma
rede Concordia. O servidor é o ambiente computacional necessário para a computação,
permitindo que à mobilidade seja explorada através das estruturas contidas dentro do
ambiente.
O Gerenciador de Agentes provê a infra-estrutura de comunicação que permite aos
agentes serem transmitidos e recebidos pelos nodos da rede. Além disso, gerencia o
ciclo de vida do agente, provê suporte à mobilidade e interface para administração
(inclusive remota) dos serviços do servidor Concordia.
À mobilidade do agente é transparente para os usuários do sistema. A viagem do agente
é descrita através de um itinerário. Este é composto de múltiplos destinos. Cada destino
descreve a localização do agente na viagem e o trabalho que o agente realiza nesta
localização. A localização pode ser definida pela identificação da máquina na rede e o
trabalho através dos métodos manipulados pelo agente.
O Concordia usa uma infra-estrutura similar a Java para mobilidade dos agentes.
Durante a viagem de um agente através da rede, seu byte code e o byte code de alguns
objetos são carregados via uma classe especial chamada ClassLoader. Neste pacote, o
byte code contém uma estrutura de dados que viaja com o agente. Durante a
deserialização do agente, o byte code para o agente e suas classes podem ser
recuperadas e usadas para inicializar uma nova copia do agente.
Pode-se notar que Concordia permite uma mobilidade fraca do tipo autônoma,
semelhante a Java, pois permite que os programas sejam carregados dinâmicamente pela
rede, através do ClassLoader.
Concordia dá suporte a duas formas de comunicação inter-agente: eventos assíncronos
distribuídos e colaboração entre agentes. Eventos assíncronos distribuídos são
escalonados e gerenciados pelo Gerenciador de Eventos, enquanto a colaboração entre
agentes requer que o programador da aplicação agente especifique um objeto
AgentGroup através da utilização da biblioteca de classes Concordia. A colaboração
entre agentes permite a interação entre agentes, colaboração num grupo (agentes podem
enviar eventos para outros agentes ou para aplicação pai).
Persistência em agentes é um requisito que assegura recuperação do agente em caso de
falha. A persistência é oferecida através do Gerenciador de Armazenamento
Persistente, permitindo a reinicialização do agente quando ocorrer uma falha ou até
mesmo a reinicialização do servidor Concordia. A implementação do Gerenciador de
Armazenamento Persistente é baseada na serialização de objetos Java.
Agentes em Concordia são móveis e sua mobilidade pode extender-se tanto em redes
locais como na Internet. O Gerenciador de Filas é responsável pelo controle de
prioridades na execução de agentes, e também pela migração de agentes, garantindo um
nível de tolerância a falhas através do armazenamento do agente antes de transmití-lo
(store-and-forward).
O modelo de segurança Concórdia provê suporte para dois tipos de proteção: (1)
proteção contra agentes com origem falsificada e (2) proteção dos recursos do servidor
contra acessos não autorizados. Agentes são protegidos contra falsidade quando são
armazenados no sistema cliente e quando são armazenados na base de dados persistente.
Esta proteção é feita através de criptografia. Sendo assim, garante a proteção do agente
37
no armazenamento e na migração, além de autenticar a origem do agente. O
Gerenciador de Segurança gerencia os recursos de proteção. A cada agente é atribuído
uma identificação, permitindo ao agente acessar os recursos.
A administração do sistema Concordia é feita pelo Gerenciador de Administração.
Este inicializa e termina os servidores do sistema de agentes. Ele também gerencia a
troca de política de segurança entre os agentes e os servidores fazendo uma requisição
do comportamento do agente ou do servidor para o Gerenciador de Seguraça. Além
disso, monitora o comportamento dos agentes através da rede, provêndo estatísticas
sobre isto.
O Gerenciador de Diretório permite aos agentes móveis localizar os servidores de
aplicação para interação. O sistema pode ser configurado para incluir um ou mais
gerenciador de diretórios. Além disso, registra os serviços de aplicações disponíveis na
rede e disponibiliza uma operação de lookup para os agentes que estão a procura de
serviços para interagir.
As Pontes de Serviço possibilitam que os agentes e/ou aplicações acrescentem serviços
ao servidor Concordia, aumentando a funcionalidade e a interação do servidor com os
agentes.
Em Concordia fica muito claro a concepção de um ambiente computacional, assim
como em Java. Este ambiente, além de permitir mobilidade, oferece segurança, acessos
autorizados, confiança etc.
Maiores Informações sobre Concordia podem ser encontradas nos textos [WONG 97] e
[CAS 98].
4.3 Aplicações
São várias as aplicações que podem ser desenvolvidas
mobilidade. Entre elas:
utilizando tecnologia de
• Recuperação de informações distribuídas - estas informações são recuperadas de
acordo com algum critério específico. O informação a ser recuperada pode ser
definida estaticamente ou dinâmicamente durante o processo de recuperação. Sendo
assim, um agente, por exemplo, pode ser encarregado de viajar pela rede, obtendo as
informações a serem recuperadas;
• Serviços avançados de telecomunicações - o suporte e o gerenciamento de serviços
como vídeo conferência, telemarketing, etc, requerem mecanismos de reconfiguração
dinâmica e customização do uso. O uso de mobilidade permite o desenvolvimento
destes serviços. Por exemplo, uma aplicação que gerencia a sinalização, o sinal e
apresentação de um serviço de vídeo conferência pode ser despachado pelos usuários
através de um agente;
• Controle e configuração de dispositivos remotos - a tecnologia de código móvel
pode ser usada para projetar e implementar componentes de monitoramento que estão
localizados nos dispositivos a serem monitorados e transmitir eventos que
representem a evolução do estado do dispositivo. O estudo de caso do gerenciamento
de uma rede é apresentado em [FUG 98];
38
• Gerenciamento de Workflow - o workflow define que atividades devem ser
carregadas para serem cumpridas em uma determinada tarefa bem como de que
maneira, onde e quando estas atividades envolvem cada parte. Código móvel pode
ser usado para prover suporte à mobilidade de atividades que encapsulem suas
definições e seu estado. Por exemplo, um componente móvel pode encapsular um
documento texto que suporta várias versões. O componente gerência a informação
sobre o estado do documento, que operações foram feitas, e qual o próximo passo
para revisão;
• Comércio Eletrônico - aplicações de comércio eletrônico permitem usuários
desenvolver aplicações comerciais através da rede. Uma transação pode envolver
negociação com entidades remotas e requisição de informações. Portanto, é desejável
que o componente móvel da aplicação sé forneça informações relevantes para o
negócio. Aplicações deste tipo podem ser implementadas com a tecnologia de
agentes móveis.
4.4 Conclusões
Este capítulo apresentou as tecnologias usadas para desenvolver sistemas que suportem
mobilidade, bem como as aplicações que podem ser desenvolvidas. Foram apresentadas
as linguagens Java, Obliq e Oz Distribuído. Estas foram apresentadas com o objetivo de
mostrar alternativas, a nível de linguagem, para o desenvolvimento de aplicações que
exploram mobilidade. O texto [THO 97] apresenta uma comparação de várias
linguagens que implementam código móvel.
Além disso, foi apresentado CORBA, Voyager, Aglets e Concordia. Estes podem ser
considerados middleware para o desenvolvimento de aplicações que permitem
mobilidade. É importante destacar o aspecto de contribuição de CORBA, já que ele por
si só não permite mobilidade. Como ele é usado para implementar objetos distribuídos,
vários conceitos de CORBA são usados em outros middleware para o desenvolvimento
de aplicações. Também foi apresentado alguns exemplos de aplicações onde à
mobilidade pode ser aplicada.
Este capítulo procurou também destacar, nas tecnologias, aspectos que permitissem
classifica-las conforme a proposta de [FUG 98], apresentada no capítulo 2.
Relembrando, esta proposta aborda uma estrutura conceitual para compreender código
móvel, apresentando um conjunto de termos e conceitos para compreender e comparar
as abordagens baseadas na noção de código móvel, através de mecanismos e paradigmas
que auxiliam o desenvolvimento de aplicações para código móvel. Tanto os
mecanismos quanto os paradigmas foram destacados nas tecnologias apresentadas neste
capítulo.
Pode-se concluir também as várias vantagens no desenvolvimento de sistemas que
permitem mobilidade. Destacam-se:
•
possibilidade de operações desconectadas, permitindo que a computação seja
realizada mesmo quando não se está conectado na rede;
•
diminuição do tráfego da rede, aproximando a entidade computacional do recurso;
39
•
possibilidade de coleta de estatísticas e dados sobre a rede e/ou funcionamento de
aplicações distribuídas;
•
personificação de uma transação ou cliente, permitindo que informações específicas
sejam coletadas.
Observando as várias vantagens e possibilidades de desenvolvimento de aplicações,
nota-se que elas estão mais de acordo com o desenvolvimento utilizando agentes
móveis, devido a suas características, já destacadas no capítulo 3. Por isto, a grande
maioria das tecnologias que permitem mobilidade suportam o desenvolvimento de
aplicações através de agentes móveis ou são especificamente para este tipo de aplicação.
O capítulo 5 apresenta uma comparação das diversas tecnologias apresentadas
relacionando-as aos conceitos e paradigmas apresentados no capítulo 2.
40
5 Análise Comparativa das Tecnologias que Suportam
Mobilidade
Este capítulo apresenta uma análise comparativa das tecnologias apresentadas no
Capítulo 4, tendo como base a proposta de organização da área de mobilidade
apresentada no texto [FUG 98], descrita no capítulo 2.
A análise será dividida em duas tabelas que comparam aspectos de mobilidade. A
primeira (Tabela 1), compara algumas ferramentas que permitem implementar
ambientes para explorar mobilidade. A segunda, Tabela 2, faz comparações ambientes
que permitem desenvolver aplicações com mobilidade.
5.1 Análise comparativa das ferramentas
TABELA 1 - Ferramentas para suporte à mobilidade
Ferramentas
Características
Entidade computacional base objeto
Java
Obliq OZ dist. CORBA
X
X
X
X
Permite Objetos Distribuídos
X
X
X
X
Permite implementar mobilidade
X
X
X
Mobilidade através de objetos móveis
X
X
X
X
X
X
X
X
X
X
X
Entidade computacional base agente
Mobilidade através de agentes móveis
Explora mobilidade forte
Explora mobilidade fraca
X
Paradigma de Avaliação Remota
Paradigma de Código em Demanda
X
X
Paradigma de Agentes Móveis
Possui ambiente computacional
X
Mecanismos de serialização de objetos
X
Mecanismos de segurança
X
X
41
Com relação a Tabela 1, observa-se que todas as ferramentas tem como entidade
computacional base o objeto. Mesmo que permitam implementar agentes, a concepção
base é o objeto.
Todas as ferramentas permitem o desenvolvimento de aplicações usando objetos
distribuídos, mas somente Java, Obliq e Oz Distribuído permitem implementar algum
tipo de mobilidade, através de objetos móveis. CORBA não suporta em sua essência
mobilidade, embora tenha servido de inspiração para várias outras tecnologias que
suportam mobilidade. Um exemplo disto é o fato de Voyager suportar integração com
CORBA, além de ter em sua implementação uma base ORB.
Quanto ao tipo de mobilidade, Java explora mobilidade fraca, do tipo autônoma, pois
permite que os programas sejam carregados dinâmicamente pela rede, através do
ClassLoader. Já Obliq e OZ Distribuído permitem mobilidade forte. Obliq suporta
mobilidade forte, tanto através de migração quanto através de clone remoto. No
primeiro caso o gerenciamento do espaço de dados se dá através da remoção das
ligações e no segundo através de referências na rede e por cópia. Por outro lado, OZ
suporta mobilidade forte através da migração do tipo proativa, onde a unidade migrante
determina quando migrar. CORBA, como "não permite" mobilidade, não pode ser
classificada.
Quanto aos paradigmas suportados, Java suporta Código em Demanda, sendo que
Obliq, OZ Distribuído e CORBA suportam o paradigma de Avaliação Remota. Um
exemplo de Código em Demanda na linguagem Java é o Applet, pois este é buscado em
um site remoto para ser executado localmente. Em Obliq, o conhecimento vai para onde
está o recurso e depois retorna ao site requisitante. Já em OZ, a construção do grafo da
linguagem e do grafo de distribuição permitem ligações dinâmicas com o proxy, o
gerenciador e o content-edge.
Para explorar mobilidade, uma ferramenta deve possuir um ambiente computacional que
de suporte para que as entidades possam executar, além de permitir segurança. Java
possui uma estrutura computacional própria, que consiste em seu ambiente
computacional, isto é, a máquina virtual Java. Através desta, Java provê suporte aos
mecanismos da linguagem que permitem implementar mobilidade. O ambiente
computacional de Obliq é representado na sua máquina de execução. Já em OZ, seu
ambiente computacional é a Oz Virtual Machine que, como em Java, é portável,
podendo executar tanto em Unix como em Windows.
Todas as ferramentas oferecem algum tipo de segurança. Em Java, a segurança foi
preocupação desde a sua criação, garantindo que regras de acesso sejam sempre
respeitadas. Muitos recursos que requerem controle de acesso dinâmico são controlados
por um monitor chamado SecurityManager. Em Obliq, a segurança é garantida pelo
escopo léxico da linguagem que oculta valores chamados externamente. Além disso, o
sistema de execução assegura que o escopo seja cumprido. OZ tem um modelo simples
para tolerância a falhas, suportando somente falha no site, não suportando falha na rede.
42
TABELA 2 - Ambientes para explorar mobilidade
Ambientes
Características
Voyager Aglet Concordia
Entidade computacional base objeto
X
Entidade computacional base agente
X
X
X
Possui ambiente computacional
X
X
X
Suporta desenvolvimento em Java
X
X
X
Permite implementar mobilidade
X
X
X
Mobilidade através de objetos móveis
X
Mobilidade através de agentes móveis
X
X
X
Explora mobilidade forte
X
X
Explora mobilidade fraca
X
Paradigma de Avaliação Remota
X
Paradigma de Código em Demanda
X
Paradigma de Agentes Móveis
X
X
X
Mecanismos de serialização de objetos
X
X
X
Mecanismos de transporte e interação de agentes
X
X
X
X
Mecanismos para controle de prioridade
X
Permite implementar persistência
X
Mecanismos de segurança
X
X
X
X
A Tabela 2 compara ambientes que permitem o desenvolvimento de aplicações que
suportam mobilidade. Observando a Tabela, nota-se que Voyager tem um ambiente bem
mais completo que Aglet e Concordia.
Quanto a entidade computacional base, somente Voyager suporta objetos e agentes
móveis, pois neste ambiente, um agente é considerado um objeto, mas com autonomia.
Aglet e Concordia suportam somente agentes móveis.
Todos os ambientes possuem um ambiente computacional. Este fato é natural, pois para
dar suporte a execução das entidades computacionais distribuídas, mesmo que não
suporte mobilidade, cada máquina envolvida na distribuição deve suportar o ambiente
computacional necessário para que as entidades possam ser executadas. Um exemplo é a
máquina virtual Java. Para que um programa Java execute, é necessário que a máquina
virtual esteja presente. A questão do ambiente computacional é essencial para permitir
43
mobilidade. O que pode ser uma limitação, pois a entidade computacional só pode
mover-se para uma máquina onde o ambiente esteja presente ou que possa ser
inicializado.
Uma questão interessante, é que todos os ambientes suportam desenvolvimento em Java
(até porque são desenvolvidos em Java). Isto vem destacar o papel de Java como
linguagem principal para implementar mobilidade. O artigo [THO 97] destaca que Java
é a linguagem mais importante para desenvolvimento de aplicações que suportem
mobilidade, por ser portável e segura. Neste artigo encontra-se a descrição de algumas
linguagens para comparações quanto à mobilidade. Java é a linguagem que mereceu
maior atenção quanto a descrição e comparação.
Todos os ambientes permitem implementar mobilidade. Voyager suporta mobilidade
fraca e forte. A primeira é caracterizada, assim como Java, pela capacidade de carregar
classes para dentro de uma máquina virtual em tempo de execução. Sendo assim, o
código para uma determinada tarefa pode ser carregado a medida que for necessário para
a computação. À mobilidade forte é caracterizada pelo suporte a agentes móveis, pois
eles devem levar consigo sua “consciência”, isto é, ocorre uma espécie de migração,
embora eles possam construir esta “consciência” durante seu tempo de vida carregando
classes em tempo de execução. Aglet suporta mobilidade forte através de migração, pois
o envio de um Aglet tira ele de um contexto e o coloca em outro. Já Concordia permite
uma mobilidade fraca do tipo autônoma, semelhante a Java, pois permite que os
programas sejam carregados dinâmicamente pela rede, isto é, durante a viagem de um
agente através da rede, seu byte code e byte code de alguns objetos são carregados
através da classe ClassLoader.
Quanto aos paradigmas, Voyager suporta todos os tipos de paradigmas estudados, isto
é, Código em Demanda, Avaliação Remota e Agentes Móveis. O primeiro paradigma é
caracterizado pelo fato de Voyager permitir criar instâncias remotas de uma classe,
sendo que se o código original da classe para a instância remota não existir no programa
destino, Voyager carrega automaticamente o código da classe original para este. A
Avaliação Remota é caracterizada em Voyager porque este permite que os objetos
movam-se para onde está o recurso. O paradigma de Agentes Móveis é caracterizado
pelo fato de Voyager suportar agentes móveis. Como Aglet e Concordia suportam
somente agentes móveis, permitem desenvolver aplicações através do paradigma de
Agentes Móveis.
Voyager, Aglet e Concordia contém mecanismos de segurança. Como todos são
baseados em Java, herdam as características de segurança e portabilidade de Java, além
de mecanismos específicos de cada ambiente. Em Voyager a segurança é mantida
através do Voyager Security Manager, que restringe as operações de objetos estranhos
dentro do ambiente. Em Aglet, a segurança é mantida através do modelo de segurança
Java, isto é, através do interpretador e da máquina virtual Java. Em Concordia, existe o
Gerenciador de Segurança que gerencia os recursos de proteção.
44
5.2 Conclusões
Este capítulo apresentou uma análise comparativa das tecnologias apresentadas neste
texto (Capítulo 4). Esta análise foi feita tendo como base a taxonomia apresentada no
texto [FUG 98], descrita no capítulo 2. A análise foi dividida em duas tabelas. A Tabela
1 procurou comparar aspectos de mobilidade em ferramentas que serviram como base
para implementação de ambientes que permitem explorar mobilidade. A Tabela 2
comparou aspectos de mobilidade nestes ambientes.
Na Tabela 1, foram comparadas as ferramentas Java, Obliq e Oz distribuído, que são
linguagens de programação, e CORBA. Procurou-se nestas estudar aspectos referentes a
entidade computacional base da ferramenta, suporte a objetos distribuídos, suporte a
implementação de mobilidade através de objetos e/ou agentes móveis, tipo de
mobilidade explorada (forte ou fraca), paradigma suportado (Avaliação Remota, Código
em Demanda e Agentes Móveis), ambiente computacional para suporte à computação e
mecanismos de segurança.
Na Tabela 2 foram comparados os ambientas Voyager, Aglet e Concordia. Comparou-se
aspectos considerados importantes (alguns semelhantes aos analisados quanto as
ferramentas) com relação a ambientes que suportam mobilidade, tais como entidade
computacional base, presença de ambiente computacional, suporte a desenvolvimento
em Java, mobilidade através de objetos e/ou agentes móveis, tipo de mobilidade,
paradigma suportado e mecanismos de segurança.
É importante observar que a exploração da mobilidade envolve muito a questão da
localização. Uma premissa básica é que o usuário não necessita saber onde a sua
computação está sendo desenvolvida, pois a aplicação deve abstrair aspectos de
localização do usuário. Como a computação é distribuída através da rede, a integridade
desta computação deve ser preservada, portanto a segurança é um fator muito
importante.
Todos os aspectos, em cada Tabela, foram comentados e observados como ocorre nas
ferramentas/ambientes analisados. Pode-se concluir que entidade computacional base,
ambiente computacional, tipo de mobilidade e paradigma suportado são aspectos
importantes a serem levados em consideração na necessidade de escolha da
ferramenta/ambiente para desenvolvimento de aplicações que suportam mobilidade.
O capítulo 6 apresenta as conclusões do trabalho.
45
6 Conclusão
Este trabalho apresentou um estudo sobre mobilidade em sistemas distribuídos. Foi
apresentado que os estudos sobre mobilidade intensificaram-se com o uso cada vez
maior de aplicações que utilizam a Internet, podendo-se assim explorar mobilidade
através de redes heterogêneas, conectadas por diferentes links de comunicação e
distantes uma das outras. Estas aplicações, geralmente são construídas utilizando-se
objetos e/ou agentes. Sendo assim, no âmbito deste trabalho, um dos fatores principais
no desenvolvimento destas aplicações diz respeito à mobilidade destas entidades.
O Capítulo 2 apresentou os fundamentos que envolvem os estudos em mobilidade,
necessários para compreender o universo que envolve as aplicações que utilizam
mobilidade. O conceito de mobilidade ainda não é consenso entre a comunidade
científica, embora sejam unânimes em que a entidade envolvida na computação deve ter
o potencial de deslocar-se entre o sistema distribuído, podendo mover-se de um
ambiente computacional para outro. Além disso, o Capítulo apresentou uma taxionomia
proposta em [FUG 98], envolvendo conceitos e paradigmas, buscando a compreensão
das abordagens baseadas em código móvel.
O Capítulo 3 apresentou aspectos de mobilidade em sistemas distribuídos, orientação a
objetos, orientação a gentes e agentes móveis. Como a maioria das aplicações
distribuídas que suportam mobilidade são construídas a partir do paradigma orientado a
agente e algumas aplicações consideram o agente um objeto especial, os conceitos da
orientação a objetos são amplamente utilizados por tecnologias que suportam
mobilidade. Sendo assim, a conclusão mais importante deste Capítulo é que não há
diferença entre objetos e agentes móveis que justifiquem um estudo separado destas
duas entidades. A filosofia da orientação a objetos é absorvida pela orientação a agentes,
portanto, um agente pode ser considerado um objeto, mas com autonomia.
No Capítulo 4 foi apresentada algumas tecnologias usadas para desenvolver sistemas
que suportem mobilidade, procurando sempre destacar aspectos que permitissem
classificá-las bem como as aplicações que podem ser desenvolvidas. Foram
apresentadas as linguagens Java, Obliq e Oz Distribuído como ferramentas que
permitem implementar mobilidade. Além disso, foi apresentado CORBA destacando
seu aspecto de contribuição para área de mobilidade, onde vários de seus conceitos são
usados em outros middleware para o desenvolvimento de aplicações. Também foram
apresentados alguns exemplos de aplicações onde à mobilidade pode ser aplicada.
A maior contribuição do Capítulo 4 foi a identificação das várias vantagens no
desenvolvimento de sistemas que permitem mobilidade, tais como: possibilidade de
operações desconectadas; diminuição do tráfego da rede, aproximando a entidade
computacional do recurso; possibilidade de coleta de estatísticas e dados sobre a rede
e/ou funcionamento de aplicações distribuídas; personificação de uma transação ou
cliente, permitindo que informações específicas sejam coletadas. Através destas
vantagens, observou-se que elas podem ser alcançadas usando agentes móveis,
podendo-se concluir então a grande importância da mobilidade dos agentes, pois muitas
tecnologias que permitem mobilidade suportam o desenvolvimento de aplicações
através de agentes móveis ou são especificamente para este tipo de aplicação.
46
Finalmente, o Capítulo 5 apresentou uma análise comparativa das tecnologias
apresentadas no Capítulo 4. Esta análise foi feita tendo como base a taxonomia
apresentada no texto [FUG 98], descrita no capítulo 2. A análise foi dividida em duas
tabelas. A Tabela 1 procurou comparar aspectos de mobilidade em ferramentas que
serviram como base para implementação de ambientes que permitem explorar
mobilidade. Foram comparadas as ferramentas Java, Obliq e Oz Distribuído, que são
linguagens de programação, e CORBA. Na Tabela 2, foram comparados os ambientas
Voyager, Aglet e Concordia. Comparou-se aspectos considerados importantes (alguns
semelhantes aos analisados quanto as ferramentas) com relação a ambientes que
suportam mobilidade, tais como entidade computacional base, presença de ambiente
computacional, suporte a desenvolvimento em Java, mobilidade através de objetos e/ou
agentes móveis, tipo de mobilidade, paradigma suportado e mecanismos de segurança.
A principal contribuição deste capítulo foi a observação de características semelhantes
em ferramentas/ambientes que exploram mobilidade.
Pode-se concluir com este trabalho:
• os estudos em mobilidade são promissores e necessários, uma vez que as aplicações
distribuídas utilizam cada vez mais a Internet;
• o texto [FUG 98] procurou organizar a área de mobilidade, sendo que a taxonomia
apresentada não é dita como “completamente correta”, necessitando ainda muitos
estudos e revisões;
• a linguagem Java pode ser considerada como a principal linguagem para suporte à
mobilidade, uma vez que vários ambientes computacionais são baseados em Java,
como foi visto neste texto;
• para ser considerada uma ferramenta ou ambiente que permite implementar
mobilidade, a entidade computacional base deve ter o potencial de deslocar-se
através dos sistemas distribuídos;
• entre os ambientes Voyager, Aglet e Concordia, o primeiro é o mais completo de
todos, pois suporta todas as características analisados no Capítulo5, Tabela 2;
• características como suporte à mobilidade através de objetos e agentes móveis,
presença de ambiente computacional e mecanismos de segurança parecem ser
características desejadas em ambientes que permitem explorar mobilidade.
• para explorar mobilidade, é desejável que a tecnologia apresente características como
ambiente computacional, suporte a objetos e agentes, suporte a Java, suporte a
mobilidade forte e fraca, mecanismos de serialização de objetos, mecanismos de
segurança, mecanismos de transporte e interação das entidades base, mecanismos
para controle de prioridade e persistência.
Trabalhos futuros poderão aperfeiçoar os estudos referentes a ambientes que permitam
mobilidade, como a identificação de características que devem estar presentes nestes
ambientes para que à mobilidade possa ser aplicada de forma genérica, isto é, que o
ambiente suporte mobilidade independentemente do paradigma computacional
utilizado. Na verdade, o Oz Distribuído seria um precursor desta forma de exploração
de mobilidade.
47
Bibliografia
[AMA 97]
AMANDI, Anília. Programação de Agentes orientada a Objetos.
Porto Alegre: CPGCC da UFRGS, 1997. 208p. Tese de
Doutorado.
[BAR 98]
BARBOSA, Jorge L. V. Paradigmas de desenvolvimento de
Sistemas Computacionais. Porto Alegre: CPGCC - II - UFRGS,
1998. 49p. Trabalho Individual II.
[BAU 97]
BAUMANN, J.; HOHL, F.; et al. Communication concepts for
mobile agent systems. First International Workshop on Mobile
Agents. Proceedings... Berlin, Germany, April, 1997.
[CAS 98]
CASTILLO, A.; KAWAGUCHI, M. et al. Concordia as Enabling
technology for cooperative Information Gathering.
Mitsubishi Eletric ITA, USA, 1998.
[CAR 97]
CARZANIGA, A.; PICCO, G.; VIGNA, G. Designing distributed
applications with a mobile code paradigm. 19th International
Conference on Software Engineering. Proceedings... Boston,
may 1997.
[CAR 95]
CARDELLI, L. A Language with Distributed Scope. Proceedings...
pág. 286-297. ACM Press, 1997. Disponível em
http://www.research.digital.com/SRC/personal/luca_cardelli/obliq/
[CUG 96]
CUGOLA, G.; GHEZZI, C.; PICCO, G. P.;VIGNA, G. Analyzing
Mobile Code Languagens. Mobile Object Systems. Second
Internationa Workshop, MOS’96. Proceedings... Linz, Austria,
july 1996. Lecture Notes.
[CHE 96]
CHESS, D.; HARRISON, C.; KERSHENBAUM, A. Mobile agents:
are they a good idea? Mobile Object Systems. Second
Internationa Workshop, MOS’96. Proceedings... Linz, Austria,
july 1996. Lecture Notes.
[DÖM 97]
DÖMEL, P.; LINGNAU, A.; DROBNIK, O. Mobile Agent
Interaction in Heterogeneous Environments. Mobile Object
Systems.
Second
Internationa
Workshop,
MOS’96.
Proceedings... Linz, Austria, july 1996. Lecture Notes.
[FIN 94]
FININ, T.; FRITZON, R.; et al. KQML as na Agente
Communication Language. Third International Conference on
Information and Knowledge Managemente (CIKM’94).
Proceedings... ACM Press, November, 1994.
[FLE 98]
FLEISCHHAUER, L. Agentes. agosto, 1998. Disponível em
http://www.eps.ufsc.br/disserta97/amaral/cap3.htm
48
[FUG 98]
FUGGETTA, A.; PICCO, G. P.; VIGNA, G. Understanding Code
Mobily. IEEE Transactions on Software Engineering. Vol.24,
num. 5, May 1998.
[GLA 98]
GLASS, Graham. ObjectSpace Voyager - The Agente ORB for Java.
Worldwide Computing and its Applications (WWCA’98).
Second International Conference. Proceedings... Tsukuba,
Japan, march, 1998.
[IBM 98]
Industrial and Business Machine corp. The Aglet Homepage.
Disponível em http://www.trl.ibm.co.jp/aglets/
[KNA 96]
KNABE, F.; Na Overview of mobile agente programming. Fifth
LOMAPS workshop on Analysis and Verification of Multiple
Agent Languages. Proceedings... Stockholm, Sweden, june
1996. Lecture Notes
[LAN 97]
LANGE, Danny; OSHIMA, Mitsuru; et al. Aglets: programming
Mobile Agents in Java. Worldwide Computing and its
Applications
(WWCA’97).
International
Conference.
Proceedings... Tsukuba, Japan, march, 1997.
[OBJ 98]
ObjectSpace Voyager Core Tecnology
http://www.objectspace.com
2.0
Disponível
em
[OBJ 97]
ObjectSpace Voyager Core Tecnology 1.0.
http://www.objectspace.com
Disponível
em
[OMG 95]
Object
Management
http://www.omg.org/corba/
[ORF 96]
R. Orfali, D. Hankey, J. Edwards, The Essential Distributeds
Objects Survival Guide, John Wiley & Sons, Inc.1996.
[OSH 98]
OSHIMA, M. ; LANGE, D. Mobile Agentes with Java: The Aglet
API. Disponível em
[ROY 97]
ROY, Peter et al. Mobile Objects in Distributed Oz. ACM
Transactions on Programming Languages and Systems.
Proceedings... New York, v.19, n.5, p.804-851, september
1997.
[ROY 98]
ROY, Peter. et al. Three moves are not as bad as fire. January,
1998. Tecnical Report.
[RUM 96]
RUMBAUGH, James; et al.; Modelagem e Projetos baseados em
Objetos. Editora Campus, Rio de Janeiro, 1996.
[SUN 96]
Sun Microsystems. The Source for Java tecnology. Disponível em
http://java.sun.com/
[THO 97]
THORN, T. Programming Languages for Mobile Code. INRIA
Tecnical Report 3134, France, Mar 1997
Group.
Disponível
em
49
[WON 97]
WONG, D.; PACIOREK, N.; WALSH, T.; et al. Concordia: na
Infrastructure for Collaborating Mobile Agents. First
International Workshop on Mobile Agents. Proceedings...
Berlin, Germany, April, 1997.
Download