11
votes

Pourquoi Fopen / Fgets utilise-t-il les appels système MMAP et lisez-vous pour accéder aux données?

J'ai un petit exemple de programme fopen s un fichier et utilise fgets pour le lire. Utilisation de strace , je remarque que le premier appel à fgets exécute un mmap appel système, puis lire les appels système sont utilisés pour lire réellement le contenu. du fichier. sur FCLOSE , le fichier est munmap éd. Si je libère plutôt, lisez le fichier avec Ouvrir / lire directement, cela ne se produit évidemment pas. Je suis curieux de savoir quel est le but de ce mmap est et ce qu'il accomplit.

sur mon système basé sur My Linux 2.6.31, lorsque la mémoire virtuelle lourde demande ces MMAP S est parfois suspendu pendant plusieurs secondes et me semble inutile.

Le code exemple: xxx

et voici La sortie de la strace pertinente lorsque le code ci-dessus est exécuté: xxx


0 commentaires

4 Réponses :


16
votes

Ce n'est pas le fichier mmap 'ed - dans ce cas MMAP est utilisé anonymement (non sur un fichier), probablement pour allouer la mémoire du tampon que le tampon Les lectures conséquentes utiliseront.

malloc en fait des résultats d'un tel appel à MMAP . De même, le munmap correspond à un appel à gratuit .


3 commentaires

Intéressant. Donc, à partir de là, je rassemble que toutes les opérations de lecture sur fichier * ne lisent pas réellement dans le tampon fourni, mais dans un tampon alloué supplémentaire sur le tas, puis copiez dans ma mémoire tampon. De plus, MALLOC entraîne-t-il toujours un appel au MMAP? J'ai toujours pensé que le tas a été géré localement dans les utilisateursPace et les appels système n'ont été réalisés que si plus de mémoire devait être ajoutée à l'espace d'adresses de processus. J'ai aussi toujours pensé que SBRK / BRK a été utilisé pour cela, pas du mime.


@BDK: Oui, les fonctions de fichier de la bibliothèque standard (pas les appels système) conservent leur propre tampon de sorte que lorsque vous appelez fgets (buf, 1, f) continuellement dans une boucle, il ne «t résultat dans des centaines de lire appels système. MALLOC Résultats dans un MMAP Quand il n'a plus d'espace disponible dans les utilisateurspace - Par exemple, le premier MALLOC (8) peut résulter Dans un MMAP (4096) , et conséquence MALLOC (8) S affirmera les pointeurs sur la zone déjà allouée jusqu'à ce qu'il soit épuisé.


Merci! Ceci explique cela. Chaque fois que j'utilise la strace pour essayer de suivre quelque chose, je finirai par apprendre quelque chose de nouveau.



2
votes

D'après ce que j'ai lu des fonctions de mappage de mémoire sont utiles lors de la manipulation de fichiers volumineux. Maintenant, la définition de grand est quelque chose que je n'ai aucune idée de. Mais oui pour les gros fichiers, ils sont nettement plus rapides que ceux des appels d'E / S «tamponniers».

Dans l'exemple que vous avez posté, je pense que le fichier est ouvert par la fonction ouverte () et le MMAP est utilisé pour allouer la mémoire ou autre chose.

de la syntaxe de la fonction MMAP, on peut voir clairement:

vide * mmap (vide * addr, taille_t len, int Prot, int drapeaux, int gildes, off_T Off);

Le deuxième dernier paramètre prend le descripteur de fichier qui devrait être non négatif. tandis que dans la trace de la pile, il est -1


2 commentaires

C'est faux. Sur POSIX STDIO ne peut pas être implémenté avec mmap en raison de la mauvaise sémantique lorsque le fichier est tronqué (il se bloque avec sigbus plutôt que de donner une erreur). Le MMAP op de demander n'est pas une carte du fichier; C'est simplement une allocation de mémoire anonyme.


C'est ce que j'ai dit "MMAP est utilisé pour allouer de la mémoire ou autre chose" ... Je n'ai pas dit que le Mme est utilisé pour le fichier "Le".



5
votes

Le mmap ne correspond pas au fichier; Au lieu de cela, il alloue la mémoire pour le fichier STDIO Fichier Tableau de mémoire tampon. Normalement, MALLOC n'utiliserait pas MMAP pour servir une telle petite allocation, mais il semble que la mise en œuvre de STDIO de GLIBC utilise MMAP directement pour obtenir le tampon. Ceci est probablement de s'assurer qu'il est aligné sur la page (bien que posix_memalign puisse obtenir la même chose) et / ou pour vous assurer que la fermeture du fichier renvoie la mémoire tampon au noyau. Je questionne l'utilité de la page alignant le tampon. Vraisemblablement, c'est pour la performance, mais je ne vois aucune façon, cela vous aiderait à moins que le décalage de fichier que vous lisez est également aligné à la page, et même à ce moment-là, il semble qu'une micro-optimisation douteuse.


0 commentaires

0
votes

code source de fopen dans glibc montre que le MMAP peut être réellement utilisé.

https://sourceware.org/git/?p=glc.git;a=blob;f=libio/iofopen.c d978f3acb21cd978f3acb25ca23152993D9Cac9f120E36


0 commentaires