Please enable JavaScript.
Coggle requires JavaScript to display documents.
Capitulo 8, Comunicação entre Tarefas - Coggle Diagram
Capitulo 8
Gabriel Bérti - 2127938
Luis Felipe Moro - 2128020
Comunicação entre Tarefas
Objetivos
Atender vários usuários simultâneos:
Servidores de rede são implementados com vários processos ou threads, para atender simultaneamente todos os usuários conectados.
Uso de computadores multiprocessador:
Para aumentar a velocidade de execução de uma aplicação, esta deve ser “quebrada” em várias tarefas cooperantes, que poderão ser escalonadas simultaneamente nos processadores disponíveis.
Modularidade:
Um sistema muito grande e complexo pode ser melhor organizado dividindo suas atribuições em módulos sob a responsabilidade de tarefas interdependentes. Cada módulo tem suas próprias responsabilidades e coopera com os demais módulos quando necessário.
Construção de aplicações interativas:
Nelas, tarefas associadas à interface reagem a comandos do usuário, enquanto outras tarefas comunicam através da rede, fazem a revisão ortográfica do texto, renderizam imagens na janela, etc.
Escopo da Comunicação:
Tarefas cooperantes precisam trocar informações entre si.
Os mecanismos de comunicação são habitualmente denominados de forma genérica como
“mecanismos IPC” (Inter-Process Communication)
.
Implementar a comunicação entre tarefas pode ser simples ou complexo, dependendo da situação. Se as tarefas estão no mesmo processo, elas compartilham a mesma área de memória e a comunicação pode então ser implementada facilmente, usando variáveis globais comuns.
Caso as tarefas pertençam a processos distintos, não existem variáveis compartilhadas; neste caso, a comunicação tem de ser feita por intermédio do núcleo do sistema operacional, usando chamadas de sistema.
Caso as tarefas estejam em computadores distintos, o núcleo deve implementar mecanismos de comunicação específicos, fazendo uso de mecanismos de comunicação em rede.
Aspectos da Comunicação
Comunicação direta ou indireta: a comunicação entre tarefas pode ser implementada por duas primitivas básicas:
enviar (dados, destino)
, que envia os dados relacionados ao destino indicado, e
receber (dados, origem)
, que recebe os dados previamente enviados pela origem indicada.
Essa abordagem, na qual o emissor identifica claramente
receptor e vice-versa, é denominada
comunicação direta.
Poucos sistemas empregam a comunicação direta; na prática são utilizados mecanismos de
comunicação indireta
, por serem mais flexíveis. Na comunicação indireta, emissor e receptor não precisam se conhecer, pois não interagem diretamente entre si. Eles se relacionam através de um
canal de comunicação
, que é criado pelo sistema operacional.
Sincronismo
Síncrona (ou bloqueante)
: quando as operações de envio e recepção de dados bloqueiam (suspendem) as tarefas envolvidas até a conclusão da comunicação: o emissor será bloqueado até que a informação seja recebida pelo receptor, e vice-versa.
Assíncrona (ou não-bloqueante)
: em um sistema com comunicação assíncrona, as primitivas de envio e recepção não são bloqueantes: caso a comunicação não seja possível no momento em que cada operação é invocada, esta retorna imediatamente com uma indicação de erro.
Caso o emissor e o receptor operem ambos de forma assíncrona, torna-se necessário criar um canal ou
buffer
para armazenar os dados da comunicação entre eles.
Semissíncrona (ou semibloqueante)
: primitivas de comunicação semissíncronas têm um comportamento síncrono (bloqueante) durante um prazo predefinido. Caso esse prazo se esgote sem que a comunicação tenha ocorrido, a primitiva se encerra com uma indicação de erro.
Formato de Envio
: A informação enviada pelo emissor ao receptor pode ser vista basicamente de duas formas: como uma
sequência de mensagens
independentes, cada uma com seu próprio conteúdo, ou como um
fluxo sequencial
e contínuo de dados, imitando o comportamento de um arquivo com acesso sequencial.
Na abordagem baseada em
mensagens
, cada mensagem consiste de um pacote de dados que pode ser tipado ou não. Esse pacote é recebido ou descartado pelo receptor em sua íntegra; não existe a possibilidade de receber “meia mensagem”.
Caso a comunicação seja definida como um
fluxo contínuo de dados
, o canal de comunicação é visto como o equivalente a um arquivo: o emissor “escreve” dados nesse canal, que serão “lidos” pelo receptor respeitando a ordem de envio dos dados.
Não há separação lógica entre os dados enviados em operações separadas: eles podem ser lidos byte a byte ou em grandes blocos a cada operação de recepção, a critério do receptor.
Capacidade dos Canais
: O comportamento síncrono ou assíncrono de um canal de comunicação pode ser afetado pela presença de
buffers
que permitam armazenar temporariamente os dados em trânsito, ou seja, as informações enviadas pelo emissor e que ainda não foram recebidas pelo receptor.
Capacidade nula
(
n
= 0): neste caso, o canal não pode armazenar dados; a comunicação é feita por transferência direta dos dados do emissor para o receptor, sem cópias intermediárias
Caso a comunicação seja síncrona, o emissor permanece bloqueado até que o destinatário receba os dados, e vice versa. Essa situação específica (comunicação síncrona com canais de capacidade nula) implica em uma forte sincronização entre as partes, sendo por isso denominada
Rendez-Vous
.
Por outro lado, a comunicação assíncrona torna-se inviável usando canais de capacidade nula.
Capacidade infinita
(
n
= ∞): o emissor sempre pode enviar dados, que serão armazenados no
buffer
do canal enquanto o receptor não os consumir.
Capacidade finita
(0 <
n
< ∞): neste caso, uma quantidade finita (
n
) de dados pode ser enviada pelo emissor sem que o receptor os consuma. Todavia, ao tentar enviar dados em um canal já saturado, o emissor poderá ficar bloqueado até surgir espaço no
buffer
do canal e conseguir enviar (comportamento síncrono) enviar dados em um canal já saturado, o emissor poderá ficar bloqueado até surgir espaço no buffer do canal e conseguir enviar (comportamento síncrono)
Essa simplificação é útil no estudo dos algoritmos de comunicação e sincronização, pois torna menos complexas a modelagem e análise dos mesmos.
Confiabilidade dos canais
: Quando um canal de comunicação transporta todos os dados enviados através dele para seus receptores, respeitando seus valores e a ordem em que foram enviados, ele é chamado de
canal confiável
. Caso contrário, trata-se de um
canal não-confiável
.
Perda de dados
: nem todos os dados enviados através do canal chegam ao seu destino; podem ocorrer perdas de mensagens ou de sequências de bytes
Perda de integridade
: os dados enviados pelo canal chegam ao seu destino, mas podem ocorrer modificações em seus valores devido a interferências externas.
Perda da ordem
: todos os dados enviados chegam íntegros ao seu destino, mas o canal não garante que eles serão entregues na ordem em que foram enviados.
Número de participantes
1:1
: quando exatamente um emissor e um receptor interagem através do canal de comunicação
M:N
: quando um ou mais emissores enviam mensagens para um ou mais receptores.
Duas situações distintas podem se apresentar neste caso:
Cada mensagem é recebida por apenas um receptor (em geral aquele que pedir primeiro); neste caso a comunicação continua sendo ponto-a-ponto, através de um canal compartilhado. Essa abordagem é conhecida
como
mailbox
.
Cada mensagem é recebida por vários receptores (cada receptor recebe uma cópia da mensagem). Essa abordagem, é conhecida como
barramento de mensagens (message bus), canal de eventos ou ainda canal publish-subscribe
. Na área de redes, essa forma de comunicação é chamada de
difusão de mensagens (multicast)
.