Uma das características principais dos processos de um mesmo programa, é a sua independência, seguindo, cada um, um fluxo de código independente dos restantes. No entanto, é por vezes, necessário que comuniquem entre si, para que troquem informação, por exemplo, e, a não ser que se opte por recorrer à memória partilhada, a solução mais usual são os pipes. A Comunicação entre processos pode ser de 4 tipos:
mestre/escravo | correio | diálogo | difusão |
Dentro da comunicação entre processos, existe um caso em que a actividade de um processo (Escravo) depende exclusivamente da vontade de um outro (Mestre). Este último, quando quer enviar alguma mensagem para o Escravo, tem de esperar que este já tenha lido a mensagem anterior. Essa espera não necessita ser bloqueante, isto é, o Mestre, pode continuar a executar outras tarefas enquanto que o escravo não liberta o canal. Contudo, e porque o Escravo existe apenas para servir o seu Mestre, se o processo leitor não tiver, de momento, nada para ler, tem de ficar bloqueado à espera que algo lhe seja dado.
O canal que define esta ligação é fixo.
Enquanto que na comunicação
Mestre/Escravo,
existe um processo a comunicar com outro,
aqui pode encontrar-se um processo a receber mensagens de vários outros. Estes
processos, independentes entre si, vão produzindo mensagens e deixando-as no canal
que os liga ao processo leitor, tendo apenas de suspender o envio das mensagens,
quando o canal já se encontrar cheio. Nessa altura, podem prosseguir com a execução
de outra sequência de código até que haja, novamente, espaço no pipe que deve
ter espaço para guardar as mensagens desde a altura em que lá são colocadas, até que,
do outro lado, o leitor as consiga ler.
O Diálogo é uma forma de comunicar que tenta obter a máxima eficácia na utilização
do canal. Neste tipo de comunicação, é estabelecido um canal permanente entre dois
processos, mas que, ao contrário dos outros tipos, é criado de forma dinâmica,
durando apenas o tempo de transmissão das mensagens.
Este mecanismo de comunicação permite que uma mensagem enviada por um processo
seja recebida por um grupo de processos. O emissor não necessita de enviar várias
cópias, uma para cada destino, dado que o sistema operativo se encarrega de o fazer.