¿Cómo asigno buffers de memoria que pueden ser recuperados por el sistema operativo para almacenar en caché en una extensión del kernel de Mac OS X?

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

Pregunta

Sobre la base de la documentación y la fuente xnu He leído, entiendo que las memorias caché de Mac OS X archivo I / O usando la caché del búfer Unificado (CBU). La UBC crece tan grande como se puede basado en la memoria RAM disponible, pero las páginas de la UBC son algunos de los primeros en ser sacrificados cuando la memoria sea cada vez más.

En mi conductor, trato con varios metadatos en el disco. Me gustaría ser capaz de utilizar la UBC o un mecanismo similar para mantener cachés MRU de estos datos en torno a acelerar las cosas, sin embargo, dar el núcleo de la capacidad de recuperar esa memoria cada vez que necesita. Los metadatos sin embargo no representa archivo de datos, y por lo tanto no entra directamente en el dominio de la UBC. ¿Existe un mecanismo de nivel inferior que puedo utilizar, o puede de alguna manera utilizar sólo la parte de la UBC que se ocupa de las memorias intermedias de sí mismos?

Actualmente estoy cazando todo el código fuente HFS + para tratar de averiguar si y cómo las memorias caché del sistema de archivos de metadatos, aunque sin mucho éxito.

La principal alternativa es, por supuesto, para reservar una región de memoria específica para cachés y hacer mi propio sacrificio LRU. Puedo elegir un tamaño de caché fijo o utilizar algún tipo de heurística, pero siempre va a usar muy poca memoria RAM cuando es abundante y demasiado cuando no lo es.

Actualización:

Después de buscar un poco más, he encontrado que los casos de IOBufferMemoryDescriptor pueden ser creados con la opción kIOMemoryPurgeable. Esto le permite llamar IOMemoryDescriptor::setPurgeable() en él para marcar la memoria "juego justo" para el descarte. Voy a tratar y actualizar la pregunta con resultados.

¿Fue útil?

Solución

Usted está correcto. kIOMemoryPurgeable conjunto como una de las opciones cuando usted solicite la memoria. Comienza como no volátil, y puede ser paginado, pero no se descarta.

Cuando se desea que el sistema operativo descartarlo, setPurgeable(kIOMemoryPurgeableVolatile, &oldState ); llamada y el sistema operativo descartará si es necesario, en lugar de una llamada de búsqueda en el disco.

Cuando se desea tener acceso a la memoria, debe llamar setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState ); y if(oldState != kIOMemoryPurgeableEmpty) cheque que será verdadera si la memoria está todavía disponible, y falso si se ha descartado.

Me interesaría saber si se ejecutó en las capturas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top