Comment puis-je allouer des tampons de mémoire qui peut être récupéré par le système d'exploitation pour la mise en cache dans une extension du noyau Mac OS X?

StackOverflow https://stackoverflow.com/questions/4762199

Question

Sur la base de la documentation et de la source de XNU j'ai lu, je comprends que les caches Mac OS X fichier E / S à l'aide du tampon Unified Cache (UBC). L'UBC grandit aussi grand que possible en fonction de RAM disponible, mais les pages UBC sont quelques-uns des premiers à être sacrifiées lorsque la mémoire se resserre.

Dans mon chauffeur, je traite de différentes métadonnées sur disque. Je voudrais être en mesure d'utiliser l'UBC ou un mécanisme similaire pour maintenir les caches MRU de ces données autour des choses à accélérer, mais donner le noyau la possibilité de reprendre cette mémoire chaque fois qu'il a besoin. Les métadonnées cependant ne représente pas Fichier données, et donc ne tombe pas directement dans le domaine de l'UBC. Y at-il un mécanisme plus bas niveau que je peux utiliser, ou puis-je utiliser en quelque sorte que la partie de l'UBC qui traite des tampons eux-mêmes?

Je suis actuellement la chasse autour du code source HFS + pour essayer de comprendre si et comment il met en cache le système de fichiers de métadonnées, mais sans grand succès.

La principale alternative est bien sûr de réserver une zone de mémoire spécifique pour les caches et faire mon propre culling LRU. Je peux choisir une taille de cache fixe ou utiliser une sorte de heuristique, mais il va toujours utiliser trop peu de mémoire lorsque la RAM est abondante et trop quand il est pas.

Mise à jour:

Après avoir cherché un peu plus, j'ai trouvé que les cas de IOBufferMemoryDescriptor peuvent être créés avec l'option kIOMemoryPurgeable. Cela vous permet d'appeler IOMemoryDescriptor::setPurgeable() sur pour marquer la mémoire « jeu juste » pour les jeter. Je vais essayer et mettre à jour la question avec des résultats.

Était-ce utile?

La solution

Vous avez raison. Set kIOMemoryPurgeable comme l'une des options lorsque vous demandez la mémoire. Il commence comme non volatile, et peut être paginé, mais ne sera pas mis au rebut.

Lorsque vous voulez laisser le système d'exploitation défausser, setPurgeable(kIOMemoryPurgeableVolatile, &oldState ); d'appel et le système d'exploitation rejettera si nécessaire, plutôt que la pagination sur disque.

Si vous voulez accéder à la mémoire, vous devez appeler setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState ); et vérifier if(oldState != kIOMemoryPurgeableEmpty) qui sera vrai si la mémoire est toujours disponible, et faux si elle a été rejetée.

Je serais intéressé d'entendre si vous exécutiez dans toutes les prises.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top