2017-05-12 3 views
0

mmap() crée un nouveau mappage dans l'espace d'adressage virtuel du processus d'appel à partir de addr et len octets et munmap() supprime les correspondances pour les pages entières contenant une partie de l'espace d'adressage du départ de processus au addr et continuant pour len octets.mmap() et munmap()

Je voudrais savoir si les fichiers mmap modifiés sont écrits sur le disque par le munmap avant de libérer la mémoire ou si nous devons appeler une fonction différente pour synchroniser la modification.

+0

Sur quel système d'exploitation? Quels drapeaux passez-vous à 'mmap'? Que voulez-vous dire par "fichiers mmap" et "fichier munmap"? – Gilles

+0

Système d'exploitation Unix. Les fichiers mmap désignent les données écrites dans la mémoire mappée. Si les données sont chargées dans la mémoire mappée, certaines modifications sont effectuées. Les paramètres fournis sont mmap ( NULL, size, readOnly? PROT_READ: PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0). – Pragya

+0

Le problème avec votre question est que mmap est une fonction de tous les métiers. Le comportement dépend de la façon dont vous l'avez réellement fait. Vous devriez être plus précis quant aux paramètres que vous utilisez dans votre appel. – user3344003

Répondre

1

Si vous appelez mmap() avec le drapeau MAP_PRIVATE, vos modifications ne seront jamais enregistrées. Si vous utilisez l'indicateur MAP_SHARED, vos modifications seront enregistrées sans appels supplémentaires à un moment indéterminé, mais avant les retours munmap(). Et vous pouvez forcer les modifications à être écrites dans le fichier en utilisant l'appel msync().

par the POSIX standard for mmap():

DESCRIPTION

...

MAP_SHARED et MAP_PRIVATE décrivent la disposition d'écriture références à l'objet de la mémoire. Si MAP_SHARED est spécifié, écrire les références doivent changer l'objet sous-jacent. Si MAP_PRIVATE est spécifié, les modifications apportées aux données mappées par le processus appelant doivent être visibles uniquement par le processus appelant et ne doivent pas modifier l'objet sous-jacent . ...

...

Le dernier horodatage d'accès aux données du fichier mappé peut être marqué pour mise à jour à tout moment entre l'appel et l'mmap() munmap() appel correspondant. La référence de lecture ou d'écriture initiale à une région mappée doit marquer l'horodatage du dernier accès aux données du fichier pour la mise à jour si elle n'a pas déjà été marquée pour mise à jour.

La dernière modification de données et le dernier état fichier changement horodatages d'un fichier qui est mis en correspondance avec MAP_SHARED et PROT_WRITE doivent être marqués pour mise à jour à un moment donné dans l'intervalle entre une référence d'écriture à la région cartographiée et le prochain appel à msync() avec MS_ASYNC ou MS_SYNC pour la partie du fichier par n'importe quel processus. S'il n'y a pas cet appel et si le fichier sous-jacent est modifié à la suite d'une référence d'écriture , ces horodateurs doivent être marqués pour la mise à jour à après la référence d'écriture.

et par the munmap() documentation:

DESCRIPTION

...

Si un mappage à supprimer était privé, toutes les modifications apportées dans cette plage d'adresses doivent être ignorées.