38 votes

Fichiers mappés en mémoire et scénarios avec peu de mémoire

Comment fonctionne la plate-forme iOS gérer des fichiers mappés en mémoire au cours de la basse-mémoire scénarios? Par faible mémoire des scénarios, je veux dire lorsque le système d'exploitation envoie l' UIApplicationDidReceiveMemoryWarningNotification de notification à tous les observateurs dans l'application.

Nos fichiers sont mappés en mémoire à l'aide de +[NSData dataWithContentsOfMappedFile:], la documentation qui stipule:

Un fichier mappé utilise la mémoire virtuelle techniques pour éviter la copie de pages du fichier en mémoire jusqu'à ce qu'ils sont réellement nécessaires.

Est-ce à dire que l'OS sera également détacher les pages quand elles ne sont plus en cours d'utilisation? Est-il possible de marquer les pages ne sont plus en cours d'utilisation? Ces données sont en lecture seule, si cela change le scénario. Que diriez-vous si nous devions utiliser mmap() directement? Serait-ce préférable?

19voto

Jeremy W. Sherman Points 22019

Fichiers mappés en mémoire de copier des données à partir du disque en mémoire une page à la fois. Les pages non utilisées sont libres d'être permutée, de même que tout autre de la mémoire virtuelle, sauf s'ils ont été câblé dans la mémoire physique à l'aide de mlock(2). Mappage de la mémoire des feuilles de la détermination de ce qu'il faut copier à partir du disque vers la mémoire et quand à l'OS.

- Déposer depuis la Fondation de la BSD niveau d'utilisation mmap est peu probable de faire beaucoup de différence, au-delà de faire du code qui est à l'interface avec d'autres code de la Fondation, est un peu plus délicat.

10voto

Kazuki Sakamoto Points 10100

(Ce n'est pas une réponse, mais il serait utile d'informations.)

De @ID_AA_Carmack tweet,

@ID_AA_Carmack sont iOS fichiers mappés en mémoire automatiquement déchargés de la mémoire dans une mémoire insuffisante? (à l'aide d' +[NSData dataWithContentsOfMappedFile]?)

ID_AA_Carmack a répondu pour cela,

@KhrobEdmonds oui, c'est l'un des grands avantages de l'utilisation des fichiers mappés sur iOS. Je utiliser mmap(), bien que.

Je ne suis pas sûr que ce soit vrai ou pas...

7voto

Evan Points 3138

À partir de mes expériences NSData ne répond pas aux avertissements de mémoire. J'ai testé en créant un mappés en mémoire NSData et accéder à des parties du fichier de sorte qu'il serait chargé dans la mémoire et enfin l'envoi d'avertissements de mémoire. Il n'y a pas de diminution de l'utilisation de la mémoire après l'avertissement de mémoire. Rien dans la documentation indique que la mémoire va provoquer NSData à réduire le réel à l'utilisation de la mémoire en cas de mémoire insuffisante, de sorte qu'il m'amène à croire qu'il ne répond pas aux avertissements de mémoire. Par exemple NSCache documentation dit qu'il va essayer et jouer gentil à l'égard de l'utilisation de la mémoire en plus on m'a dit qu'il répond à la faible mémoire avertissements le système de pose.

D'ailleurs dans mes tests simples sur un iPod Touch (4e génération), j'ai pu à la carte environ 600 mo de données du fichier dans l'utilisation de la mémoire virtuelle +[NSData dataWithContentsOfMappedFile:]. Ensuite, j'ai commencé à accéder à des pages via les octets de propriété sur le NSData instance. Comme je l'ai fait de mémoire réelle a commencé à croître cependant, il a cessé de croître à environ 30 mégas de mémoire réelle d'utilisation. Donc, la façon dont il est mis en œuvre, il semble cap réel de la mémoire.

En bref si vous voulez réduire l'utilisation de la mémoire de NSData objets le meilleur pari est de s'assurer qu'ils sont totalement libéré, et en ne s'appuyant pas sur quoi que ce soit, le système automatiquement sur votre compte.

4voto

Nemo Points 32838

Si iOS est comme tous les autres Unix -- et je serais prêt à parier de l'argent c'est dans ce domaine-pages dans un mmap() de la région ne sont pas "délocalisé"; ils sont simplement supprimés (si ils sont propres) ou sont écrites dans le fichier sous-jacent et puis a chuté (si elles sont sales). Ce processus est appelé "expulsion" de la page.

Depuis votre carte mémoire est en lecture seule, les pages doivent toujours être propres.

Le noyau qui permettra de choisir les pages à l'expulser lors de la mémoire physique serré.

Vous pouvez donner le noyau des conseils sur les pages qui vous serait-il mieux garder/expulser à l'aide de posix_madvise(). En particulier, POSIX_MADV_DONTNEED indique au noyau n'hésitez pas à expulser les pages, ou comme vous le dites, "marque pages ne sont plus en cours d'utilisation".

Il devrait être assez simple à écrire quelques programmes de test pour voir si iOS honneurs de "ne pas besoin de" soupçon. Car il est dérivé de BSD, je parie qu'il sera.

1voto

btilly Points 14710

Standard de la mémoire virtuelle techniques pour sauvegardés dans des fichiers de la mémoire dit que l'OS est libre de jeter pages à chaque fois qu'il veut, car il peut toujours obtenir plus tard. Je n'ai pas utilisé iOS, mais cela a été le comportement de la mémoire virtuelle sur de nombreux autres systèmes d'exploitation pendant une longue période.

La façon la plus simple de tester, il est à la carte plusieurs fichiers de grande taille en mémoire, lu à travers eux pour garantir qu'il pages dans la mémoire, et de voir si vous pouvez forcer une situation d'insuffisance de mémoire. Si vous ne pouvez pas, alors le système d'exploitation doit avoir unmapped les pages une fois qu'il a décidé qu'ils n'étaient plus utilisés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X