Como é feita a comunicação entre processos?

Um processo pode ser de dois tipos:

  • Processo independente.
  • Processo de cooperação.

Um processo independente não é afetado pela execução de outros processos, enquanto um processo de cooperação pode ser afetado por outros processos em execução. Embora se possa pensar que esses processos, que estão sendo executados de forma independente, serão executados de forma muito eficiente, na realidade, existem muitas situações em que a natureza cooperativa pode ser utilizada para aumentar a velocidade computacional, conveniência e modularidade. A comunicação entre processos (IPC) é um mecanismo que permite que os processos se comuniquem entre si e sincronizem suas ações. A comunicação entre esses processos pode ser vista como um método de cooperação entre eles. Os processos podem se comunicar entre si por meio de:
 

  1. Memoria compartilhada
  2. Passagem de mensagem

A Figura 1 abaixo mostra uma estrutura básica de comunicação entre processos por meio do método de memória compartilhada e por meio do método de passagem de mensagens. 
 

Um sistema operacional pode implementar ambos os métodos de comunicação. Primeiro, discutiremos os métodos de comunicação de memória compartilhada e, em seguida, a passagem de mensagens. A comunicação entre processos usando memória compartilhada requer que os processos compartilhem alguma variável, e isso depende completamente de como o programador irá implementá-lo. Uma forma de comunicação usando memória compartilhada pode ser imaginada assim: suponha que o processo1 e o processo2 estejam sendo executados simultaneamente e eles compartilham alguns recursos ou usam algumas informações de outro processo. Process1 gera informações sobre certos cálculos ou recursos que estão sendo usados ​​e os mantém como um registro na memória compartilhada. Quando o processo2 precisa usar as informações compartilhadas, ele verifica o registro armazenado na memória compartilhada e toma nota das informações geradas pelo processo1 e age de acordo. 
Vamos discutir um exemplo de comunicação entre processos usando o método de memória compartilhada.
 

Como é feita a comunicação entre processos?

i) Método de Memória Compartilhada

Ex: problema produtor-consumidor 
Existem dois processos: produtor e consumidor. O produtor produz alguns itens e o consumidor consome esse item. Os dois processos compartilham um espaço comum ou local de memória conhecido como buffer onde o item produzido pelo produtor é armazenado e do qual o consumidor consome o item, se necessário. Existem duas versões desse problema: a primeira é conhecida como problema de buffer ilimitado em que o produtor pode continuar produzindo itens e não há limite para o tamanho do buffer, a segunda é conhecida como problema de buffer limitado em que o produtor pode produzir até um certo número de itens antes de começar a esperar que o consumidor os consuma. Discutiremos o problema do buffer limitado. Primeiro, o produtor e o consumidor compartilharão alguma memória comum e, em seguida, o produtor começará a produzir itens. Se o item total produzido for igual ao tamanho do buffer, o produtor irá esperar para que seja consumido pelo Consumidor. Da mesma forma, o consumidor verificará primeiro a disponibilidade do item. Se nenhum item estiver disponível, o consumidor aguardará o produtor para produzi-lo. Se houver itens disponíveis, o consumidor os consumirá. O pseudocódigo para demonstrar é fornecido abaixo:
Dados compartilhados entre os dois processos 
 

#define buff_max 25
#define mod %
 
    struct item{
 
        // different member of the produced data
        // or consumed data   
        ---------
    }
     
    // An array is needed for holding the items.
    // This is the shared place which will be 
    // access by both process  
    // item shared_buff [ buff_max ];
      
    // Two variables which will keep track of
    // the indexes of the items produced by producer
    // and consumer The free index points to
    // the next free index. The full index points to
    // the first full index.
    int free_index = 0;
    int full_index = 0;
  

Código de Processo do Produtor 
 

item nextProduced;
     
    while(1){
         
        // check if there is no space
        // for production.
        // if so keep waiting.
        while((free_index+1) mod buff_max == full_index);
         
        shared_buff[free_index] = nextProduced;
        free_index = (free_index + 1) mod buff_max;
    }

Código de Processo do Consumidor 
 

item nextConsumed;
     
    while(1){
         
        // check if there is an available
        // item  for consumption.
        // if not keep on waiting for
        // get them produced.
        while((free_index == full_index);
         
        nextConsumed = shared_buff[full_index];
        full_index = (full_index + 1) mod buff_max;
    }

No código acima, o produtor começará a produzir novamente quando o (free_index + 1) mod buff max estiver livre porque se não for livre, isso implica que ainda existem itens que podem ser consumidos pelo consumidor, portanto, não há necessidade para produzir mais. Da mesma forma, se o índice livre e o índice completo apontarem para o mesmo índice, isso significa que não há itens para consumir.
 

ii) Método de transmissão de mensagens

Agora, iniciaremos nossa discussão sobre a comunicação entre processos por meio da passagem de mensagens. Nesse método, os processos se comunicam entre si sem usar nenhum tipo de memória compartilhada. Se dois processos p1 e p2 desejam se comunicar, eles procedem da seguinte maneira:
 

  • Estabeleça um link de comunicação (se já existir um link, não há necessidade de estabelecê-lo novamente).
  • Comece a trocar mensagens usando primitivas básicas.
    Precisamos de pelo menos duas primitivas: 
    - enviar (mensagem, destino) ou enviar (mensagem) 
    - receber (mensagem, host) ou receber (mensagem)

Como é feita a comunicação entre processos?

O tamanho da mensagem pode ser fixo ou variável. Se for de tamanho fixo, é fácil para um designer de sistema operacional, mas complicado para um programador, e se for de tamanho variável, é fácil para um programador, mas complicado para o designer de sistema operacional. Uma mensagem padrão pode ter duas partes: cabeçalho e corpo.  
A parte do cabeçalho é usada para armazenar o tipo de mensagem, id de destino, id de origem, comprimento da mensagem e informações de controle. As informações de controle contêm informações como o que fazer se ficar sem espaço no buffer, número de sequência, prioridade. Geralmente, a mensagem é enviada usando o estilo FIFO.
  

Mensagem que passa pelo link de comunicação.
Link de comunicação direta e indireta 
Agora, iniciaremos nossa discussão sobre os métodos de implementação de links de comunicação. Ao implementar o link, existem algumas questões que precisam ser mantidas em mente, como: 
 

  1. Como os links são estabelecidos?
  2. Um link pode ser associado a mais de dois processos?
  3. Quantos links pode haver entre cada par de processos de comunicação?
  4. Qual é a capacidade de um link? O tamanho de uma mensagem que o link pode acomodar é fixo ou variável?
  5. Um link é unidirecional ou bidirecional?

Um link tem alguma capacidade que determina o número de mensagens que podem residir nele temporariamente, para as quais cada link tem uma fila associada a ele, que pode ter capacidade zero, capacidade limitada ou capacidade ilimitada. Em capacidade zero, o remetente espera até que o destinatário informe ao remetente que recebeu a mensagem. Em casos de capacidade diferente de zero, um processo não sabe se uma mensagem foi recebida ou não após a operação de envio. Para isso, o remetente deve se comunicar com o destinatário de forma explícita. A implementação do link depende da situação, pode ser um link de comunicação direta ou um link de comunicação direcionada. 
Links de comunicação diretasão implementados quando os processos usam um identificador de processo específico para a comunicação, mas é difícil identificar o remetente com antecedência. 
Por exemplo, o servidor de impressão.
A comunicação direta é feita por meio de uma caixa de correio compartilhada (porta), que consiste em uma fila de mensagens. O remetente mantém a mensagem na caixa de correio e o destinatário a pega.
 

Mensagem que passa através da troca de mensagens.

Passagem de mensagens síncrona e assíncrona: 
um processo bloqueado é aquele que está aguardando algum evento, como a disponibilização de um recurso ou a conclusão de uma operação de E / S. O IPC é possível entre os processos no mesmo computador, bem como nos processos em execução em outro computador, ou seja, em um sistema distribuído / em rede. Em ambos os casos, o processo pode ou não ser bloqueado durante o envio de uma mensagem ou tentativa de recebimento de uma mensagem, de modo que a passagem da mensagem pode ser bloqueadora ou não. O bloqueio é considerado síncrono e o bloqueio do envio significa que o remetente será bloqueado até que a mensagem seja recebida pelo destinatário. Da mesma forma, bloquear o recebimento faz com que o receptor bloqueie até que uma mensagem esteja disponível. O não bloqueio é consideradoO envio assíncrono e sem bloqueio faz com que o remetente envie a mensagem e continue. Da mesma forma, o recebimento sem bloqueio faz com que o receptor receba uma mensagem válida ou nula. Após uma análise cuidadosa, podemos chegar à conclusão de que para um remetente é mais natural não bloquear após a passagem da mensagem, pois pode haver a necessidade de enviar a mensagem para diferentes processos. No entanto, o remetente espera a confirmação do destinatário caso o envio falhe. Da mesma forma, é mais natural para um receptor bloquear após emitir o recebimento, pois as informações da mensagem recebida podem ser usadas para execução posterior. Ao mesmo tempo, se o envio da mensagem continuar falhando, o receptor terá que esperar indefinidamente. É por isso que também consideramos a outra possibilidade de transmissão de mensagens. Existem basicamente três combinações preferidas:
 

  • Bloqueio de envio e bloqueio de recebimento
  • Envio sem bloqueio e recebimento sem bloqueio
  • Envio sem bloqueio e recebimento com bloqueio (usado principalmente)

Na passagem direta de mensagens , o processo que deseja se comunicar deve nomear explicitamente o destinatário ou remetente da comunicação. 
por exemplo, enviar (p1, mensagem) significa enviar a mensagem para p1. 
Da mesma forma, receber (p2, mensagem) significa receber a mensagem de p2. 
Neste método de comunicação, o link de comunicação é estabelecido automaticamente, que pode ser unidirecional ou bidirecional, mas um link pode ser usado entre um par de remetente e receptor e um par de remetente e receptor não deve possuir mais de um par de links. Simetria e assimetria entre envio e recebimento também podem ser implementadas, ou seja, ambos os processos se nomearão para enviar e receber as mensagens ou apenas o remetente nomeará o destinatário para enviar a mensagem e não há necessidade do destinatário para nomear o remetente para recebendo a mensagem. O problema com esse método de comunicação é que, se o nome de um processo for alterado, esse método não funcionará.
Na passagem indireta de mensagens, os processos usam caixas de correio (também chamadas de portas) para enviar e receber mensagens. Cada caixa de correio possui uma identificação exclusiva e os processos podem se comunicar apenas se compartilharem uma caixa de correio. Link estabelecido apenas se os processos compartilham uma caixa de correio comum e um único link pode ser associado a vários processos. Cada par de processos pode compartilhar vários links de comunicação e esses links podem ser unidirecionais ou bidirecionais. Suponha que dois processos queiram se comunicar por meio da passagem indireta de mensagens, as operações necessárias são: criar uma caixa de correio, usar essa caixa de correio para enviar e receber mensagens e, em seguida, destruir a caixa de correio. As primitivas padrão utilizadas são: enviar (A, mensagem) que significa enviar a mensagem para a caixa de correio A. A primitiva para receber a mensagem também funciona da mesma maneira, por exemplo, recebida (A, mensagem). Há um problema com a implementação dessa caixa de correio. Suponha que haja mais de dois processos compartilhando a mesma caixa de correio e suponha que o processo p1 envie uma mensagem para a caixa de correio, qual processo será o receptor? Isso pode ser resolvido impondo que apenas dois processos possam compartilhar uma única caixa de correio ou impondo que apenas um processo tenha permissão para executar o recebimento em um determinado momento ou selecione qualquer processo aleatoriamente e notifique o remetente sobre o destinatário. Uma caixa de correio pode ser privada para um único par remetente / receptor e também pode ser compartilhada entre vários pares remetente / destinatário. A porta é uma implementação dessa caixa de correio que pode ter vários remetentes e um único receptor. É usado em aplicações cliente / servidor (neste caso, o servidor é o receptor). A porta pertence ao processo receptor e é criada pelo sistema operacional a pedido do processo receptor e pode ser destruída a pedido do mesmo processador receptor quando o receptor se encerrar. Impor que apenas um processo seja permitido para executar o recebimento pode ser feito usando o conceito de exclusão mútua.A caixa de correio Mutex é criada e compartilhada por n processos. O remetente não bloqueia e envia a mensagem. O primeiro processo que executa o recebimento entrará na seção crítica e todos os demais processos estarão bloqueando e aguardando.
Agora, vamos discutir o problema produtor-consumidor usando o conceito de passagem de mensagem. O produtor coloca itens (dentro das mensagens) na caixa de correio e o consumidor pode consumir um item quando pelo menos uma mensagem estiver presente na caixa de correio. O código é fornecido abaixo:
Código do produtor 
 

void Producer(void){
         
        int item;
        Message m;
         
        while(1){
             
            receive(Consumer, &m);
            item = produce();
            build_message(&m , item ) ;
            send(Consumer, &m);
        }
    }

Código do Consumidor 
 

void Consumer(void){
         
        int item;
        Message m;
         
        while(1){
             
            receive(Producer, &m);
            item = extracted_item();
            send(Producer, &m);
            consume_item(item);
        }
    }

Exemplos de sistemas IPC 
 

  1. Posix: usa o método de memória compartilhada.
  2. Mach: usa passagem de mensagens
  3. Windows XP: usa passagem de mensagens usando chamadas procedurais locais

Comunicação na arquitetura cliente / servidor:
Existem vários mecanismos: 
 

  • Tubo
  • Soquete
  • Chamadas procedurais remotas (RPCs)

Os três métodos acima serão discutidos em artigos posteriores, pois todos eles são bastante conceituais e merecem seus próprios artigos separados.
Referências: 
 

  1. Conceitos de sistema operacional de Galvin et al.
  2. Notas de aula / ppt de Ariel J. Frank, Bar-Ilan University

Mais referências: 
http://nptel.ac.in/courses/106108101/pdf/Lecture_Notes/Mod%207_LN.pdf  
https://www.youtube.com/watch?v=lcRqHwIn5Dk
Este artigo foi contribuído por Durgesh Pandey . Escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima. Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo e enviá-lo para . Veja o seu artigo na página principal do GeeksforGeeks e ajude outros Geeks.
 

Aprenda todos os conceitos do GATE CS com aulas gratuitas ao vivo em nosso canal do youtube.

Como acontece a comunicação entre processos?

A troca de mensagens entre dois processos é feita através de duas operações de comunicação: send e receive. Assim para que um processo se comunique com o outro, o processo origem envia ( send ) uma mensagem para um destino , onde um outro processo recebe a mensagem ( receive ).

Quais são os tipos de comunicação entre processos?

Modelos de Comunicação entre Processos..
Ambiente de Cooperação entre Processos..
Mecanismos locais..
Mecanismos cliente/servidor..
Sincronização entre processos..
Mecanismos de passagem de mensagem..
Sockets..
Passagem de mensagem..

Como é feita a sincronização e comunicação entre processos?

Toda vez que algum processo faz uma chamada a um procedimento, o monitor verifica se já existe outro processo executando algum procedimento do monitor. Caso exista, o processo ficará aguardando a sua vez em uma fila de entrada. Também é um mecanismo de comunicação e sincronização entre processos.

Como funciona o compartilhamento de memória entre dois processos?

O Compartilhamento de Memória é um mecanismo de comunicação entre processos que usa uma área de memória, um buffer que é compartilhado entre os vários processos de uma aplicação concorrente. Os processos compartilham informações em operações de escrita e leitura através do buffer de memória.