Entendendo o MMAP

6

Eu estava passando a documentação sobre o MMAP aqui e tentei implementá-lo usando < a href="https://www.youtube.com/watch?v=F3z-SIxu1Tw"> este

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 aloca e bloqueia espaço para esse arquivo também?

  2. Uma vez que o arquivo é armazenado naquele local na memória, ele fica lá até munmap ser chamado?

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

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

por john 29.08.2017 / 19:01

1 resposta

10

Respondendo as coisas em ordem:

  1. Ele retorna um ponteiro para a localização na memória virtual e o espaço de endereço da memória virtual é alocado, mas o arquivo não fica bloqueado de qualquer maneira, a menos que você bloqueie explicitamente (observe também que bloquear a memória não é o mesmo que bloquear a região no arquivo). Uma implementação eficiente de mmap () é realmente possível somente a partir de uma perspectiva prática por causa da paginação e memória virtual (caso contrário, seria necessário ler toda a região na memória antes de completar a chamada).
  2. Não exatamente, isso se liga à próxima resposta, então eu cobrirei 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 usuais de cache sobre a 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 precisarem ser reprovadas novamente.
  4. Não, por causa de como a memória virtual funciona. Cada processo tem seu próprio espaço de endereço virtual, com seus próprios mapeamentos virtuais. Todo programa que queira comunicar dados terá que chamar mmap () no mesmo arquivo (ou segmento de memória compartilhada), e todos eles têm que usar o MAP_SHARED flag.

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

  • Mapeamento direto da memória do dispositivo (se você tiver privilégios suficientes). Isso é realmente usado em muitos sistemas embarcados para evitar a necessidade de gravar drivers de modo kernel para novo hardware.
  • Mapear segmentos de memória compartilhada.
  • Explicitamente mapeie páginas enormes.
  • Aloca memória na qual você pode chamar madvise (2) em (que por sua vez permite fazer coisas úteis como impedir que os dados sejam copiados para um processo filho no fork (2) ou marcar dados para KSM (recurso de deduplicação de memória do Linux) )).
por 29.08.2017 / 19:36