- Processos independentes não podem afetar ou ser afetados pela execução de outros
- Vantagens da cooperação entre processos
- Compartilhamento de informação
- Aumento da velocidade de processamento
- Modularidade
- Conveniência
Problema do Produtor/Consumidor
- Modelo básico de cooperação geral
- Produtor produz informação e entrega ao consumidor
- Consumidor utiliza a informação recebida
- Comunicação pode ser feita por um buffer
- Buffer de tamanho limitado impõe restrições
- Mesmo buffer ilimitado deve caber na memória
- Comunicação pode ser também por mensagens
Buffer fixo (Mem. Compartilhada)
- Dados compartilhados em fila circular
#define BUFFER_SIZE 10
typedef struct {
…
} item;
item buffer[BUFFER_SIZE];
int in=0;
int out=0;
#define BUF_FILL (((in+1)%BUFFER_SIZE)==out)
- Só pode usar BUFFER_SIZE-1 posições
item nextProduced;
while(1){
/**/ while(((in+1)%BUFFER_SIZE)==out)
/**/ ; /* não faz nada!*/
/**/ buffer[in]=nextProduced;
/**/ in=(in+1)%BUFFER_SIZE;
}
item nextConsumed;
while(1) {
/**/ while(in==out)
/**/ ; /* não faz nada */
/**/ nextConsumed = buffer[out];
/**/ out=(out+1)%BUFFER_SIZE;
}
Comunicação entre processos (IPC)
- Sistema de troca de mensagens, sem memória compartilçhada
- Comunicação e sincronização
- Baseado em duas operações básicas:
- send(message) – tamanho fixo ou variável
- receive(message)
- se P e Q querem se comunicar, eles devem:
- Estabelecer um canal de comunicação
- trocar mensagens com send/receive
- Implementação do canal de comunicação
- Escolha do meio: Barramento de HW, memória
- Comportamento lógico: como funciona
Decisões de implementação
- Como os canais são criados/estabelecidos?
- Um canal pode ligar mais de dois processos?
- Quantos canais podem ligar um mesmo par?
- Qual a capacidade do canal?
- As mensagens são de tamanho fixo ou variável?
- Cada canal é uni ou bidirecional?
- Qual o comportamento de send/receive se
- O canal está cheio, ou
- As chamadas não ocorrem ao mesmo tempo?
Comunicação Direta
- Processos identificam o outro explicitamente
- send(P, message)
- receive(Q. message)
- recepção pode usar máscara, como Q=qualquer um
- Propriedades do canal de comunicação direta:
- Estabelecimento é automático
- Cada canal liga exatamente um par de processos
- Existe apenas um canal entre cada par
- Canais são usualmente bidirecionais
Comunicação Indireta
- Mensagens são originadas de e direcionadas para portos (ports)
- Cada porto tem um identificador únicao
- Processos só se comunicam se compartilharem um porto
- Portos são recursos independentes que precisam ser criados e destruídos
- Propriedades dos canais
- Estabelecimento vinculado ao compartilhamento
- Um canal pode ligar vários processos
- Cada par de processos pode ter vários canais
- Canais podem ser uni ou bidirecionais
- Compartilhamento de portos
- P1, P2 e P3 compartilham o porto A
- P1 envia mensagem, quem recebe?
- Diversas soluções são possíveis
- Restringir o compartilhamento a 2 processos
- Permitir que só um processo chame receive de cada vez
- Escolher arbitrariamente quem recebe a msg
- entregar uma cópia a cada receive
Sincronização de Primitivas
- Troca de mensagens: Bloqueante ou não
- Bloqueante: Síncrona
- Não bloqueante: assíncrona
- Cada primitiva (send/receive) pode se comportar de uma forma. Mais comum:
- send assíncrono (retorna imediatamente)
- receive síncrono (bloqueia até a mensagem chegar)
Controle de Espaço no Canal
- Implementação da fila de mensagens associadas a um canal enquanto em transito
- Capacidade zero: O canal não guarda mensagens, o transmissor deve fazê-lo esperando pelo receptor (rendezvous)
- Capacidade limitada: Send é assíncrono enquanto a capacidade não é alcançada
- Capacidade ilimitada: Send nunca espera.