Подтвердить что ты не робот

Файлы с отображением памяти и сценарии с низкой памятью

Как платформа iOS обрабатывает файлы с отображением памяти во время сценариев с низкой памятью? По сценариям с низкой памятью я имею в виду, когда ОС отправляет уведомление UIApplicationDidReceiveMemoryWarningNotification всем наблюдателям в приложении.

Наши файлы отображаются в память с помощью +[NSData dataWithContentsOfMappedFile:], документация для которых:

В сопоставленном файле используются методы виртуальной памяти, чтобы избежать копирования страниц файла в память до тех пор, пока они не понадобятся.

Означает ли это, что ОС также удалит страницы, когда они больше не используются? Можно ли пометить страницы как более не используемые? Эти данные доступны только для чтения, если это изменит сценарий. Как насчет того, следует ли нам напрямую использовать mmap()? Было бы предпочтительнее?

4b9b3361

Ответ 1

Файлы с отображением памяти копируют данные с диска в память по одной странице за раз. Неиспользуемые страницы могут быть освобождены, как и любая другая виртуальная память, если они не были подключены к физической памяти с помощью mlock(2). Отображение карты оставляет определение того, что копировать с диска в память и когда в ОС.

Снижение с уровня Foundation до уровня BSD для использования mmap вряд ли будет иметь большое значение, помимо создания кода, который должен взаимодействовать с другим кодом Foundation, несколько более неудобным.

Ответ 2

(Это не ответ, но это была бы полезная информация.)

Из @ID_AA_Carmack tweet,

@ID_AA_Carmack - файлы с памятью iOS, автоматически отключенные в условиях низкой памяти? (используя + [NSData dataWithContentsOfMappedFile]?)

ID_AA_Carmack ответил за это,

@KhrobEdmonds да, это одно из больших преимуществ использования сопоставленных файлов в iOS. Однако я использую mmap().

Я не уверен, что это правда или нет...

Ответ 3

Из моих экспериментов NSData не отвечает на предупреждения о памяти. Я протестировал, создав NSData с отображением памяти и получив доступ к частям файла, чтобы он был загружен в память и, наконец, отправил предупреждения о памяти. После предупреждения о памяти не было уменьшения объема памяти. Ничто в документации не говорит о том, что память приведет к тому, что NSData уменьшит использование реальной памяти в ситуациях с низкой памятью, поэтому я убеждаюсь, что она не отвечает на предупреждения о памяти. Например, в документации NSCache говорится, что она будет пытаться играть хорошо с точки зрения использования памяти, и мне сказали, что она реагирует на предупреждения о низкой памяти, которые система повышает.

Также в моих простых тестах на iPod Touch (4-й ген) я смог отобразить около 600 мегабайт файлов в виртуальную память +[NSData dataWithContentsOfMappedFile:]. Затем я начал обращаться к страницам через свойство bytes в экземпляре NSData. Как я и делал, эта настоящая память начала расти, но она перестала расти примерно на 30 мегабайтах реального использования памяти. Таким образом, способ, которым он реализован, кажется, позволяет ограничить объем реальной памяти.

Короче, если вы хотите уменьшить использование памяти для объектов NSData, лучше всего убедиться, что они полностью освобождены и не полагаются на что-либо, что система автоматически выполняет от вашего имени.

Ответ 4

Если iOS похож на любой другой Unix - и я бы поставил деньги в этом отношении - страницы в области mmap() не "поменялись"; они просто удаляются (если они чисты) или записываются в основной файл, а затем удаляются (если они грязные). Этот процесс называется "выселение" страницы.

Поскольку ваша карта памяти доступна только для чтения, страницы всегда будут чистыми.

Ядро решит, какие страницы выселяться, когда физическая память становится жесткой.

Вы можете дать подсказки ядра о том, какие страницы вы предпочитаете сохранить/выселить, используя posix_madvise(). В частности, POSIX_MADV_DONTNEED указывает ядру не стесняться выселять страницы; или, как вы говорите, "отмечайте, что страницы больше не используются".

. Должно быть довольно просто написать несколько тестовых программ, чтобы узнать, не одобряет ли iOS подсказку "не нужно". Так как он получен из BSD, я уверен, он это сделает.

Ответ 5

Стандартные методы виртуальной памяти для файловой памяти говорят о том, что ОС свободно отбрасывает страницы всякий раз, когда захочет, потому что она всегда может получить их позже. Я не использовал iOS, но это было поведение виртуальной памяти на многих других операционных системах в течение длительного времени.

Самый простой способ проверить это - отобразить несколько больших файлов в память, прочитать их, чтобы гарантировать, что они будут отображаться в памяти, и посмотреть, можете ли вы заставить ситуацию с низкой памятью. Если вы не можете, тогда ОС должна была безостановить страницы после того, как решила, что они больше не используются.

Ответ 6

Теперь метод dataWithContentsOfMappedFile: устарел от iOS5.

Используйте mmap, так как вы избежите этих ситуаций.