Passo 1 e 2 IPC E RMI Sistemas Distribuidos
IPC
Os IPCs ou Comunicação Entre Processos são um conjunto de mecanismos de troca de informação entre múltiplas threads de um ou mais processos. Mas existe uma necessidade de coordenar o uso de recursos (sincronização).
Ao fornecer mecanismos de IPC, o S.O implementa “canais” de comunicação (implícitos ou explícitos) entre processos.
Características desejáveis para uma IPC:
Rápida
Simples de ser utilizada e implementada
Possuir um modelo de sincronização bem definido
Funcione igualmente em ambientes distribuídos
Sincronização é uma das maiores preocupações em IPC:
Permitir que o sender indique quando um dado foi transmitido.
Permitir que um receiver saiba quando um dado está disponível .
Permitir que ambos saibam o momento em que podem realizar uma nova IPC.
Pipes
Os pipes nomeados. ou FIFOs, são ficheiros especiais que servem de canal de comunicação entre processos. Um processo abre o FIFO para escrita, outro para leitura.
Esta é a forma mais divulgada de IPC. Um exemplo:
C:\> type text.txt | more
Este exemplo em Dos iria canalizar o output do comando TYPE como input para o programa MORE.
Um pipe tradicional caracteriza-se por ser: Anônimo (não tem nome). Temporário: dura somente o tempo de execução do processo que o criou.
A capacidade do pipe é limitada:
Se uma escrita é feita e existe espaço no pipe, o dado é colocado no pipe e a chamada retorna imediatamente. Se a escrita sobre um pipe continua mesmo depois dele estar cheio, ocorre uma situação de bloqueio (que permanece até que algum outro processo leia e, consequentemente, abra espaço no pipe).
Códigos IPC com pipe:
#include “ourhdr.h” int main(void)
{
int n, fd[2]; pid_t pid; char line[MAXLINE]; if (pipe(fd) < 0) { err_sys("pipe error");} if (pipe(fd) = fork() < 0) { if (pipe(fd) = fork() < 0) { err_sys(“fork error");} else if (pid > 0) { /* processo Principal*/ close(fd[0]); write(fd[1], "hello world\n", 12); error ("write error");
}
else { /* processo Secundario */