mmap
é ótimo se você tiver vários processos acessando dados somente leitura do mesmo arquivo, o que é comum no tipo de sistema de servidor que escrevo. mmap
permite que todos esses processos compartilhem as mesmas páginas de memória física, economizando muita memória.
mmap
também permite que o sistema operacional otimize as operações de paginação. Por exemplo, considere dois programas; programa A
que lê um 1MB
arquivo em um buffer criando com malloc
e programa B com mmaps
o arquivo de 1 MB na memória. Se o sistema operacional precisar trocar parte da A
memória, ele deverá gravar o conteúdo do buffer para trocar antes de poder reutilizar a memória. No B
caso, todas mmap
as páginas d não modificadas podem ser reutilizadas imediatamente, porque o SO sabe como restaurá-las a partir do arquivo existente de onde elas foram mmap
. (O sistema operacional pode detectar quais páginas não são modificadas, marcando inicialmente mmap
as páginas graváveis como somente leitura e detectando falhas seg , semelhante à estratégia Copiar na gravação ).
mmap
também é útil para comunicação entre processos . Você pode mmap
um arquivo como leitura / gravação nos processos que precisam se comunicar e, em seguida, usar primitivas de sincronização na mmap'd
região (é para isso que serve o MAP_HASSEMAPHORE
sinalizador).
Um lugar que mmap
pode ser estranho é se você precisar trabalhar com arquivos muito grandes em uma máquina de 32 bits. Isso ocorre porque mmap
é necessário encontrar um bloco de endereços contíguo no espaço de endereço do processo que seja grande o suficiente para caber em todo o intervalo do arquivo que está sendo mapeado. Isso pode se tornar um problema se o seu espaço de endereço ficar fragmentado, onde você poderá ter 2 GB de espaço livre, mas nenhum intervalo individual poderá caber em um mapeamento de arquivo de 1 GB. Nesse caso, talvez seja necessário mapear o arquivo em pedaços menores do que você gostaria de ajustá-lo.
Outro constrangimento potencial mmap
em substituição à leitura / gravação é que você precisa iniciar o mapeamento com desvios do tamanho da página. Se você quiser apenas obter alguns dados em offset X
, precisará corrigi-los para que sejam compatíveis mmap
.
E, finalmente, de leitura / gravação são a única maneira que você pode trabalhar com alguns tipos de arquivos. mmap
não pode ser usado em coisas como tubos e ttys .