Comunicação entre processos
Como vimos nos artigos anteriores, processos tem a característica de serem executados em o que chamamos de “espaços de memória independentes”. Ou seja, ficam isolados um dos outros, não conseguindo acessar os dados que não sejam os seus (o que dá estabilidade ao sistema como um todo).
Linhas de execução, como vimos no artigo sobre threads, também tem independência entre si e suas operações não se conectam às outras linhas de execução no sistema. Isso é feito para melhorar a performance dos programas, otimizando a capacidade computacional de CPUs com mais que um núcleo.
Apesar desta independência e isolamento serem extremamente úteis, muitas vezes é necessário que os processos e as linhas de execução (threads) se comuniquem para que o programa funcione. Por exemplo, quando um processo termina o tratamento de alguns dados pode precisar de mais dados para continuar a trabalhar. Assim como, quando uma thread termina a execução de uma tarefa ela precisa ficar suspensa até que haja mais tarefas a serem feitas.
O fato é que processos e threads precisam enviar dados uns para os outros. Um caso típico é a topologia de produtor e consumidor onde um processo produz dados (lendo o código de uma página HTML da rede, por exemplo) e precisa enviar para outro que os trata (que vai interpretar e “desenhar” o HTML na tela do usuário)
De uma forma geral, a comunicação entre processos e threads tem 3 objetivos distintos:
1- Troca de dados ou informaçõesEste é o caso do browser, mencionado acima: uma vez que os dados na internet tenham sido recebidos, eles precisam ser passados ao processo que vai desenhar os dados na tela para que o usuário veja a página.
2- SincronizaçãoSincronização consiste em efetuar as tarefas na ordem correta, esperando uns pelos outros sempre que necessário. Por exemplo, supondo um programa para tocar músicas e um que envia os arquivos de música a serem tocados; um programa deve enviar música sempre que o tocador solicitar e ficar aguardando nos outros momentos. Isso é feito com sincronização.
3- Tratamento de condições de concorrênciaQuando 2 ou mais threads precisam acessar o mesmo recurso (como uma variável na memória), podem ocorrer condições de concorrência que acabam causando erros no programa. O tratamento deste tipo de condição também é um tipo de comunicação.
Trocando de dados
Existem inúmeras formas de trocar dados entre processos, threads e até computadores, podendo ser classificadas nos três grupos abaixo. Cada forma tem suas vantagens de desvantagens e, portanto, é importante conhecer todas elas.
Existem inúmeras formas de trocar dados entre processos, threads e até computadores, podendo ser classificadas nos três grupos abaixo. Cada forma tem suas vantagens de desvantagens e, portanto, é importante conhecer todas elas.
Compartilhamento de arquivos
Neste modelo de compartilhamento de dados, um processo coloca as informações a serem compartilhadas num arquivo, que fica em um disco local ou remoto. Outros processos podem então ter acesso aos dados lendo o arquivo criada
.
Neste modelo de compartilhamento de dados, um processo coloca as informações a serem compartilhadas num arquivo, que fica em um disco local ou remoto. Outros processos podem então ter acesso aos dados lendo o arquivo criada
.
É a forma mais suportada (pois toda linguagem de programação entende o conceito de arquivos) e a menos eficiente, mas tem suas vantagens. Uma delas é o fato que a informação é persistente, ou seja mesmo quando nenhum processo está ativo, os dados ainda existirão.
Uma questão importante a ser considerada quando se faz a troca de dados desta forma é como evitar que o arquivo seja lido enquanto ainda está sendo escrito, o que ocasionaria em uma troca parcial dos dados. A solução mais simples para isso é escrever os dados em um arquivo com um nome temporário e, tão logo o arquivo esteja completo, mudar o nome do arquivo para um definitivo. Como a operação de renomear arquivos é atômica (este conceito será melhor explicado mais adiante), o arquivo será percebido imediatamente e inteiro pelo processo que irá ler os dados.
Compartilhando memória
É a forma padrão para trocar dados entre threads e, de longe, a mais eficiente.
É a forma padrão para trocar dados entre threads e, de longe, a mais eficiente.
Funciona da seguinte forma: todos as threads de um mesmo processo compartilham o mesmo espaço de memória. Sendo assim, uma thread tem acesso constante a todas as variáveis globais que são escritas por qualquer outra thread. Portanto, basta que os dados sejam organizados nesta memória global e que sinalize-se às outras threads que os dados estão prontos.
Já entre processos diferentes, esta técnica é um pouco mais complicada: antes de mais nada, é necessário pedir ao Sistema Operacional que aloque um bloco de memória que seja compartilhado entre dois ou mais processos. Uma vez criado o bloco, ele é disponibilizado para acesso por todos os processos que participarem da comunicação, que poderão escrever seus dados neste bloco.
Uma vez que os dados sejam escritos no bloco compartilhado, qualquer processo com acesso ao bloco de memória compartilhada poderá ter acesso aos dados.
Esta técnica, apesar de ser a mais eficiente, tem seus problemas: primeiro, o tal bloco de memória fica em um local específico e portanto é difícil fazer com que todos os dados organizados fiquem lá. Além disso, a parte de sincronização e concorrência é bem trabalhosa quando vários processos acessam frequentemente um mesmo bloco de memória.
Troca de mensagens
Uma mensagem de dados ou “datagrama”, é um conjunto de dados de comprimento conhecido, cujo significado só importa aos processos que estiverem envolvidos nesta troca de dados. Na troca de dados desta forma, um processo cria a mensagem e envia ao outro processo, que por sua vez pode responder a mensagem se necessário.
Uma mensagem de dados ou “datagrama”, é um conjunto de dados de comprimento conhecido, cujo significado só importa aos processos que estiverem envolvidos nesta troca de dados. Na troca de dados desta forma, um processo cria a mensagem e envia ao outro processo, que por sua vez pode responder a mensagem se necessário.
As mensagens podem ser trocadas de várias formas diferentes, sendo que as mais comuns são:
- Pela rede, que pode ser uma rede local ou a internet.
- Por um meio local, que chama-se “pipe”, ou “socket local” (quando os processos estão no mesmo computador).
Mensagens também servem para sincronizar threads e processos, já que um processo pode ficar “esperando chegar a mensagem” sem usar nenhuma CPU e, ao receber a mensagem, iniciar o tratamento da mesma, enquanto o remetente fica aguardando a resposta.
Em suma, a troca de mensagens é uma forma simples de trocar dados, já que dispensa processos de sincronização e não sofrem condições de concorrência (afinal a mensagem é escrita em um momento e lida em outro). Além disso, são muito mais eficientes do que a troca de dados por arquivos pois não envolvem operações de disco.
Obrigado e até a próxima.
Ariel Nigri
FONTE : WINCO SISTEMAS
Nenhum comentário:
Postar um comentário