article
aula 10 Rendezvous
Rendezvous
O cliente chama uma operação e o servidor explicitamente aceita essa chamada em um ponto específico de seu código usando a instrução in. É um encontro (sincronização) direto entre dois processos ativos. O servidor tem controle total sobre qual chamada aceitar e quando, usando guardas e escalonamento.
Sintaxe
// lado do cliente
call mname.opname(params);
// Lado do servidor
// - Definição das operações exportadas
op opname(tipos_dos_parametros);
// No ponto de Rendezvouz
in opname(id param) -> S; ni
// em que S é uma sequência de comandos;
S: sequência de comandos
O ponto de Rendezvouz pode envolver várias operações e também condições de escalonamento, como em:
in op1(formals_1) and B1 by e1 -> S1;
[] ...;
[] opn(formals_n) and Bn by en -> Sn;
niFilósofos com fome (tadinhos)
Vamos alterar a lógica para verificar se os $i - 1$ e $i + 1$ vizinhos de $i$ estão comendo ou não.
process Filosofos [i=0 to 4] {
while (true) {
call getForks(i);
eat();
call relForks(i);
think();
}
}
module Table
op getForks(int), retForks(int);
body
process Waiter {
bool eating[5] = ([5] false);
while (true) {
in getForks(i) and eating[right(i)] == false and eating[left(i)] == false -> eating[i] = true
[] relForks(i) -> eating[i] = false;
ni
}
}
end Tablese getForks não retornar S, ele enfileira a requisição de i.
Servidor de relógio
- não precisa de fila alguma (o Rendezvouz já tem uma fila)
module TimeServer
op getTime() returns int;
op delay(int);
op tick(): // chamada para relogio "real"
body
process Timer {
int tod = 0;
while (true) {
in get_time() returns time -> time = tod;
[ ] delay(waketime) and waketime <= tod -> skip;
[ ] tick() -> {
tod = tod + 1;
restart timer'
}
ni
}
}
end TimeServerSJFT - Shortest Job First Time
module SJFT_Allocator
op request(int time), release();
body
process SJFT {
bool free=true;
while (true) {
in request(time) and free by time -> free=false;
[] release() -> free =true;
ni
}
}
end SJTF_Allocatorai que entra by time, para comparar o tamanho do tempo (por tempo);
