Você está na página 1de 47

Aglets e Agentes Mveis

Aluno: Rodrigo Moreira Barbosa (aluno de mestrado) Orientador: Prof. Dr. Alfredo Goldman vel Lejbman

DCC/IME/USP

Projeto InteGrade

Demanda por solues de problemas computacionalmente complexos. Abordagens tradicionais:


Supercomputadores Mquinas Paralelas Recentemente: aglomerados

Projeto InteGrade (cont.)

Aglomerados custam muito caro Em geral, passam a maior parte do tempo ociosos Ocupam muito espao Fazem muito barulho, esquentam Desperdcio de recursos ambientais Somos um pas pobre: no podemos nos dar ao luxo de jogar recursos fora desta forma

Projeto InteGrade (cont.)

Qualquer empresa, universidade, instituio possui muitos computadores que ficam ociosos a maior parte do tempo. Por que no disponibilizar esse tempo de processamento ocioso para execuo de tarefas que exijam grande uso de recursos computacionais?

Projeto InteGrade (cont.)

Criao de um middleware para interligar estes computadores em uma grade. InteGrade: Projeto da USP, PUC-Rio e UFMS.

Projeto InteGrade (cont.)

Linhas de Pesquisa:
Arquitetura geral do sistema (CORBA) Segurana Monitorao de recursos (processador, memria, disco, rede, hardware especfico etc.) Identificao de padres de uso e ociosidade
entender o passado para prever o futuro

Execuo de diferentes classes de algoritmos paralelos Integrao com sistemas ubquos Criao de uma infra-estrutura para agentes mveis

Projeto InteGrade (cont.)

Por que agentes mveis no InteGrade?


Agentes mveis podem ser utilizados para execuo de tarefas que necessitem de recursos presentes em diferentes ns da grade. Diminuir ainda mais a ociosidade dentro de uma rede, permitindo que programas isolados possam ser executados como agentes mveis, executando em mquinas ociosas e migrando sempre que essas so requisitadas pelo usurio, reiniciando na prxima mquina a execuo do ponto onde ela havia sido suspensa.

Nossa proposta inicial

Utilizar agentes mveis para encapsular tarefas longas que no necessitem se comunicar com outras tarefas. Essas tarefas constituiriam se tornariam agentes oportunistas, tentando diminuir ainda mais a ociosidade da grade e fariam a busca por mquinas ociosas de forma autnoma. O ambiente de execuo dos agentes mveis deve ser o mais leve possvel e deve minimizar a sobrecarga da migrao.

O que so agentes mveis

Agentes mveis so programas que podem ser despachados de um computador e transferidos para outro computador, continuando sua execuo.

Por que Aglets?

Aglets atualmente o sistema de agentes mveis mais utilizado. Aglets muito bem avaliado como plataforma para agentes mveis. [AGKSW2000] Existem pessoas no IME j utilizando Aglets (Roberto Speicys Cardoso e Leo K. Ueda )

Aglets

O Aglets foi desenvolvido inicialmente pela IBM, tendo sua frente os pesquisadores Mitsuro Oshima, Guenter Karjoth, Kouichi Ono. Atualmente mantido por uma iniciativa de cdigo aberto: (aglets.sourceforge.net)

The Aglets Software Development Kit

O Aglets Software Development Kit um ambiente para programao de agentes mveis em Java Aglets so objetos Java que podem mover-se de uma mquina para outra na rede. Ou seja, um aglet que executa em um dado computador, pode repentinamente parar sua execuo, despachar-se para uma uma mquina remota, e comear a executar de novo.

The Aglets Software Development Kit (cont.)

Aglets fornece o mecanismo de migrao fraca, j que no preserva pilha de execuo das linhas de execuo do aglet, devido a limitaes da JVM. No entanto, o estado dos objetos do aglet so mantidos.

Viso geral da API do Aglets

Diagrama

Viso Geral da API do Aglets (cont.)

com.ibm.aglet.Aglet: A classe abstrata que define os mtodos fundamentais usados para controlar a mobilidade e ciclo de vidas dos agentes mveis. Alguns mtodos elementares e sua semntica:
dispose (): Descarta o objeto dispatch (URL): Despacha o aglet para o destino especificado na URL deactivate (long duration): Instrui o aglet para armazenar a si mesmo em uma mdia persistente. getAgletInfo (): Obtm informaes sobre o aglet

Viso Geral da API do Aglets (cont.)

com.ibm.aglet.AgletId: Objeto que mantm um identificador nico, enquanto encapsula seus detalhes de representao. com.ibm.aglet.AgletProxy: Essa interface age com um gancho para o aglet e fornece um modo comum de acessar o aglet por detrs dele. Garante a segurana do aglet e a transparncia de localizao.
AgletContext.getAgletProxies()
AgletContext.getAgletProxy(AgletID) Aglets.getAgletProxy(String contextName, AgletID)

Viso Geral da API do Aglets (cont.)

com.ibm.AgletContext: Prov uma interface para o ambiente de execuo que o aglet ocupa. Quando o aglet despachado, a referncia para o contexto antigo desfeita e a referncia para o novo contexto atada a ele quando de sua chegada.

Viso Geral da API do Aglets (cont.)

com.ibm.aglet.Message: Os aglets se comunicam trocando objetos desta classe. Uma mensagem tem uma String para especificar o tipo da mensagem e um objeto arbitrrio. com.ibm.aglet.Ticket: Serve para especificar como um aglet transferido: destino, protocolo, timeout, integridade, etc. Este objeto deve ser utilizado onde a URL utilizada como meio de especificar destino.

Viso Geral da API do Aglets (cont.)

com.ibm.aglet.FutureReply: Objeto retornado por uma transmisso assncrona de mensagem. Serve para a verificao de chegada de alguma resposta.

Estendendo a classe Aglet

Linhas gerais:
estender a classe com.ibm.aglet.Aglet Pode estender outra classe que implementa Aglet No pode sobrescrever os mtodos dispatch () e getAgletContext(), declarados como final. No pode implementar um construtor, visto que a classe Aglet inicializada depois da instanciao. Deve-se utilizar o mtodo onCreation (), ao invs do construtor.

Estendendo a classe Aglet (cont.)

void Aglet.onCreation (Object init): Mtodo chamado somente uma vez na vida do aglet, quando de sua criao. Utilizado para inicializar o aglet. void Aglet.onDisposing (): Chamado depois do dispose (). Utilizado para desalocar os recursos locais utilizados pelo aglet antes de sua morte. void Aglet.run (): Mtodo chamado sempre que uma instncia criada ou reiniciada. Bom lugar para se definir a tarefa comum. boolean Aglet.handleMessage (Message msg): Trata mensagens recebidas. Se a mensagem tratada devolve true, caso contrrio devolve false.

Estendendo a classe Aglet (cont.)


public class HelloAglet extends Aglet { public void onCreation(Object init) { System.out.println("created!"); } public void run() { System.out.println("hello!"); } public boolean handleMessage(Message msg) { if (msg.sameKind("sayHelloAgain") { System.out.println("hello!"); return true; } return false; } public void onDisposing() { System.out.println("bye!"); } }

Ciclo de vida dos Aglets

Ciclo de vida dos Aglets (cont.)

AgletContext.createAglet (URL codebase, String name, Object init) -> Aglet.onCreation (Object init) Aglet.clone () Aglet.dispatch (atp://aglets.ibm.com:1434/context_name) Aglet.deactivate (long timeout) Aglets no podem ser recolhidos pela JVM. Sendo assim, devem ser mortos explicitamente pelo dispose ().

Eventos do Aglet e Modelo de Delegao

Visto que a JVM no permite, por motivos de segurana, que se acesse a pilha de execuo de uma linha de execuo, impossvel armazen-la para permitir o reincio da execuo a partir dela. Sendo assim, Aglets s suporta migrao fraca, visto que no interessante desviar-se da verso padro da JVM. Aglets usa um esquema de eventos para permitir a implementao de uma ao que emula a migrao.

Eventos do Aglet e Modelo de Delegao (cont.)

Eventos do Aglet e Modelo de Delegao (cont.)


import com.ibm.aglet.Aglet; import com.ibm.aglet.event.MobilityEvent; import com.ibm.aglet.event.MobilityListener; class MyListener implements MobilityListener { public void onDispatching(MobilityEvent l) { closeWindow(); closeFile(); } public void onReverting(MobilityEvent l) { openWindow(); donNextJob(); } public void onArrival(MobilityEvent l) { } } public class MyAglet extends Aglet { public void onCreation(Object init) { MobilityListener listener = new MyListener(); addMobilityListener(listener); } }

Eventos do Aglet e Modelo de Delegao (cont.)


When Just before cloning When clone is created After creation of clone Just before dispatch Just before retraction After arrival at the destination Just before deactivation After activation MobilityEvent PersistencyEvent PersistencyEvent MobilityListener PersistencyListener PersistencyListener onArrival onDeactivating onActivation Event Object CloneEvent CloneEvent CloneEvent MobilityEvent MobilityEvent Listener CloneListener CloneListener CloneListener MobilityListener MobilityListener Method called onCloning onClone onCloned onDispatching onReverting

Mobilidade de Objetos

Quando um aglet despachado, clonado ou desativado, ele transformado em um fluxo de bytes e ento restaurado dele depois. Aglets usa o mecanismo de serializao para criar o fluxo de bytes e recriar o objeto. Estes objetos devem implementar ento a interface java.io.Serializable ou java.io.Externalizable, ou referenciados como transient.

Mobilidade de Objetos (cont.)


class ListingAglet extends Aglet { // result and its contents are transferred.
private Vector result = new Vector(); transient InputStream in = new InputStream(); // will not be transferred }

Mobilidade de Objetos (cont.)

Objetos movidos por valores Objetos movidos por referncia:

Mobilidade de Objetos (cont.)


class Transferrable implements java.io.Serializable { Hashtable hash; // Hashtable is also serializable } class NotTransferrable { int dummy; } class MyClass extends Aglet { transient FileDescriptor fd; // never get transferred. int value; // moved by value String str; // moved by value Object transferable = new Transferrable(); // move by value Object not_transferable = new NonTransferable(); // throws NotSerializableException. AgletProxy proxy; // moved by reference }

Mobilidade de Objetos (cont.)

Variveis de classe:

public class MyAglet { static int class_variable = 0; public void onCreation(Object init) { class_variable = 10; dispatch("atp://next.place"); } public void run() { if (class_variable != 10) { System.out.println("Class variable never get transferred!"); } } }

Mobilidade de Objetos (cont.)

Transferindo Objetos RMI:


Referncias para objetos RMI no so perdidas com a migrao. Todavia, Aglets no suporta migrao de servidores RMI.

Passagem de mensagens

Aglet.handleMessage ():

MyAglet extends Aglet { public boolean handleMessage(Message msg) { if (msg.sameKind("doJob")) { doJob(); } else if (msg.sameKind("shutdown")) { deactivate(0); } } }

Passagem de mensagens (cont.)

Now-type:
Future-type:

String answer = proxy.sendMessage(new Message("question")); System.out.println(answer);

FutureReply future = proxy.sendAsyncMessage(new Message("question")); int num_task = 10; // do private job at most 10 times while waiting for the result. while(future.isAvailable() == false && num_task-- >0) { doPrivateJob(); } System.out.println( (String)future.getReply() );

Passagem de mensagens (cont.)

Oneway-type: Nos outros tipos de envio, se um objeto envia uma mensagem para si mesmo, ela colocada no incio da fila. Com a Oneway, a mensagem colocada sempre no fim da fila.
proxy.sendOnewayMessage (new Message (question));

Passagem de mensagens (cont.)

Se o handleMessage () devolve false, o remetente da mensagem recebe uma NotHandledException.

Future future = proxy.sendAsyncMessage(); ...


try { Object reply = future.getReply(); } catch (NotHandledException ex) { // the receiver didn't handled the message } catch (MessageException ex) { // an exception has been thrown in the receiver's handleMessage()

System.out.println(ex.getException());
}

Passagem de mensagens (cont.)

Mensagens em Aglets suportam o recurso de enviar cincia, antes mesmo de terminar de tratar a mensagem.

public boolean handleMessage(Message msg) { if (msg.sameKind("accessDB")) { openDB(); // pseudo code Object reply = accessDB(msg.getArg()); msg.sendReply(reply); closeDB(); return true; // i know this message... } return false; // false, otherwise }

Mensagens de Sincronizao
public StackAglet extends Aglets { static int capacity = 10; Object stack[] = new Object[capacity]; int num = 0; public handleMessage(Message msg) { if (msg.sameKind("push")) { push(msg); } else if (msg.sameKind("pop")) { pop(msg); } else if (msg.sameKind("isFull")) { msg.sendReply( num == capacity); } else if (msg.sameKind("isEmpty")) { msg.sendReply( num == 0 ); } else return false;

Mensagens de Sincronizao (cont.)


private void push(Message msg) { while (num == capacity) { waitMessage(); } stack[num++] = msg.getArg(); if (num==1) { notifyMessage(); // wake up "pop" message } } private void pop(Message msg) { while(num==0) { waitMessage(); } msg.sendReply(stack[--num]); if (num == (capacity -1)) { notifyMessage(); // wake up "push" message } } }

Viso Geral da Arquitetura

Viso Geral da Arquitetura(cont.)

Camada de tempo de execuo Aglets


Serializao e desserializao de aglets. Carregamento de classes e transferncia Gerenciamento de referncias e recolhimento de lixo.

Viso Geral da Arquitetura(cont.)

PersistenceManager CacheManager SecurityManager

Viso Geral da Arquitetura(cont.)

Camada de comunicao:
Derivada do padro OMG, MASIF (Mobile Agent System Interoperability Facility)

Viso Geral da Arquitetura(cont.)

Estrutura de objetos Aglets


Message Manager Resource Management Recolhimento de lixo

Referncias

Javadoc da API do Aglets Aglets Specification Draft 1.1 http://www.trl.ibm.com/aglets/spec11.htm

Site do projeto Aglets http://aglets.sourceforge.net

[AGKSW2000] Using Mobile Agents in Real World: A Survey and Evaluation of Agents Plataforms (Josef Altmann et. al)

Site do InteGrade: http://gsd.ime.usp.br/integrade

Mobile Agents: Are they a good idea? http://citeseer.nj.nec.com/chess95mobile.html