Remote Procedure Call (RPC)

É um mecanismo de comunicação entre processos em ambientes distribuídos, no qual processos requisitam a execução de serviços por parte de um módulo remoto. Na prática, esse mecanismo implementa fielmente o conceito de cliente-servidor.

O módulo remoto, responsável por atender as requisições, é composto por procedimentos e processos tanto internos quanto exportados (visíveis remotamente).

Sintaxe

module mname
    headers de operações exportadas 

body
- declaracoes de variaveis
- codigo de inicialização 
- procedimentos das ops exportadas
- procedimentos e processos locais

end mname 

Os headers são da forma

op opname (formals) [return result]

Os procedimentos são da forma:

proc opname (formal identifiers) returns res. identifier declaracao variaveis locais comandos

Esses procedimentos são chamados remotamente por:

call mname.opname(arguments)

Lógica de execução

processo que chamaservidor
call mname.opexecuta op
estado de esperatermina de executar op
volta a executar

Exemplo - Servidor de relógio

module TimeServer
    op get_time() returns int;
    op delay(int interval);
body 
    int tod = 0;
    sem m=1, d[n] = ([n] 0), mutex;
    <queue min_heap> (int waketime, int process_id) napQueue;
    proc get_time() return time 
       { time = tod };

    proc delay(int interval) 
    {
        int waketime = tod + interval;
        P(m);
        insert (waketime, my_id) in napQueue;
        V(m);
        P(d[myid]);
    }

    process clock {
        // inicia relogio de hardware
        while (true) {
            // atualiza o relogio 
            tod = tod + 1
            P(m);
            while (tod <= napQueue.top().waketime) {
                napQueue.pop()
                V(d[id]);
            }
            V(m);
        }
    }
    
end TimeServer