Memória compartilhada
# Memória compartilhada

Em computação, memória compartilhada é uma memória que pode ser acessada simultaneamente por múltiplos programas com a intenção de prover comunicação entre eles ou para evitar cópias redundantes. Dependendo do contexto, os programas podem ser executados em somente um processador ou por pelo menos dois processadores distintos. O conceito de memória compartilhada geralmente não inclui usar a memória para a comunicação de diferentes threads de um mesmo processo.

## Em hardware

No hardware, a memória compartilhada se refere tipicamente a grandes blocos de RAM que podem ser acessados por diferentes unidades centrais de processamento (CPU) em um sistema de multiprocessamento. Um sistema de memória compartilhada é simples de ser programado já que todos os processadores compartilham a mesma visão dos dados, e a comunicação entre processadores pode ser tão rápida quanto o acesso à memória na mesma posição.
O problema com sistema de memória compartilhada é que várias CPU necessitam acesso rápido à memória e por isso utilizam sistemas de cache na própria CPU, o que possui duas complicações. A primeira é que conexão da CPU para a memória se torna um gargalo no sistema. Computadores com memória compartilhada não possuem boa escalabilidade. A segunda diz respeito à integridade do cache, a condição de que ele esteja atualizado com as informações corretas, mais atuais. Mudanças no cache de um processador devem ser replicadas nos outros.
Alternativas ao sistema de memória compartilhada incluem memória distribuída e memória compartilhada distribuída, que por sua vez também possuem um conjunto de problemas próprios.

## Em software

Em software, a memória compartilhada é tanto um método de comunicação entre processos quanto um método de conservação do espaço de memória. Para o primeiro, um processo pode criar uma área na RAM que outros processos sendo executados simultaneamente pode acessar. Para o segundo, ao invés de replicar cópias de blocos de memória entre diferentes processos, há somente uma instância.
Já que ambos os processos podem acessar a memória compartilhada como outra memória qualquer, este é um método muito rápido de comunicação entre processos (em contraste de outros métodos como pipe nomeado, socket Unix ou sistemas como o CORBA). Por outro lado, não é tão robusto dado que, por exemplo, os processos devem estar sendo executados numa mesma máquina, enquanto há métodos de comunicação entre processos que podem interagir numa rede de computadores. Deve-se tomar cuidado também com a questão da integridade do cache citada acima, caso a arquitetura já não o faça.
Usos de memória compartilhada para a comunicação entre processos inclui a transferência de imagens entre aplicações e o servidor X em sistemas Unix, ou dentro do objeto IStream retornado por CoMarshalInterThreadInterfaceInStream nas bibliotecas COM em sistemas Windows.