A memória compartilhada pode ser apoiada por um arquivo normal, um dispositivo de bloco ou uma troca. Depende de como a região da memória foi criada.
Quando vários processos estão usando a mesma região de memória compartilhada, seus endereços virtuais individuais estarão apontando para o mesmo endereço físico. As gravações de um processo se tornam visíveis para os outros diretamente, sem a necessidade de passar pelo arquivo de disco (se houver algum) ao qual a memória está conectada.
Se houver um arquivo por trás da memória compartilhada, o kernel ocasionalmente sincroniza as páginas alteradas da RAM para o arquivo. Os processos que usam a memória normalmente não precisam saber quando isso acontece, mas, se necessário, eles podem chamar msync
para que isso aconteça mais cedo.
Se não houver nenhum arquivo por trás da memória compartilhada, o kernel pode mover páginas para trocar quando precisar liberar alguma RAM, assim como acontece com a memória de processo não compartilhada. Quando eles são trocados de volta, eles recebem um novo endereço físico que está imediatamente disponível para todos os processos que mapearam a memória compartilhada.
Há mais uma coisa que me confundiu na primeira vez que analisei: se você mapear um arquivo com mmap
, precisará usar MAP_SHARED
se quiser fazer alterações e salvá-las novamente no arquivo, mesmo que haja apenas um processo envolvido. Primeiro, achei que MAP_SHARED
era o nome errado para essa funcionalidade, mas, pensando melhor, você está "compartilhando" suas modificações com outros processos que acessam o arquivo com read
, ou processos que virão mais tarde e mmap
isto. Então faz sentido, tipo.