Исходя из прочитанной документации и источника xnu, я понимаю, что Mac OS X кэширует файл ввода-вывода с использованием унифицированного буферного кэша (UBC).UBC увеличивается настолько, насколько это возможно, в зависимости от доступной оперативной памяти, но страницы UBC являются одними из первых, которые приносятся в жертву, когда память становится плотнее.
В моем драйвере я имею дело с различными метаданными на диске.Я хотел бы иметь возможность использовать UBC или аналогичный механизм для хранения кэшей MRU этих данных, чтобы ускорить процесс, и в то же время дать ядру возможность забирать эту память всякий раз, когда это необходимо.Однако метаданные не представляют данные file и поэтому не попадают непосредственно в домен UBC.Есть ли механизм более низкого уровня, который я могу использовать, или я могу каким-то образом использовать только ту часть UBC, которая имеет дело с самими буферами?
В настоящее время я искал исходный код HFS +, чтобы попытаться выяснить,кэширует ли она метаданные файловой системы, хотя и без особого успеха.
Конечно, главная альтернатива - зарезервировать определенную область памяти для кэшей и выполнить мой выбор LRU.Я могу выбрать фиксированный размер кэша или использовать какую-то эвристику, но она всегда будет использовать слишком мало памяти, когда ОЗУ много, и слишком много, когда ее нет.
Обновление:
После поиска еще, я обнаружил, что экземпляры IOBufferMemoryDescriptor
могут быть созданы с опцией kIOMemoryPurgeable
.Это позволяет вам вызывать IOMemoryDescriptor::setPurgeable()
, чтобы пометить в памяти «честную игру» для сброса.Я попробую и обновлю вопрос с результатами.