2009-07-27 8 views

Répondre

4

Tous les pointeurs qui sont stockés à l'intérieur de la région mmap'd doivent être effectués comme des décalages de la base de la région mmap'd, pas comme de vrais pointeurs! Vous n'obtiendrez pas nécessairement la même adresse de base lorsque vous appliquez la région à la prochaine exécution du programme. (J'ai dû nettoyer le code qui a fait des suppositions incorrectes sur la constance de l'adresse de base de la région mmap).

3

Assurez-vous de vérifier les restrictions sur la taille des fichiers ouverts ou l'utilisation de la mémoire. Sous Linux, il y a une commande shell intégrée ulimit. Exécuter comme ulimit -a pour voir les paramètres actuels.

Vider écrit dans le tableau en mémoire avec le msync (2) syscall ou ils peuvent rester en mémoire jusqu'à munmap (2) et il peut y avoir une panne de courant ou quelque chose avant!

Si plusieurs processus appliquent la même zone de mémoire partagée avec des droits de lecture et d'écriture, assurez-vous qu'un seul écrit à la fois pour éviter de corrompre vos données. Ou utilisez le verrouillage de fichier ou d'autres moyens de synchronisation.

+0

Le rinçage n'est pas nécessaire car les données sont constantes. –

3

Ceci est le cas d'utilisation le plus simple pour mmap(), donc il ne devrait pas y avoir beaucoup de choses à vous trébucher.

Vous chargez simplement un grand réseau constant. Étant constantes, vous ne devriez pas avoir à vous soucier de la synchronisation. Il est conseillé de vous assurer que le paramètre prot est défini sur PROT_READ uniquement car vous n'écrivez pas.

Si un ou plusieurs programmes utilisant les constantes doivent être exécutés en continu, il peut être utile d'avoir un programme distinct qui charge les données et les maintient en mémoire. Les exécutions des autres programmes effectuent alors essentiellement une mémoire partagée plutôt que de lire continuellement le fichier en mémoire.

Questions connexes