Comment mmap travail?
Je suis en train de travailler sur les programmes pour Linux qui doit mmap fichier à partir du disque dur, mais j'ai une question, ce qui peut faire échouer. Comme si toutes les mémoires sont fragmentés, qui a seulement 200M de chacun, mais je veux mmap un fichier de la mémoire de 1000M, va lui succéder??
Et une autre question, existe-il des outils sous linux pour se rappeler de la mémoire à l'instar de certains outils dans Windows, par exemple, l'outil intégré de windows xp.
Grâce.
Vous devez vous connecter pour publier un commentaire.
mmap()
utilise les adresses extérieur de votre programme des tas de domaine, de sorte que la fragmentation de segment n'est pas un problème, sauf dans la mesure où il peut faire des tas de plus d'espace, et de réduire l'espace disponible pour les mappages.Si vous avez beaucoup de fichiers mappés, vous pourriez éventuellement rencontrer des problèmes avec la fragmentation sur un système 32 bits, où l'espace d'adressage est relativement limitée. Sur un système 64 bits, la fragmentation est peu probable d'être un problème, parce que même si vous ne disposez que de petites régions disponibles entre les mappages, il y a encore beaucoup, beaucoup de contiguë disponible de l'espace d'adresse, à côté de l'existant mappages.
Le problème le plus courant sur un système 32 bits, c'est que l'espace d'adressage est tout simplement trop petit pour mapper des fichiers volumineux à tous. De la de 4 go d'espace d'adressage, en général 2 go est disponible à l'espace utilisateur, l'autre de 2 go réservés par le noyau. De disponibles de 2 go, vos mappages d'avoir à partager l'espace avec le code du programme et de meules (généralement de petite taille) et le tas (potentiellement importants).
En bref,
mmap()
peut souvent échouer sur les systèmes 32 bits si le fichier est trop gros, mais vous avez peu de chances de jamais avoir un fichier assez grosses pour causer ce problème sur un système 64 bits.Si vous êtes en train de créer une copie privée à l'écriture de la cartographie, il peut également échouer en raison du manque d'espace de swap. Le noyau doit veiller à ce que la somme de RAM et le swap est assez grand pour contenir la taille de votre cartographie, dans le cas où vous modifier toutes les pages de sorte que le noyau est forcé de faire des copies privées de tous. Une cartographie partagée ne devriez pas avoir ce problème, car des modifications peuvent être vidées dans le fichier sur le disque, et puis les pages peuvent être ignorées si la mémoire est rare et rechargé à partir d'un disque plus tard.
Bien sûr, une cartographie peut également échouer si vous n'avez pas la permission d'accéder au fichier, ou si ce n'est pas un type de fichier qui peut être mappé (par exemple un répertoire ou un socket).
Il n'est pas clair ce que tu veux dire à propos en rappelant la mémoire. Rappelez-vous que la ressource rare que
mmap()
consomme n'est pas la mémoire, c'est espace d'adressage. Vous pouvez potentiellement une carte de 1 go de fichier, même si la machine a seulement 128 MO de RAM, mais sur un système 32 bits, vous ne pouvez pas mapper un fichier de 4 go, même si la machine dispose de 16 go de RAM.Le concept de la mémoire virtuelle est essentielle pour comprendre ce qui
mmap()
n', afin de lire à ce sujet si vous ne le connaissez pas déjà.mmap
œuvres par la manipulation de votre processus de la table des pages, une structure de données de votre CPU utilise pour la carte des espaces d'adressage. Le PROCESSEUR traduire "virtuel" adresses "physique" ceux, et n'a donc, selon la la table des pages mis en place par votre noyau.Lorsque vous accédez à la mémoire mappée pour la première fois, votre PROCESSEUR génère un faute de page. Le noyau de système d'exploitation peut alors sauter dans, "corriger" l'invalide d'accès à la mémoire par l'allocation de la mémoire et de faire des e/S de fichier dans ce nouvellement alloué de la mémoire tampon, puis continuer votre programme d'exécution comme si de rien n'était.
mmap
peut échouer si votre processus est hors de l'espace d'adressage, quelque chose à regarder dehors pour ces jours de code 32 bits, où toutes utilisables adresse peut être mappé assez rapidement avec de grands ensembles de données. Il peut également échouer pour l'une des choses mentionnées dans les "Erreurs" de la section de la page de manuel.Accéder à la mémoire à l'intérieur d'une région cartographiée peut également échouer si le noyau a des problèmes d'allocation de mémoire ou de faire des I/O. Dans ce cas, votre processus obtiendrez un
SIGBUS
signal.La réponse est: ça dépend.
En fonction de la quantité de mémoire que vous avez, l'environnement dans lequel vous travaillez, ou la façon dont la cartographie est accessible, il y a un certain nombre de façons
mmap
peut échouer. Lisez la page de manuel pour mmap pour plus de détails.