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.