Skip navigation

 

  • 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.