Respondendo as coisas em ordem:
- 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).
- Não exatamente, isso se liga à próxima resposta, então eu cobrirei 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 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.
- 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) )).