314 votes

Quand dois-je utiliser mmap pour l’accès aux fichiers ?

Environnements de POSIX offrent au moins deux façons d’accéder à des fichiers. Il y a les appels système standard , , et ses amis, mais il y a aussi la possibilité d’utiliser pour mapper le fichier dans la mémoire virtuelle.

Quand est-il préférable d’utiliser un sur l’autre ? Ce que sont leurs avantages que le mérite dont deux interfaces ?

333voto

Don Neufeld Points 12803

mmap est idéal si vous avez plusieurs processus de l'accès aux données en lecture seule de la mode à partir du même fichier, ce qui est courant dans ce type de systèmes de serveur que j'écris. mmap permet à tous les procédés de partager les mêmes pages de mémoire physique, l'économie de beaucoup de mémoire.

mmap permet également le système d'exploitation pour optimiser les opérations de pagination. Par exemple, considérons deux programmes; Un programme qui lit dans un fichier de 1 mo en mémoire de la création avec malloc, et le programme B qui mmaps le fichier de 1 mo en mémoire. Si le système d'exploitation de swap de la partie du mémoire, il faut écrire le contenu de la mémoire tampon pour le swap avant de pouvoir réutiliser la mémoire. En B le cas de tout non modifié mmap avais pages peut être réutilisé immédiatement parce que l'OS sait comment les restaurer à partir du fichier existant, ils ont été mmap avais de. (Le système d'exploitation peut détecter les pages qui ne sont pas modifiées par initialement marquage accessible en écriture mmap avais pages en lecture seule et attraper seg défauts, semblable à la Copie sur Écriture de la stratégie).

mmap est également utile pour la communication interprocessus. Vous pouvez mmap un fichier en lecture / écriture dans les processus qui ont besoin de communiquer et d'utiliser ensuite martiens primitives dans le mmap avais région (c'est ce que le MAP_HASSEMAPHORE drapeau).

Un endroit mmap peut être gênant si vous avez besoin de travailler avec de très gros fichiers sur un ordinateur 32 bits. C'est parce que mmap a trouver un bloc contigu de adresses dans votre espace d'adressage du processus qui est assez grand pour s'adapter à l'ensemble de la gamme du fichier mappé. Cela peut devenir un problème si votre adresse espace est fragmenté, où vous pourriez avoir 2 GO d'espace d'adressage libre, mais aucun individu éventail de, il peut être un 1 GO de mappage de fichier. Dans ce cas, vous pouvez mapper le fichier en petits morceaux que vous souhaitez pour le faire rentrer.

Une autre maladresse avec mmap comme un remplacement pour lire / écrire, c'est que vous devez commencer votre cartographie sur les offsets de la taille de la page. Si vous voulez juste pour obtenir certaines données à l'offset X, vous aurez besoin de correction de décalage, il est donc compatible avec mmap.

Et enfin, en 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 des tuyaux et des ats.

75voto

Ben Combee Points 7193

Un domaine où j’ai trouvé mmap() pour ne pas être un avantage a été lors de la lecture des petits fichiers (moins de 16K). Surcharge due à la page des failles pour lire que le fichier entier est très élevé comparé à juste faire appel système read() unique. C’est parce que le noyau peut parfois satisfaire une lecture tout à fait dans votre tranche horaire, ce qui signifie que votre code n’est pas passer loin. Une erreur de page, il semble plus probable qu’un autre programme serait programmé, rendant l’opération du fichier ont une latence plus élevée.

49voto

tristopia Points 5074

mmap a l'avantage lorsque vous avez accès aléatoire sur les gros fichiers. Un autre avantage est que vous pouvez y accéder avec les opérations de mémoire (memcpy, l'arithmétique des pointeurs), sans s'embarrasser de la mise en mémoire tampon. D'e/S normale peut parfois être assez difficile lors de l'utilisation de tampons lorsque vous avez des structures plus grand que votre tampon. Le code de poignée qui est souvent difficile d'obtenir le droit, mmap est souvent plus facile. Cela dit, il y a certains pièges quand on travaille avec des mmap. Comme les gens l'ont déjà mentionné, mmap est assez coûteuses à mettre en place, de sorte qu'il convient d'utiliser uniquement pour une taille donnée (variant de machine à machine).

Pour pure séquentielle d'accès au fichier, il n'est pas toujours la meilleure solution, bien qu'un appel approprié pour madvise peut atténuer le problème.

Vous devez être prudent avec l'alignement des restrictions de votre architecture(SPARC, itanium), avec lecture/écriture IO les tampons sont souvent alignés correctement et de ne pas coincer lors de la référence à un coulé pointeur.

Vous devez aussi être prudent que vous n'avez pas accès à l'extérieur de la carte. Il peut facilement se produire si vous utilisez les fonctions de chaîne sur votre carte, et votre fichier ne contient pas un \0 à la fin. Il fonctionne la plupart du temps, quand la taille de votre fichier n'est pas un multiple de la taille de page, la dernière page est remplie avec la valeur 0 (la région cartographiée est toujours de la taille d'un multiple de la taille de vos pages).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X