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. mmappermite que todos esses processos compartilhem as mesmas páginas de memória física, economizando muita memória.
mmaptambém permite que o sistema operacional otimize as operações de paginação. Por exemplo, considere dois programas; programa Aque lê um 1MBarquivo em um buffer criando com malloce programa B com mmapso arquivo de 1 MB na memória. Se o sistema operacional precisar trocar parte da Amemória, ele deverá gravar o conteúdo do buffer para trocar antes de poder reutilizar a memória. No Bcaso, todas mmapas 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 mmapas páginas graváveis como somente leitura e detectando falhas seg , semelhante à estratégia Copiar na gravação ).
mmaptambém é útil para comunicação entre processos . Você pode mmapum arquivo como leitura / gravação nos processos que precisam se comunicar e, em seguida, usar primitivas de sincronização na mmap'dregião (é para isso que serve o MAP_HASSEMAPHOREsinalizador).
Um lugar que mmappode 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 mmapem 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. mmapnão pode ser usado em coisas como tubos e ttys .