Comunicação entre processos
Autor: Hermano | Publicado: 2013-11-21T07:46:00-08:00


O método de comunicação entre processos, chamado de troca de
mensagens, utiliza duas primitivas, send
e receive (enviar e receber) [1]. O sistema FESO possui chamadas ao sistema para
possibilitar o uso dessas primitivas, e consequentemente permitir que os
processos e threads troquem
informações e também possam ser sincronizados.





Portas



O sistema FESO utiliza o conceito de portas. As portas possuem
um número e funcionam de forma análoga a uma caixa postal. Um thread pode alocar uma porta e desta
maneira, sempre que uma mensagem for enviada para a porta alocada, será
redirecionada para o thread que a
alocou.&nbsp; Com isso, um thread de um processo servidor pode
alocar sempre as mesmas portas, que são previamente conhecidas pelos seus
clientes, e que sempre envião suas solicitações para ela.



Os threads também
utilizam portas para serem sinalizados no caso da ocorrência de algum evento no
sistema. Por exemplo, as 20 primeiras portas estão relacionadas às IRQs (interrupt request), ou seja, aos sinais
enviados ao processador pelo hardware para relatar o acontecimento de eventos.
Sempre que uma IRQ ocorre, o sistema operacional verifica se a porta referente
aquele IRQ está alocada a algum thread.
Se uma IRQ ocorrer, uma mensagem é enviada ao thread informando a ocorrência da interrupção. Está é a maneira que
os processos servidores para drivers de dispositivos têm de serem sinalizados
sempre que uma interrupção for disparada.



As portas também são utilizadas para que os processos possam ser
avisados de eventos que ocorrem dentro do núcleo
do sistema. Algumas portas são reservadas exclusivamente para esses eventos, e
sempre que eles ocorrem, uma mensagem é encaminhada para avisar os threads. A tabela &nbsp;mostra uma lista de
portas, e seus eventos correspondentes. 



Em um dado instante de tempo, apenas um thread pode ter uma determinada porta alocada. A única exceção são
as portas de eventos do kernel, que
permitem que diversos threads a
aloquem ao mesmo tempo. As primeiras 1000 portas estão reservadas para drivers de dispositivo, e threads de processos de usuário não
podem utilizá-las. Uma vez que um thread
aloca uma porta, está fica alocada por ele, até que o thread termine sua execução.




 

  
Porta

  
Evento

 

  
20

  
Processo Criado

 

  
21

  
Processo Finalizado

 

  
22

  
Porta Alocada

 

  
23

  
Porta Desalocada

 

  
24

  
Evento do Sistema de Arquivos Virtual

 

  
25

  
Exceção

 






&nbsp;<!--[endif]-->Envio e Recebimento de Mensagens



O sistema de troca de mensagens fornece algumas chamadas básicas
para a comunicação. Uma para alocação de portas, uma para o recebimento, e duas
para o envio. A chamada para alocação permite que um thread especifique qual porta ele pretende alocar.



A chamada para o recebimento é simples. Os processos especificam
se existe alguma restrição de destinatário na hora da chamada de recebimento, e
entram em estado de espera por uma mensagem. Caso exista uma restrição de
porta, o thread só voltará a executar
quando uma mensagem vinda de uma determinada porta for recebida (no caso de
clientes esperando respostas de servidores) ou quando uma mensagem recebida
tiver sido destinada a uma determinada porta (no caso de servidores esperando
por clientes). Quando não há restrições o thread
retoma sua execução quando mensagem chega, independente de sua origem. As
mensagens tem um limite de 100 bytes,
e cabe ao processo especificar um buffer
para o armazenamento do conteúdo da mensagem durante seu recebimento.



Para o envio de mensagens, existem duas opções. Uma mensagem
pode ser enviada para uma porta ou diretamente para um thread. Se a mensagem for enviada a uma porta, e ela estiver
alocada por um servidor, o thread
emissor fica obrigatoriamente esperando por uma mensagem de resposta. Existe
também a opção do envio de uma mensagem endereçada diretamente a um thread especifico através de seu
identificador.&nbsp;



Esta modalidade de envio não bloqueia o thread emissor, e é utilizada para que processos servidores
consigam se comunicar com seus clientes. A figura mostra um exemplo de
comunicação entre um cliente e um servidor, utilizando as chamadas
disponibilizadas pelo sistema operacional.



As mensagens são utilizadas para comunicação entre os drivers de dispositivos e seus clientes.
As mensagens possuem um tamanho fixo de 100 bytes
para simplificar a implementação e evitar a troca de uma quantidade maior de
dados através do sistema de mensagens. Quando os processos precisam trocar uma
maior quantidade de dados entre si, eles podem utilizar um arquivo criado no
sistema de arquivos virtual, para o qual não há limite de tamanho. A mensagem
pode ser utilizada para especificar o caminho do arquivo, ou para trocas de
outras informações que sejam importantes para os threads envolvidos.






[1]&nbsp;TANEBAUM, Andrew S; WOODHULL, Albert S. Sistemas Operacionais: Projeto e Implementação. 2. ed. Porto Alegre: Bookman, 2000