Respondendo as coisas em ordem:
- 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).
- Não exatamente, isso está vinculado à próxima resposta, portanto, eu vou cobrir isso lá.
- 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.
- 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_SHARED
sinalizador.
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)).
mmap
, mas você está usando -o