Noções básicas sobre MMAP

9

Eu estava revisando a documentação referente ao MMAP aqui e tentei implementá-lo usando este

Eu tenho algumas dúvidas sobre sua implementação.

  1. O MMAP fornece um mapeamento de um arquivo e retorna um ponteiro desse local na memória física ou retorna com um endereço da tabela de mapeamento? e também aloca e bloqueia espaço para esse arquivo?

  2. Depois que o arquivo é armazenado nesse local na memória, ele permanece lá até o munmap ser chamado?

  3. O arquivo é movido para a memória ou é apenas uma tabela de mapeamento que serve como redirecionamento e o arquivo está realmente na memória virtual - (disco)?

  4. Supondo que ele seja movido para a memória, outros processos podem acessar esse espaço para ler dados se eles tiverem o endereço?

John
fonte
2
Você não implementar mmap , mas você está usando -o
Basile Starynkevitch

Respostas:

12

Respondendo as coisas em ordem:

  1. Ele retorna um ponteiro para o local na memória virtual e o espaço de endereço da memória virtual é alocado, mas o arquivo não é bloqueado de maneira alguma, a menos que você o bloqueie explicitamente (observe também que bloquear a memória não é o mesmo que bloquear a região na região). Arquivo). Uma implementação eficiente do mmap () é realmente possível apenas de uma perspectiva prática por causa da paginação e da memória virtual (caso contrário, seria necessário ler toda a região na memória antes da conclusão da chamada).
  2. Não exatamente, isso está vinculado à próxima resposta, portanto, eu vou cobrir isso lá.
  3. Mais ou menos. O que realmente está acontecendo na maioria dos casos é que o mmap () está fornecendo acesso de cópia na gravação aos dados desse arquivo no cache da página. Como resultado, as restrições habituais de cache na vida útil dos dados se aplicam (se o sistema precisar de espaço, as páginas podem ser descartadas (ou liberadas para o disco se estiverem sujas) do cache e precisam ser invadidas novamente.
  4. Não, por causa de como a memória virtual funciona. Cada processo possui seu próprio espaço de endereço virtual, com seus próprios mapeamentos virtuais. Todo programa que deseja comunicar dados precisará chamar mmap () no mesmo arquivo (ou segmento de memória compartilhada) e todos eles deverão usar o MAP_SHAREDsinalizador.

Vale ressaltar que mmap () não funciona apenas em arquivos, você também pode fazer outras coisas, como:

  • Mapeando diretamente a memória do dispositivo (se você tiver privilégios suficientes). Na verdade, isso é usado em muitos sistemas embarcados para evitar a necessidade de gravar drivers no modo kernel para um novo hardware.
  • Mapeie segmentos de memória compartilhada.
  • Mapeie explicitamente páginas enormes.
  • Aloque a memória que você pode chamar de madvise (2) (o que, por sua vez, permite que você faça coisas úteis, como impedir que os dados sejam copiados para um processo filho no fork (2) ou marcar dados para o KSM (recurso de deduplicação de memória do Linux)).
Austin Hemmelgarn
fonte
Obrigado por uma resposta tão detalhada. Apenas um esclarecimento sobre o ponto 1. Se eu tentar acessar o endereço de memória virtual retornado. Ele passará primeiro pelo mapa de endereços criado para o processo e depois redirecionado para o local real - que pode ser disco, cache ou memória. Segundo, se o sinalizador MAP_SHARED estiver ativado e a tabela para os dois processos retornar o mesmo valor para o endereço físico, então o arquivo pode ser compartilhado?
john
1. Sim, ele usará a tabela de mapeamento de memória virtual. 2. O endereço em cada processo não importa, apenas o fato de eles terem mapeado a mesma região do mesmo arquivo com MAP_SHARED.
Austin Hemmelgarn