Как выделить буферы памяти, которые могут быть восстановлены ОС для кэширования в расширении ядра Mac OS X?

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

Вопрос

На основе документации и источника XNU, который я прочитал, я понимаю, что Mac OS X Caches файл Ввод/вывод с использованием унифицированного буферного кеша (UBC). UBC растет настолько большим, насколько это возможно, основываясь на доступной оперативной памяти, но страницы UBC являются одними из первых, кто приносится в жертву, когда память становится все более жесткой.

В своем водителе я имею дело с различными метаданными на дисках. Я хотел бы иметь возможность использовать UBC или аналогичный механизм, чтобы сохранить кэши из MRU этих данных, чтобы ускорить ситуацию, но дайте ядру возможность возвращать эту память, когда это необходимо. Метаданные, однако, не представляют файл Данные и, таким образом, не попадают непосредственно в домен UBC. Есть ли механизм более низкого уровня, который я могу использовать, или я могу каким-то образом использовать только ту часть UBC, которая занимается самими буферами?

В настоящее время я охотусь вокруг исходного кода HFS+, чтобы попытаться выяснить, является ли он кэшировать метаданные файловые системы, хотя и без особого успеха.

Основная альтернатива, конечно, состоит в том, чтобы зарезервировать конкретную область памяти для кэша и сделать свой собственный отбор LRU. Я могу выбрать фиксированный размер кэша или использовать какой -то эвристический, но он всегда будет использовать слишком мало памяти, когда ОЗУ в изобилии и слишком много, когда нет.

Обновлять:

После поиска еще, я обнаружил, что экземпляры IOBufferMemoryDescriptor может быть создан с помощью kIOMemoryPurgeable вариант. Это позволяет вам позвонить IOMemoryDescriptor::setPurgeable() на нем, чтобы отметить память «Fair Game» для отброса. Я попробую и обновлю вопрос с результатами.

Это было полезно?

Решение

Ты прав. Установлен kIOMemoryPurgeable как один из вариантов, когда вы запросите память. Он начинается как нелетущий, и может быть разгадывается, но не будет отброшено.

Когда вы хотите позволить ОС отбросить ее, позвоните setPurgeable(kIOMemoryPurgeableVolatile, &oldState ); и ОС отбросит его, если это необходимо, а не подталкивать на диск.

Когда вы хотите получить доступ к памяти, вы должны позвонить setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState ); и проверить if(oldState != kIOMemoryPurgeableEmpty) что будет правдой, если память все еще доступна, и ложь, если она была отброшена.

Мне было бы интересно услышать, если вы столкнетесь с любыми уловами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top