1 / 19

Chamada Remota de Procedimentos

Chamada Remota de Procedimentos. Remote Procedure Call. O fluxo de informações em uma implementação de clientes e servidores por passagem de mensagem requer a programação de duas trocas explícitas de mensagens em dois canais diferentes de comunicação

chinue
Download Presentation

Chamada Remota de Procedimentos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chamada Remota de Procedimentos

  2. Remote Procedure Call • O fluxo de informações em uma implementação de clientes e servidores por passagem de mensagem requer a programação de duas trocas explícitas de mensagens em dois canais diferentes de comunicação • Cada cliente precisa de um canal de comunicação que leva a um grande número de canais • RPC serve especialmente para programar interações cliente/servidor • Combina aspectos de monitores e passagem de mensagem síncrona

  3. Remote Procedure Call • Como em monitores, um processo ou módulo exporta operações que são invocadas através da instrução call • Como em um processo síncrono de envio de mensagens, a execução do call atrasa o invocador da chamada • Uma operação é um canal de comunicação dupla do chamador para o processo que serve a chamada e de volta para o chamador • O chamador espera até que a operação invocada seja executada e os resultados sejam retornados • Um procedimento é declarado para cada operação e um processo novo é criado para tratar cada chamada

  4. Remote Procedure Call • Um procedimento é declarado para cada operação e um processo novo é criado para tratar cada chamada • O chamador e o corpo do procedimento podem estar em máquinas diferentes • Um módulo contém processos e procedimentos • Módulos podem residir em espaços de endereçamento diferentes • Processos dentro do módulo podem compartilhar variáveis e chamar procedimentos declarados dentro do módulo

  5. Modelo de um módulo • Um processo em um módulo só pode se comunicar com processos em outro módulo através da chamada de procedimentos exportados por esse módulo • Forma de um módulo módulo mnome indicações das operações exportadas corpo declarações de variáveis inicialização do código procedimentos das operações exportadas procedimentos locais e processos fim mnome

  6. Modelo de um módulo • Declaração de uma operação exportada • op opnome(formais) [returns resultado] • Operação implementada por uma proc • proc opnome(identificadores formais) returns identificador do resultado declarações de variáveis locais instruções fim • Um processo chama um procedimento em outro módulo executando call mnome.opnome(argumentos)

  7. Implementação da chamada entre módulos Call Processo chamador (chama procedimento opnome) Processo servidor ( executa procedimento opnome)

  8. Sincronização dentro dos módulos • Sincronização entre chamador e servidor implícita • Processos dentro de um módulo, incluindo servidores e processos locais, necessitam ser sincronizados entre eles e obter acesso mutuamente exclusivo a variáveis compartilhadas • Duas abordagens utilizadas: • processos executam com exclusão mútua, ou seja, um de cada vez está ativo • processos executam concorrentemente e mecanismos de exclusão mútua tem que ser utilizados

  9. Um servidor de tempo • Implementação de um módulo que provê serviços de tempo para clientes em outros módulos • Duas operações visíveis: • get_time, para um cliente obter a hora do dia • delay, para bloquear o processo do cliente por interval unidades de tempo • O servidor possui um processo interno que inicia continuamente um timer de hardware, que incrementa a hora do dia quando ocorre uma interrupção

  10. Um servidor de tempo Module TimeServer op get_time() returns int; op delay (int interval); body int tod=0; # hora do dia sem m =1; # semáforo para exclusão mútua sem d[n]=([n] 0); # semáforos privados para delay queue of (int waketime, int process_id) napQ; ## quando m==1, tod < waketime para os processos atrasados proc get_time() returns time { time = tod; } proc delay (interval) { # assume interval > 0 int waketime = tod + interval; P(m); insere (waketime, myid) no lugar apropriado em napQ; V(m); P(d[myid]); # espera para ser acordado }

  11. Um servidor de tempo process Clock { inicia o timer de hardware; while (true) { espera por interrupção, então reinicia timer; tod = tod + 1; P(m); while (tod >= menor waketime em napQ) { remove (waketime, id) de napQ; V(d[id]); # acorda processo id } V(m); } } fim TimeServer

  12. Java RMI (Remote Method Invocation) • Suporte de Java a RPC • Operações em objetos Java são chamados métodos, daí o nome RMI • Três componentes: • uma interface que declara os headers para os métodos remotos • uma classe servidora que implementa a interface • um ou mais clientes que chamam os métodos remotos

  13. Programação emRMI • Escreva uma interface Java que estende Remote com métodos que declaram o lance de exceções remotas • Escreva uma classe servidora que estende UnicastRemoteObject e implementa os métodos da interface • Escreva código que cria uma instância do servidor e registre seu nome em um servidor de nomes denominado registry service • Escreva uma classe cliente que interage com o servidor • O cliente deve criar um gerenciador de segurança para não carregar código errado pela rede e deve obter um objeto servidor do registry service. Após esse procedimento, o cliente pode chamar os métodos remotos do servidor.

  14. Mecanismo de funcionamento • O programa do cliente invoca os métodos do servidor como se fossem locais • Quando os métodos são remotos, a interação entre cliente e servidor é gerenciada por um stub e skeleton • Após a compilação do programa, o stub e skeleton são criados pelo comando rmic

  15. Mecanismo de funcionamento • Quando um cliente invoca um método remoto, ele, na verdade, invoca um método no stub • O stub organiza os argumentos da chamada remota e os envia em uma única mensagem para o skeleton • O skeleton recebe a mensagem com os argumentos, gera uma invocação local do método para o servidor, espera o resultado e o retorna para o stub • O stub retorna o resultado para o código do cliente

  16. Detalhes para execução • Cliente e servidor são programas separados que executam em hosts separados • Necessita-se de utilizar um identificador o servidor que deve ser único, pois podem existir mais de um servidor executando ao mesmo tempo • Formato dos nomes de servidores • rmi://hostname:port/pathname, onde hostname é o nome do host na Internet, port é uma porta escolhida pelo usuário e pathname é um nome do diretório escolhido pelo usuário no servidor • O registry service é um programa que mantém uma lista de nomes registrados de servidores em um host

  17. Detalhes para execução • O registry service é um programa que mantém uma lista de nomes registrados de servidores em um host • Inicia-se o programa em background na máquina servidora através do comando “rmiregistry port &” • A interface para esse serviço é fornecida por um objeto Naming com dois métodos: bind, para registrador um nome e lookup para obter o nome de um servidor • Os programas cliente e servidor são iniciados através do interpretador java • O servidor deve ser iniciado em uma máquina e os clientes em máquinas conectadas as servidor

  18. import java.rmi.*; import java.rmi.server.*; public interface RemoteDatabase extends Remote { public int read() throws RemoteException; public void write(int value) throws RemoteException; } class Client { public static void main(String[] args) { try { System.setSecurityManager(new RMISecurityManager()); String name ="rmi://neuman:9999/database"; RemoteDatabase db = (RemoteDatabase) Naming.lookup(name); int value, rounds = Integer.parseInt(args[0]); for (int i = 0; i , rounds; i==) { value = db.read(); System.out.println("read: "+ value); db.write(value+1); } } catch (Exception e) { System.err.println(e); } } }

  19. class RemoteDatabaseServer extends UnicastRemoteObject implements RemoteDatabase { protected int data = 0; public int read() throws RemoteException { return data; } public void write (int value) throws RemoteException { data = value; System.out.println(”new value is : “ + data); } public RemoteDatabaseServer() throws RemoteException { super (); } public static void main(String[] args) { try { RemoteDatabaseServer server = new RemoteDatabaseServer(); String name ="rmi://neuman:9999/database"; Naming.bind(name, server); System.out.println(name + “is running”); } catch (Exception e ) { System.err.println(e); } } }

More Related