mmap
est idéal si plusieurs processus accèdent aux données en lecture seule à partir du même fichier, ce qui est courant dans le type de systèmes de serveurs que j'écris. mmap
permet à tous ces processus de partager les mêmes pages de mémoire physique, économisant ainsi beaucoup de mémoire.
mmap
permet également au système d'exploitation d'optimiser les opérations de pagination. Par exemple, considérons deux programmes; programme A
qui lit dans un 1MB
fichier dans un tampon créant avec malloc
, et programme B qui mmaps
le fichier 1 Mo en mémoire. Si le système d'exploitation doit échanger une partie de A
la mémoire, il doit écrire le contenu du tampon à échanger avant de pouvoir réutiliser la mémoire. Dans B
le cas, toutes mmap
les pages non modifiées peuvent être réutilisées immédiatement car le système d'exploitation sait comment les restaurer à partir du fichier existant dont elles provenaient mmap
. (Le système d'exploitation peut détecter les pages non modifiées en marquant initialement les mmap
pages inscriptibles comme étant en lecture seule et en détectant les erreurs de segmentation , comme dans la stratégie Copier en écriture ).
mmap
est également utile pour la communication inter-processus . Vous pouvez mmap
utiliser un fichier en lecture / écriture dans les processus qui doivent communiquer, puis utiliser des primitives de synchronisation dans la mmap'd
région (c'est à cela que sert l' MAP_HASSEMAPHORE
indicateur).
Un endroit mmap
peut être gênant si vous devez travailler avec de très gros fichiers sur une machine 32 bits. Cela est dû au mmap
fait qu'il doit trouver un bloc d'adresses contigu dans l'espace d'adressage de votre processus qui est suffisamment grand pour s'adapter à toute la plage du fichier en cours de mappage. Cela peut devenir un problème si votre espace d'adressage devient fragmenté, où vous pourriez avoir 2 Go d'espace d'adressage libre, mais aucune plage individuelle ne peut s'adapter à un mappage de fichier de 1 Go. Dans ce cas, vous devrez peut-être mapper le fichier en plus petits morceaux que vous ne le souhaitez.
Une autre gêne potentielle avec mmap
en remplacement de la lecture / écriture est que vous devez commencer votre mappage sur des décalages de la taille de la page. Si vous voulez simplement obtenir des données en offsetX
vous devrez corriger cet offset pour qu'il soit compatible avec mmap
.
Et enfin, lecture / écriture sont la seule façon que vous pouvez travailler avec certains types de fichiers. mmap
ne peut pas être utilisé sur des choses comme les tuyaux et les tys .