Question

Lorsque nous mapper un fichier dans la mémoire, un appel système est nécessaire. Faites plusieurs accès au fichier nécessite des appels système ou est la page de mémoire virtuelle du processus mis en correspondance avec le cache de page réelle en mémoire?

mise à jour : ce que je veux aussi savoir est que si plusieurs processus accèdent au même fichier via mmap. ils accéderont la même portion de mémoire physique écriture.

Était-ce utile?

La solution

Pas besoin d'appels système supplémentaires (par votre processus) , vous accédez simplement comme la mémoire régulière. Lorsque vous avez terminé avec le fichier, il suffit d'appeler munmap.

  

Valeur de retour

     

En cas de succès, mmap()   renvoie un pointeur sur la zone cartographiée.   En cas d'erreur, la valeur MAP_FAILED (qui   est, (void *) -1) est renvoyée, et   errno est correctement. Sur   succès, munmap() renvoie 0, sur   échec -1 et errno est défini (probablement   à EINVAL).

Voir la page de manuel ici pour plus de détails .

Modifier Pour obtenir des éclaircissements:

Je dis que la fonction mappe le fichier dans l'espace mémoire du processus d'appel et renvoie un pointeur au début du bloc de mémoire.

Par exemple, si vous avez deux carte le même fichier processus différents avec le drapeau de MAP_SHARED alors chaque processus aura accès à la même mémoire physique, mais que la mémoire peut être mis en correspondance à un autre emplacement dans l'espace de mémoire virtuelle de chaque processus, à savoir la pointeurs retournés par mmap dans l'espace de mémoire virtuelle de chaque processus ne peut pas être égal.

Cela soulève le point que si par exemple vous avez besoin de stocker des pointeurs à l'intérieur du bloc de mémoire partagée ces pointeurs seraient utiles que si elles ont été stockées sous forme de décalages par rapport au début du bloc / fichier et ils ne seraient en mesure de pointer utilement à des emplacements internes au bloc / fichier.

Autres conseils

Lorsque vous utilisez mmap un fichier, Linux crée des entrées dans la MMU (unité de gestion de la mémoire). La MMU veille sur toutes les lectures et écritures de la CPU à la RAM réelle. De cette façon, il sait quand vous accédez à des parties de la mémoire qui mmap() retourné. La lecture des pièces qui ne sont pas encore dans la vraie RAM causera des défauts de page. Le MMU les attraper et appeler une routine du noyau pour charger la partie droite du fichier dans la mémoire vive quelque part, et il mettra à jour l'entrée dans le tableau MMU il semble donc que les données se trouve maintenant à l'adresse que mmap() vous a donné. En fait, ce sera un autre endroit, mais la MMU fera cela complètement transparent.

Lorsque vous écrivez à la mémoire, la MMU marquera les pages modifiées comme « sale ». Quand ils sont vidées (parce que vous accédez plus du fichier ou parce que vous appelez munmap()), les modifications seront inscrites sur le disque.

Ainsi, chaque fois qu'une erreur de page et une page sale flush se produit, un appel système se produit. Mais puisque les pages sont 4 ou 8 Ko, ceux-ci se produisent rarement. En outre, le noyau se charge plus d'une seule page à la fois, de sorte que le nombre de système est réduit à nouveau les appels. Enfin, le même code est utilisé pour mettre en œuvre swapping, il est donc très optimisé.

Tous ces effets font mmap si efficace.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top