J'ai un petit exemple de programme sur mon système basé sur My Linux 2.6.31, lorsque la mémoire virtuelle lourde demande ces Le code exemple: p> et voici La sortie de la strace pertinente lorsque le code ci-dessus est exécuté: p> fopen code> s un fichier et utilise fgets code> pour le lire. Utilisation de strace code>, je remarque que le premier appel à fgets code> exécute un mmap code> appel système, puis lire les appels système sont utilisés pour lire réellement le contenu. du fichier. sur FCLOSE code>, le fichier est munmap code> é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 code> est et ce qu'il accomplit. MMAP code> S est parfois suspendu pendant plusieurs secondes et me semble inutile. p>
4 Réponses :
Ce n'est pas le fichier mmap code> 'ed - dans ce cas MMAP code> est utilisé anonymement (non sur un fichier), probablement pour allouer la mémoire du tampon que le tampon Les lectures conséquentes utiliseront. P>
malloc code> en fait des résultats d'un tel appel à MMAP code>. De même, le munmap code> correspond à un appel à gratuit code>. P>
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) code> continuellement dans une boucle, il ne «t résultat dans des centaines de code> lire code> appels système. MALLOC CODE> Résultats dans un MMAP code> Quand il n'a plus d'espace disponible dans les utilisateurspace - Par exemple, le premier MALLOC (8) code> peut résulter Dans un MMAP (4096) CODE>, et conséquence MALLOC (8) CODE> 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.
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». P>
Dans l'exemple que vous avez posté, je pense que le fichier est ouvert par la fonction de la syntaxe de la fonction MMAP, on peut voir clairement: P>
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 ouverte () code> et le MMAP est utilisé pour allouer la mémoire ou autre chose. P>
vide * mmap (vide * addr, taille_t len, int Prot, int drapeaux, int gildes, off_T Off); Code> P>
-1 code> p>
C'est faux. Sur POSIX STDIO ne peut pas être implémenté avec mmap code> en raison de la mauvaise sémantique lorsque le fichier est tronqué (il se bloque avec sigbus code> plutôt que de donner une erreur). Le MMAP code> 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".
Le mmap code> ne correspond pas au fichier; Au lieu de cela, il alloue la mémoire pour le fichier STDIO Fichier CODE> Tableau de mémoire tampon. Normalement, MALLOC code> n'utiliserait pas MMAP code> pour servir une telle petite allocation, mais il semble que la mise en œuvre de STDIO de GLIBC utilise MMAP code> directement pour obtenir le tampon. Ceci est probablement de s'assurer qu'il est aligné sur la page (bien que posix_memalign code> 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. P>
code source de fopen dans glibc montre que le MMAP peut être réellement utilisé. P>