Quais são os prós e os contras da comunicação entre processos feita por soquetes versus memória compartilhada?

9

Entendo que duas das muitas mais opções de comunicação entre processos podem ser:

  1. Memoria compartilhada
  2. 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.

Nerd
fonte
Um método mais recente é o D-Bus.
ott--
@ ott-- O D-Bus não usa soquetes de domínio Unix?
@BrianMarshall Na verdade, domínio e soquetes TCP / IP.
ott--
Há respostas aqui também: stackoverflow.com/a/1844919/632951
Pacerier

Respostas:

11

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.

tylerl
fonte
4
+1: os soquetes escalam para sistemas distribuídos, enquanto a memória compartilhada é muito mais rápida.
Mouviciel
@tylerl Por que a memória compartilhada não requer um syscall?
12773 Geek
@ Geek: Leia sobre como o gerenciamento de memória virtual é implementado nos sistemas operacionais modernos. Basicamente, a memória compartilhada é implementada quase idêntica à memória de processo normal. Acontece que a mesma página física é propositalmente mapeada em 2 (ou N) processos diferentes. Mas uma vez que o mapeamento é estabelecido, * px = 5 produz o mesmo conjunto de instruções, independentemente se px aponta para uma variável regular ou se aponta dentro de um segmento de memória compartilhada.
DXM
tecnicamente, você não precisa serializar dados em um soquete se o destino puder aceitar um fluxo de bytes brutos no formato enviado. A maioria das pessoas obviamente serializa para poder enviar para qualquer pessoa.
Gbjbaanb
11
@gbjbaanb Acho que tecnicamente você está serializando dados se eles forem transmitidos como uma sequência seqüencial de bits, não importa qual seja a estrutura de codificação.
tylerl
6

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.

David Hammen
fonte