Comprendre MMAP

10

Je parcourais la documentation concernant MMAP ici et j'ai essayé de l'implémenter en utilisant ce

J'ai quelques doutes quant à sa mise en œuvre.

  1. MMAP fournit-il un mappage d'un fichier et retourne un pointeur de cet emplacement dans la mémoire physique ou renvoie-t-il une adresse de la table de mappage? et est-ce qu'il alloue et verrouille également l'espace pour ce fichier?

  2. Une fois que le fichier est stocké dans cet emplacement en mémoire, y reste-t-il jusqu'à ce que munmap soit appelé?

  3. Le fichier est-il même déplacé vers la mémoire ou s'agit-il simplement d'une table de mappage qui sert de redirection et le fichier est en fait dans la mémoire virtuelle - (disque)?

  4. En supposant qu'il soit déplacé en mémoire, d'autres processus peuvent-ils accéder à cet espace pour lire des données s'ils ont une adresse?

John
la source
2
Vous ne mettre en œuvre mmap , mais vous utilisez ce
Basile STARYNKEVITCH

Réponses:

13

Répondre aux choses dans l'ordre:

  1. Il renvoie un pointeur vers l'emplacement dans la mémoire virtuelle et l'espace d'adressage de la mémoire virtuelle est alloué, mais le fichier n'est pas verrouillé de quelque manière que ce soit sauf si vous le verrouillez explicitement (notez également que verrouiller la mémoire n'est pas la même chose que verrouiller la région dans le fichier). Une implémentation efficace de mmap () n'est en fait possible que d'un point de vue pratique en raison de la pagination et de la mémoire virtuelle (sinon, il faudrait lire toute la région en mémoire avant la fin de l'appel).
  2. Pas exactement, cela est lié à la réponse suivante, alors je vais le couvrir ici.
  3. En quelque sorte. Ce qui se passe réellement dans la plupart des cas, c'est que mmap () fournit un accès de copie sur écriture aux données de ce fichier dans le cache de page. Par conséquent, les restrictions de cache habituelles sur la durée de vie des données s'appliquent (si le système a besoin d'espace, les pages peuvent être supprimées (ou vidées sur le disque si elles sont sales) du cache et doivent être à nouveau défaillantes.
  4. Non, à cause du fonctionnement de la mémoire virtuelle. Chaque processus a son propre espace d'adressage virtuel, avec ses propres mappages virtuels. Chaque programme qui veut communiquer des données devra appeler mmap () sur le même fichier (ou segment de mémoire partagée), et ils doivent tous utiliser l' MAP_SHAREDindicateur.

Il convient de noter que mmap () ne fonctionne pas uniquement sur les fichiers, vous pouvez également faire d'autres choses avec, comme:

  • Mappage direct de la mémoire de l'appareil (si vous disposez de privilèges suffisants). Ceci est en fait utilisé sur de nombreux systèmes embarqués pour éviter d'avoir à écrire des pilotes en mode noyau pour un nouveau matériel.
  • Mappez des segments de mémoire partagée.
  • Mappez explicitement de grandes pages.
  • Allouez de la mémoire que vous pouvez ensuite appeler madvise (2) (ce qui vous permet de faire des choses utiles comme empêcher la copie des données dans un processus enfant sur fork (2), ou marquer les données pour KSM (fonctionnalité de déduplication de mémoire de Linux)).
Austin Hemmelgarn
la source
Merci pour cette réponse si détaillée. Juste une clarification sur le point 1. Si j'essaye d'accéder à l'adresse mémoire virtuelle retournée. Il passera d'abord par le mappage d'adresses créé pour le processus, puis redirigé vers l'emplacement réel - qui peut être le disque, le cache ou la mémoire. Deuxièmement, si l'indicateur MAP_SHARED est activé et que la table des deux processus renvoie la même valeur pour l'adresse physique, puis le le fichier peut être partagé?
john
1. Oui, il utilisera la table de mappage de mémoire virtuelle. 2. L'adresse dans chaque processus n'a pas d'importance, juste le fait qu'ils ont mappé la même région du même fichier avec MAP_SHARED.
Austin Hemmelgarn