Entendo que duas das muitas mais opções de comunicação entre processos podem ser:
- Memoria compartilhada
- tomadas
Na verdade, vi essas duas opções sendo expostas pelo Intellij Idea para depurar um aplicativo Java. Quero saber quais são os prós e os contras de cada abordagem.
Respostas:
Algumas vantagens para cada um em cima da minha cabeça. Observe que alguns desses itens podem não se aplicar a todos os casos; estas são apenas observações gerais.
tomadas
Simples e controlado. Pode ser estendido para soquetes de rede conforme necessário, com pouca ou nenhuma modificação. O modelo de programação requer serialização, o que exige que você pense sobre quais dados são realmente transferidos de A para B. A sincronização é necessariamente incorporada ao mecanismo de comunicação; nenhuma outra sincronização é necessária.
Memoria compartilhada
Não requer necessariamente um syscall (portanto, potencialmente mais rápido). O compartilhamento não exige que os dados sejam transferidos explicitamente - é possível disponibilizar dados que o destinatário não recupera (a largura de banda não precisa ser desperdiçada na transferência de dados que o destinatário não utilizará). Nenhuma etapa de serialização / desserialização significa que não há tempo gasto na sobrecarga da comunicação.
fonte
Os soquetes são individuais. Você precisa de vários soquetes se desejar enviar a mesma coisa para vários processos. Com a memória compartilhada, você pode ter vários leitores e também vários gravadores.
Soquetes consomem muitos recursos. Toda e qualquer mensagem passa pelo sistema operacional. Com a memória compartilhada, você mapeia a memória compartilhada, mas uma vez na memória do aplicativo e a partir de então é seu. No entanto, você ainda precisa acessar o sistema operacional quando usou a memória compartilhada; ver abaixo.
Soquetes são sincronizados (desde que você não use o UDP). Com a memória compartilhada, você quase inevitavelmente precisa de algum mecanismo adicional para informar aos outros processos que não há problema em ler ou gravar na memória compartilhada. Não faça isso e você terá problemas com a memória corrompida. Exemplo: suponha que o processo A comece a ler um pedaço de memória compartilhada, mas seja trocado na metade da leitura. O processo B grava no mesmo pedaço de memória compartilhada. Quando o processo A é reiniciado e continua lendo a memória compartilhada, o que ele leu é uma mistura de dados antigos e novos. Para evitar isso, você ainda passa pelo sistema operacional quando estiver usando memória compartilhada.
É bastante fácil converter um conjunto de aplicativos baseados em soquete em um que usa soquetes de rede. Você pode espalhar o processamento para todas as máquinas do seu laboratório, ou ainda mais longe. simplesmente não pode fazer isso com memória compartilhada. Você está bloqueado em uma máquina com uma solução baseada em memória compartilhada.
Os soquetes destinam-se a baixos volumes de dados, memória compartilhada a grandes volumes de dados. Os diferentes mecanismos existem para resolver diferentes problemas.
fonte