2014-05-11 2 views
4

J'ai lu environ memory mapped files qui permet le partage de fichiers entre plusieurs processus.Le fichier mappé en mémoire est chargé dans l'espace adresse du mode utilisateur ou dans l'espace adresse du noyau du processus?

Chaque processus (32 bits pour être précis) dispose de 4 Go d'espace d'adressage privé qui est divisé en 2 Go d'espace d'adressage en mode utilisateur et2 Go réservé pour le noyau comme décrit here par Eric Lippert. L'espace d'adressage en mode utilisateur est privé à chaque processus et ne peut pas être modifié par un autre processus.

Donc, cela signifie-t-il que MMF sont mappés dans l'espace d'adressage en mode noyau car il est partagé entre tous les processus?

J'ai beaucoup cherché à propos de MMF où il est mappé, mais n'a pas pu trouver de ressource indiquant cela. Donc, poster une question ici si ma supposition est bonne ou s'il me manque quelque chose ici? Toute ressource vers MSDN serait également bonne.

+0

Il est un peu plus compliqué que cela. Aucune partie de l'espace adresse n'est directement accessible aux autres processus. Cependant, vous pouvez explicitement partager des parties de votre espace d'adressage avec d'autres processus, et avec les autorisations de processus adéquates, un processus étranger peut accéder à la mémoire de votre processus (par exemple, ce que fait le débogueur) – jalf

+0

@jalf - Par private Je voulais dire, le mode utilisateur d'un espace d'adressage ne peut pas être écrit par un autre processus. –

+0

Lorsqu'un processus écrit sur un pointeur, il s'agit d'un pointeur virtuel. Le système d'exploitation décide de la mémoire à laquelle il écrit. Si vous avez demandé au système d'exploitation que deux pointeurs virtuels différents dans deux processus différents correspondent à la même banque de support, un processus peut écrire de la mémoire et un autre processus peut voir ce changement. –

Répondre

3

Les fichiers mappés en mémoire sont mappés dans l'espace adresse du mode utilisateur.

Pensez-y de cette façon. Supposons que vous ayez un fichier 4K mappé en mémoire dans deux processus. Cela signifie simplement que la page de stockage sur le disque est associée à une page particulière d'espace d'adressage virtuel dans chacun des deux processus.

Schéma 3 sur cette page pourrait aider:

http://msdn.microsoft.com/en-us/library/ms810613.aspx

+0

Merci Eric. La figure 3 me nettoie beaucoup. «Image exécutable» et «Fichier de page système» est ce qui différencie le code et les fichiers MMF. –

+0

J'ai cependant une requête. Si les fichiers MMF sont également mappés sur l'espace adresse du mode utilisateur. Donc, la taille du fichier tiendra compte du calcul de la limite maximale de 2 Go du processus. S'il vous plaît corriger si je me trompe. Si j'alloue en permanence de la mémoire de dire 16 Mo sur LOH, l'application se bloque avec OOM après un certain temps mais si j'alloue de la mémoire dans MMF, l'application ne plante pas avec OOM. (Je tiens sur le fichier MMF, c'est-à-dire que je ne dois pas l'appeler pour qu'il ne soit pas enregistré). Le deuxième cas aurait dû échouer aussi avec OOM. N'est-ce pas ou je me trompe dans cette compréhension? –

+0

@RohitVats: Vous n'avez pas à mapper le fichier * entier * dans l'espace adresse; vous pouvez le mapper en 4K à la fois si vous le voulez vraiment. –

3

Un processus n'a pas accès à l'espace adresse du noyau. Pour un processus les 2 Go supérieurs sont juste inaccessibles pour une raison inconnue.

Les mappages de mémoire vont dans la partie en mode utilisateur de l'espace adresse.

Grâce au matériel de mémoire virtuelle, des pages physiques peuvent être présentes dans plusieurs processus.

La mémoire privée n'est pas partagée bien que tout se trouve dans la plage d'adresses du mode utilisateur. Les mappages de mémoire sont traités spécialement par le noyau. Il demande au matériel de rendre les pages physiques disponibles pour plusieurs processus. La mémoire privée est vraiment un cas particulier où les pages se trouvent dans un seul processus. Le matériel ne s'en soucie pas. En fait, vous pouvez avoir la même page mappée plusieurs fois dans le même processus si vous le souhaitez.

+0

S'il est vrai que tous les mappages de mémoire vont dans l'espace d'adressage en mode utilisateur.Ensuite, tous les mappages de mémoire doivent avoir été partagés entre plusieurs processus. Pourquoi seulement MMF? J'ai peut-être tort, alors je veux bien comprendre cela. –

+0

La mémoire privée n'est pas partagée bien que tout se trouve dans la plage d'adresses du mode utilisateur. Les mappages de mémoire sont spécialement traités par le noyau. Il demande au matériel de rendre les pages physiques disponibles pour plusieurs processus. La mémoire privée est vraiment un cas particulier où les pages se trouvent dans un seul processus. Le matériel ne s'en soucie pas. En fait, vous pouvez avoir la même page mappée plusieurs fois dans le même processus si vous le souhaitez. – usr

+0

@RohitVats: Supposons que deux processus chargent foo.dll. Considérez une page 4K de foo.dll contenant le code qui s'exécute dans deux processus différents. La page de codes est mappée en deux processus différents; il n'est pas chargé en mémoire une fois pour chaque processus qui utilise la DLL! Il pourrait y avoir des centaines de processus de ce type! –

Questions connexes