Memoria compartilhada - Shared memory

Uma ilustração de um sistema de memória compartilhada de três processadores.

Em ciência da computação , memória compartilhada é a memória que pode ser acessado simultaneamente por vários programas com a intenção de fornecer comunicação entre eles ou evitar cópias redundantes. A memória compartilhada é um meio eficiente de passar dados entre programas. Dependendo do contexto, os programas podem ser executados em um único processador ou em vários processadores separados.

O uso de memória para comunicação dentro de um único programa, por exemplo, entre seus vários threads , também é conhecido como memória compartilhada.

Em hardware

A HSA define um caso especial de compartilhamento de memória, em que o MMU da CPU e o IOMMU da GPU têm um espaço de endereço virtual paginável idêntico.

No hardware do computador, a memória compartilhada se refere a um bloco (tipicamente grande) de memória de acesso aleatório (RAM) que pode ser acessado por várias unidades de processamento central (CPUs) diferentes em um sistema de computador com multiprocessador .

Os sistemas de memória compartilhada podem usar:

Um sistema de memória compartilhada é relativamente fácil de programar, uma vez que todos os processadores compartilham uma única visualização de dados e a comunicação entre os processadores pode ser tão rápida quanto acessos à memória em um mesmo local. O problema com os sistemas de memória compartilhada é que muitas CPUs precisam de acesso rápido à memória e provavelmente armazenarão em cache a memória , o que tem duas complicações:

  • degradação do tempo de acesso: quando vários processadores tentam acessar o mesmo local de memória, isso causa contenção. Tentar acessar locais de memória próximos pode causar um falso compartilhamento . Computadores com memória compartilhada não podem escalar muito bem. A maioria deles tem dez ou menos processadores;
  • falta de coerência dos dados: sempre que um cache é atualizado com informações que podem ser utilizadas por outros processadores, a alteração precisa ser refletida para os outros processadores, caso contrário os diferentes processadores estarão trabalhando com dados incoerentes. Esses protocolos de coerência de cache podem, quando funcionam bem, fornecer acesso de desempenho extremamente alto a informações compartilhadas entre vários processadores. Por outro lado, às vezes eles podem ficar sobrecarregados e tornar-se um gargalo para o desempenho.

Tecnologias como crossbar switches , redes Omega , HyperTransport ou front-side bus podem ser usadas para atenuar os efeitos de gargalo.

No caso de uma Arquitetura de Sistema Heterogêneo (arquitetura de processador que integra diferentes tipos de processadores, como CPUs e GPUs , com memória compartilhada), a unidade de gerenciamento de memória (MMU) da CPU e a unidade de gerenciamento de memória de entrada-saída (IOMMU) de a GPU deve compartilhar certas características, como um espaço de endereço comum.

As alternativas para a memória compartilhada são memória distribuída e memória compartilhada distribuída , cada uma com um conjunto semelhante de problemas.

Em software

No software de computador, a memória compartilhada é

  • um método de comunicação entre processos (IPC), ou seja, uma maneira de trocar dados entre programas em execução ao mesmo tempo. Um processo criará uma área na RAM que outros processos podem acessar;
  • um método de conservação de espaço de memória direcionando acessos ao que normalmente seriam cópias de um dado para uma única instância, usando mapeamentos de memória virtual ou com suporte explícito do programa em questão. Isso é mais frequentemente usado para bibliotecas compartilhadas e para Executar no local (XIP).

Uma vez que ambos os processos podem acessar a área de memória compartilhada como memória de trabalho regular, esta é uma forma muito rápida de comunicação (ao contrário de outros mecanismos de IPC como pipes nomeados , soquetes de domínio Unix ou CORBA ). Por outro lado, é menos escalável, já que, por exemplo, os processos de comunicação devem ser executados na mesma máquina (de outros métodos IPC, apenas soquetes de domínio da Internet - não soquetes de domínio Unix - podem usar uma rede de computador ), e deve-se ter cuidado tomadas para evitar problemas se os processos que compartilham memória estiverem sendo executados em CPUs separadas e a arquitetura subjacente não for coerente com o cache .

O IPC por memória compartilhada é usado, por exemplo, para transferir imagens entre o aplicativo e o servidor X em sistemas Unix, ou dentro do objeto IStream retornado por CoMarshalInterThreadInterfaceInStream nas bibliotecas COM no Windows .

Bibliotecas dinâmicas são geralmente mantidas na memória uma vez e mapeadas para vários processos, e apenas as páginas que tiveram que ser personalizadas para o processo individual (porque um símbolo é resolvido de forma diferente lá) são duplicadas, geralmente com um mecanismo conhecido como cópia na gravação que é transparente copia a página quando uma tentativa de gravação é feita e, em seguida, permite que a gravação seja bem-sucedida na cópia privada.

Comparado aos sistemas operacionais de espaço de endereço múltiplo, o compartilhamento de memória - especialmente de procedimentos de compartilhamento ou estruturas baseadas em ponteiros - é mais simples em sistemas operacionais de espaço de endereço único .

Suporte em sistemas tipo Unix

POSIX fornece uma API padronizada para o uso de memória compartilhada, POSIX Shared Memory . Isso usa a função shm_opende sys / mman.h. Comunicação POSIX entre processos (parte do POSIX: XSI Extensão) inclui as funções de memória compartilhada shmat, shmctl, shmdte shmget. O Unix System V também fornece uma API para memória compartilhada. Isso usa shmget de sys / shm.h. Os sistemas BSD fornecem "memória mapeada anônima" que pode ser usada por vários processos.

A memória compartilhada criada por shm_opené persistente. Ele permanece no sistema até que seja explicitamente removido por um processo. Isso tem a desvantagem de que, se o processo travar e não conseguir limpar a memória compartilhada, ele permanecerá até o desligamento do sistema.

POSIX também fornece a mmapAPI para mapear arquivos na memória; um mapeamento pode ser compartilhado, permitindo que o conteúdo do arquivo seja usado como memória compartilhada.

Distribuições Linux baseadas no kernel 2.6 e posterior oferecem / dev / shm como memória compartilhada na forma de um disco RAM , mais especificamente como um diretório gravável mundial (um diretório no qual cada usuário do sistema pode criar arquivos) que é armazenado em memória. Ambas as distribuições baseadas em RedHat e Debian o incluem por padrão. O suporte para este tipo de disco RAM é totalmente opcional no arquivo de configuração do kernel .

Suporte no Windows

No Windows, pode-se usar CreateFileMappinge MapViewOfFilefunções para mapear uma região de um arquivo na memória em vários processos.

Suporte multiplataforma

Algumas bibliotecas C ++ fornecem um acesso portátil e orientado a objetos à funcionalidade de memória compartilhada. Por exemplo, Boost contém a biblioteca Boost.Interprocess C ++ e Qt fornece a classe QSharedMemory.

Suporte a linguagem de programação

Para linguagens de programação com ligações POSIX (digamos, C / C ++), regiões de memória compartilhada podem ser criadas e acessadas chamando as funções fornecidas pelo sistema operacional. Outras linguagens de programação podem ter suas próprias maneiras de usar esses recursos operacionais para efeitos semelhantes. Por exemplo, o PHP fornece uma API para criar memória compartilhada, semelhante às funções POSIX .

Veja também

Referências

links externos