Освобождение памяти, занятой приложениями в стиле Metro

Современные операционные системы по-новому воспринимают ресурсы системы. Независимо от форм-фактора для операционной системы важно более эффективно управлять использованием ресурсов, чем прежде. В настоящее время одному процессу слишком просто занимать доступные ресурсы (память, ЦП, дисковые операции ввода-вывода), даже если это не приводит к улучшению общей производительности для пользователей. Основная задача операционной системы заключается в поддержании баланса ресурсов и создании условий для выполнения всего, что вы хотите сделать на своем компьютере. Большая часть возможностей ручного управления, имеющихся в большинстве операционных систем, предназначена для обхода ошибочного ПО — программного обеспечения, переходящего в состояние неограниченного использования ресурсов. Даже если это программное обеспечение не является вредоносным, что часто бывает, возможности создания "правильного" программного обеспечения были ограничены из-за сложной структуры API-интерфейсов выделения ресурсов. Современный набор API в WinRT разработан для того, чтобы программистам стало проще создавать программное обеспечение, выполняющее свои задачи, не "захватывая" ваш компьютер. Это приводит к повышению качества работы как компьютеров всех форм-факторов, так и всего программного обеспечения.

В этой статье Билл Карагунис (Bill Karagounis), руководитель группы программ в нашей группе Fundamentals, подробно рассказывает об усилиях, предпринятых разработчиками Windows для освобождения памяти даже в тех случаях, когда приложения приостановлены. Причем разработчикам приложений не нужно беспокоиться о том, как все это происходит.
-- Стивен


В предыдущих записях блога обсуждалась модель приложения в стиле Metro с использованием среды выполнения Windows. Важной особенностью этой модели приложений является то, что работа приложений, которые не видны пользователю, приостанавливается. Приостановка выполнения приложений в стиле Metro в фоновом режиме — правильная мера, поскольку это освобождает ЦП для других приложений и гарантирует, что фоновые приложения не будут занимать ресурсы, а значит увеличится время работы батареи и повысится скорость отклика. Это подробно описано в статье Шарифа Фарага (Sharif Farag) и Бена Сроура (Ben Srour) Повышение эффективности энергопотребления для приложений.

А что можно сказать о памяти, занимаемой этими приложениями в приостановленном состоянии? Как мы отмечали ранее, на практике этот аспект будет обрабатываться операционной системой, и другие процессы не "почувствуют" нехватки памяти из-за приостановленных процессов. Это было важным принципом разработки. Однако мы знаем, что некоторым из вас пока неясно, как все это будет работать.

Начиная с Windows 8 Consumer Preview, если Windows обнаруживает нехватку памяти в системе, она перераспределяет почти всю память, занимаемую приостановленными приложениями в стиле Metro. Windows 8 может освободить эту память, не завершая работу приложения.

Ваш браузер не поддерживает HTML5-видео.

Загрузите это видео, чтобы просмотреть его в предпочитаемом проигрывателе мультимедиа:
MP4, высокое качество | MP4, низкое качество

Память, скорость отклика и приложения в стиле Metro

Для приложений любого типа (классических или в стиле Metro) Windows старается регулировать выделение физической памяти от имени приложения независимо от отправленных им запросов памяти. Windows всегда действовала таким образом, чтобы обеспечить достаточно памяти для последующих приложений. Windows выделяет приложению физическую память только тогда, когда приложение пытается ею воспользоваться, даже если приложение "забронировало" память заранее. Кроме того, Windows будет выгружать страницы памяти или перераспределять части памяти, занимаемой приложением, если страницы памяти долгое время не использовались.

Важно понимать, что цель заключается не в том, чтобы отказать в памяти запрашивающему процессу, а в том, чтобы отложить выделение физической памяти насколько это возможно (до того момента, когда пользователь действительно начинает использовать приложение), поскольку, как и в случае большинства ресурсов, у программного обеспечения существует тенденция к закладыванию в бюджет завышенных потребностей. Операционная система является тем центром, куда поступают все эти запросы, и у нее есть информация, позволяющая судить о том, что удовлетворение всех запросов с закладыванием в бюджет всех потребностей в конечном итоге приведет к нехватке ресурсов для каждого процесса. Это может привести не только к невыполнению задач, но и к существенной блокировке системы. Это происходит, даже если память — виртуальная: вместо нехватки места в ОЗУ, компьютер может просто записывать страницы на диск и считывать их с диска.

Физическую память, выделяемую процессу в любой момент времени, называют "рабочим набором" процесса. Частный рабочий набор представляет собой физическую память, являющуюся уникальной для процесса. Процессы затрагивают также другие страницы физической памяти, относящиеся к "общим" — на них могут ссылаться несколько процессов. Память, отображаемая для конкретного процесса в представлении "Процессы" в диспетчере задач, фактически является его текущим частным рабочим набором. ПРИМЕЧАНИЕ. Для простоты, в этом блоге "частный рабочий набор" я буду называть "рабочим набором".

В случае нехватки доступной памяти операционная система просматривает все процессы в поисках страниц физической памяти, которые можно переориентировать для удовлетворения других потребностей системы, при необходимости даже за счет удаления страниц памяти. Для классических приложений Windows будет стараться сохранить наиболее важные (часто используемые) страницы памяти в рабочем наборе приложения. Это связано с тем, что классическим приложениям нужно иметь возможность запускать код в любой момент, даже когда они выполняются в фоновом режиме. Однако это хрупкий баланс: если удалить слишком много страниц памяти у классического приложения, это может повлиять на скорость отклика приложения из-за выполнения дополнительных дисковых операций ввода-вывода (поскольку приложение пытается использовать память, которая была незаметно выгружена на диск).

Чтобы глубже проникнуть в стратегию управления памятью в Windows, посмотрите выступления Марка Руссиновича (Mark Russinovich) "Разгадка тайны управления памятью в Windows": часть 1 и часть 2.

Однако приложения в стиле Metro отличаются от классических приложений тем, что они обычно находятся в приостановленном состоянии, если не находятся на переднем плане. Когда они приостановлены, они не используют НИКАКУЮ свою память.

Чтобы проиллюстрировать свои слова, я выделил несколько приостановленных приложений в стиле Metro и память, относящуюся к их рабочим наборам, на следующем снимке экрана.

Диспетчер задач, вкладка "Процессы", на которой показано 11 приостановленных приложений, использующих от 3,8 МБ до 63,3 МБ памяти каждое

Приостановленные приложения, удерживающие память

ПРИМЕЧАНИЕ. По умолчанию в версии Consumer Preview состояние "Приостановлено" не отображается
в представлении "Процессы" диспетчера задач; необходимо выбрать отображение этого состояния
через параметр в меню "Вид".

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

Освобождение памяти, занятой приостановленными приложениями в стиле Metro

В Windows 8 Consumer Preview мы можем эффективно записать весь (частный) рабочий набор приостановленного приложения в стиле Metro на диск, чтобы получить дополнительную память, когда система обнаружила ее нехватку.

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

Далее описывается последовательность событий:

    1. Диспетчер жизненного цикла процессов (Process Lifetime Manager — PLM) обнаруживает нехватку памяти в системе и запрашивает диспетчер памяти (Memory Manager — MM) об освобождении рабочего набора определенного процесса, относящегося к приостановленному приложению в стиле Metro.

Блок-схема: память 1,6/2,0 ГБ (80 %), стрелка к диспетчеру жизненного цикла процессов (PLM), стрелка к диспетчеру памяти (MM), еще три стрелки от PLM к 3 приостановленным приложениям в стиле Metro

    1. Диспетчер памяти перемещает страницы памяти из рабочего набора приложения в список измененных страниц памяти операционной системы (это список памяти, содержимое которой должно быть записано на диск до повторного использования).

До: перемещение страниц памяти для приостановленного приложения в список измененных страниц памяти, рабочий набор занимает 40,3 МБ. После перемещения рабочий набор занимает всего 0,7 МБ, а в списке измененных страниц памяти появились новые элементы.

    1. Страницы рабочего набора в списке измененных страниц памяти записываются асинхронно, как предписано обычными политиками диспетчера памяти (записываются рациональным образом в фоновом режиме, запись включается при нехватке памяти).

Список измененных страниц памяти показан со стрелкой к диску, страницы записываются на диск асинхронно

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

Страницы, показанные как в списке измененных страниц памяти, так и в списке ожидания

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

"Освобождение памяти" в действии

Чтобы почувствовать, как это работает, давайте рассмотрим пример с настоящим исполняемым кодом.

Начальное состояние представлено на снимке экрана, приведенном выше. У меня было запущено несколько приложений в стиле Metro на компьютере с 2 ГБ ОЗУ. Приложения в стиле Metro находились в фоновом режиме, поэтому Windows приостановила их работу. Затем я начал открывать больше приложений, чтобы интенсифицировать использование памяти в системе и запустить новую функцию.

На следующем снимке экрана, ниже, вы увидите, что я открыл несколько приложений, чтобы создать дополнительную нагрузку на память и спровоцировать поведение, описанное выше. Как можно убедиться, система Windows очистила рабочие наборы приостановленных приложений в стиле Metro (выделены).

Вкладка "Процессы" диспетчера задач, на которой видно, что все приостановленные приложения используют менее 1 МБ памяти каждое.

Рабочие наборы приложений в стиле Metro очищены

Давайте сравним рабочие наборы оригинальных приложений в стиле Metro "до" и "после" (часть статистики "после" не видна, поскольку диспетчеру задач не хватает места отобразить все 27 запущенных приложений):

Приложение в стиле Metro

Рабочий набор "до" (МБ)

Рабочий набор "после" (МБ)

Flixster

23.5

0.5

Flow

15.2

0.6

Kindle

23.1

0.5

LiveComm

3.8

0.3

Lyrics

65.3

0.9

Карты

28.1

0.8

Удаленный рабочий стол

21.0

0.5

SkyDrive

23.1

0.5

Магазин

26.9

0.6

Погода

42.0

0.8

Средство просмотра для Windows

9.2

0.4

Итак, в этом примере мы освободили свыше 250 МБ физической оперативной памяти, которую можно использовать для других приложений, не закрывая приостановленные приложения.

Скорость отклика при обратном чтении рабочего набора

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

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

Достигнув того рубежа использования памяти, при котором очищаются рабочие наборы, я открыл дополнительные приложения и использовал систему некоторое время, чтобы переключение обратно к приложению повлекло за собой чтение рабочего набора с диска. Затем я снова переключился к приложению Lyrics (ниже).

Вкладка "Процессы" диспетчера задач, теперь приложение Lyrics занимает 97,4 МБ памяти

Повторное заполнение рабочего набора приложения Lyrics

Искомый ключевой показатель был таким: сколько времени прошло с того момента, как я переключился обратно к приложению, до того момента, когда я снова мог слышать звук. На устройстве из низкого ценового сегмента при высокой нагрузке на память трудно воспринимать разницу в скорости отклика при переключении обратно к приложению, рабочий набор которого читался с диска, по сравнению с тем, когда его рабочий набор еще был в памяти. Впрочем, полученные результаты будут варьироваться: чем больше рабочий набор, тем дольше будет выполняться чтение с диска. Кроме того, мы продолжаем сокращать объем, который приходится записывать на диск для приложений в стиле Metro, и занимаемся дальнейшей оптимизацией этого компонента.

Это одна из тех функций, которые каждый, у кого есть выпуск Consumer Preview, может опробовать сам. Просто откройте несколько приложений в стиле Metro и классических приложений, чтобы создать нагрузку на память, а затем переключитесь обратно к приостановленному приложению в стиле Metro, рабочий набор которого был очищен.

ПРИМЕЧАНИЕ. Windows по-прежнему будет закрывать приложения в стиле Metro, если нагрузка на память будет достигать критического предела. Однако этот компонент позволит системе запускать больше приложений до этого момента.

Чтение рабочего набора оптимальным образом

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

При записи рабочего набора приостановленного приложения в стиле Metro страницы рабочего набора записываются на диск последовательно. Это позволяет выполнять обратное чтение данных в процесс с помощью нескольких крупных последовательных операций чтения с диска. Приведенный ниже снимок экрана взят из анализатора производительности Windows (WPA), входящего в комплект средств для развертывания и оценки (ADK), и дает визуальное представление операций чтения с диска в ходе этого процесса. Я выделил показатели ввода-вывода данных при "считывании" рабочего набора. Четко виден последовательный поток при повторном заполнении рабочего набора приложения.

Анализатор производительности Windows

Операции ввода-вывода при чтении последовательных данных для повторного заполнения рабочего набора приложения (анализатор производительности Windows)

Обратное чтение последовательных данных почти из любого устройства хранения идет действительно быстро. Большинство вращающихся дисков могут достичь скорости чтения 50-100 МБ в секунду. В случае хранения на флэш-устройстве (например, на SSD) скорость чтения может превысить 200 МБ в секунду.

Мы ожидаем, что многим приложениям потребуется менее секунды на ввод-вывод, чтобы снова внести рабочий набор приостановленного приложения в память.

Заключение

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

Несколько категорий современного программного обеспечения будут развиваться и дальше, требуя все больше и больше памяти: редактирование огромных фотографий в формате RAW, базы данных в оперативной памяти, очень большие таблицы и прочее. Независимо от того, на какой базе они реализованы (WinRT или классической), операционной системе нужно развиваться, чтобы справляться с постоянно растущими запросами к памяти. WinRT дает программистам возможность использовать API для доступа ко всей необходимой памяти. При этом интересы пользователя в том, что касается скорости отклика и выполнения задач, ставятся на первое место. Надеюсь, вы опробуете этот новый компонент в Windows 8 Consumer Preview.

— Билл Карагунис (Bill Karagounis)