Compartilhamento de memória

1. Como é realizada

O mecanismo que permite a criação de regiões de memória compartilhada estão agrupados juntamente com outros mecanismos de comunicação interprocessos – os IPC, Interprocess comunication. Além da memória compartilhada, podemos citar como IPC, os semáforos e a troca de mensagens. As estruturas de dados de IPC são chamadas de recursos IPC, estão presentes o tempo todo na memória até que o sistema seja desligado ou seja excluído explicitamente por um processo. Através de chaves de, IPC keys, essas estruturas são identificadas unicamente pelo kernel, possibilitando o acesso pelos processos.
Quando se trata de uma região de memória compartilhada, utiliza-se a chamada shmat(), para adicionar esta região às regiões de memória do processo, ou seja, ela será mapeada no seu espaço de endereçamento mas não neste momento. O que ocorre, realmente, é a marcação de uma página dummy , quando ela é requisitada, ocorre um page-fault que realizará a chamada do_no_page(), responsável por realizar o método nopage específico daquele tipo de página, neste caso, para uma região compartilhada que é então encontrada na lista de regiões compartilhadas e adicionada à tabela de páginas, este método é o shmem_nopage().

2. Como fazer?

A interface utilizada por um desenvolvedor para utilizar a memória compartilhada disponível no Linux está declarada no arquivo de cabeçalho sys/shm.h.
As principais funções são:

  • int shm_get(key_t key, size_t size, int shmflg) - obtém um identificador para a região de memória compartilhada que possui a chave key, de tamanho size e com as permissões definidas em shmflg.
  • void* shmat(int shmid, const void *shmaddr, int shmflg) - anexa o segmento de memória compartilhada ao processo, ou seja, o introduz no espaço de endereçamento do processo. shmid é obtido com shm_get, shmaddr é o endereço a ser utilizado para o segmento (se NULL, o kernel decide o endereço). Retorna o endereço.
  • void *shmdt(const void *shmaddr) - assim como o processo atacha o segmento, ele pode desatachar esse segmento com esta função, utilizando o endereço retornado por shmat.
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License