web-dev-qa-db-fra.com

malloc vs mmap en C

J'ai construit deux programmes, l'un utilisant malloc et l'autre utilisant mmap. Le temps d'exécution à l'aide de mmap est bien inférieur à celui de malloc.

Je sais par exemple que lorsque vous utilisez mmap vous évitez les appels en lecture/écriture au système. Et les accès mémoire sont moindres.

Mais y a-t-il d'autres raisons pour les avantages lors de l'utilisation de mmap par rapport à malloc?

Merci beaucoup

40
Peter

Je suppose que vous faites référence à l'utilisation de mmap et malloc pour lire les données des fichiers. Dans ce cas, vous avez à peu près obtenu le point principal:

  • en utilisant fread/fwrite, vous devez faire de nombreux appels au système d'exploitation.
  • en utilisant mmap, vous semblez avoir accès à l'intégralité du fichier en une seule opération. Ce n'est pas entièrement vrai car le système d'exploitation mappe probablement le fichier un page mémoire à la fois, mais il est toujours beaucoup plus rapide.
14
Anton

mmap ne charge pas réellement le fichier en mémoire, il se chargera donc plus rapidement, mais sa modification sera plus lente.

Un autre point est que mmap n'utilise pas de mémoire, mais il prend de l'espace d'adressage. Sur une machine 64 bits, la plupart de l'espace d'adressage mémoire n'aura pas de mémoire, vous pouvez donc charger des fichiers énormes, disons 5 Go, que vous ne voudriez pas utiliser malloc.

13
Jeffrey Aylesworth

Regardez les gens, contrairement à la croyance commune, mmap est en effet une fonction d'allocation de mémoire similaire à malloc ..

le fichier mmapé en est une utilisation .. vous pouvez l'utiliser comme fonction d'allocation de mémoire en passant -1 comme descripteur de fichier ..

donc .. l'usage courant est d'utiliser malloc pour les petits objets et mmap pour les gros ..

c'est une bonne stratégie ..

j'utilise alloca () pour les variables de portée de fonction uniquement.

10
user410034

Le malloc et le mmap sont parfois lents. Cela dépend principalement du modèle d'utilisation:

mmap: le sous-système de pagination du noyau fonctionne en unités de taille de page. Cela signifie que si vous voulez lire une page entière à partir d'un fichier et que vous voulez le faire à plusieurs reprises (bonne localisation), ce sera bien avec mmap. Au contraire, si vous mappez ce fichier de 5 Go et effectuez un accès dispersé, vous aurez beaucoup de pages d'échange de noyau à l'intérieur et à l'extérieur. En plus des E/S réelles, la gestion des pages prendra un certain temps. Si vous avez des inquiétudes concernant la latence, évitez ce modèle d'accès, car le mécanisme de récupération de page Linux a tendance à être explosif et entraînera des retards notables, et l'empoisonnement du cache ralentira les autres processus.

malloc: C'est bien quand vous avez besoin de mémoire qui n'est pas en unités de taille de page. mais vous ne pouvez pas faire des choses comme mlock () sainement. En termes d'E/S, la vitesse dépend beaucoup de la façon dont vous le faites. fread/fwrite peut mapper des pages en arrière-plan, ou fera un tampon dans l'espace utilisateur. L'accès localisé sera plutôt rapide. la lecture/écriture passe directement par le noyau, donc les petits accès distribués provoqueront toujours des E/S en raison de manquements au cache, mais les données réelles transférées du noyau-> espace utilisateur seront légèrement inférieures. Je ne sais pas si c'est mesurable.

À moins que mlock () ne soit édité, les pages utilisateur peuvent être échangées/réécrites à tout moment. Cela prend aussi du temps. Donc, sur les systèmes avec peu de mémoire, la variante qui mappe le moins de mémoire gagnera. Avec le noyau Linux, chaque système a trop peu de mémoire car les pages inutilisées sont utilisées pour la mise en cache des E/S, et le noyau peut prendre un temps considérable pour les rendre disponibles si l'utilisation de la mémoire ou les E/S sont brusques.

9
prostatanus

mmap ne lit pas réellement le fichier. Il le mappe simplement pour adresser l'espace. C'est pourquoi c'est si rapide qu'il n'y a pas d'E/S de disque tant que vous n'avez pas réellement accédé à cette région de l'espace d'adressage.

malloc est simplement un mappage de l'espace d'adressage à la mémoire

2
joemoe