|
В этом выпуске мы познакомимся с нововведениями
ОС Windows Vista в области управления памятью, а также с главными
усовершенствованиями в области запуска системы, завершения работы и
управления электропитанием (часть
1).
С каждым новым выпуском ОС Windows® повышается масштабируемость и
производительность системы. ОС Windows Vista ™ не является
исключением. Диспетчер памяти ОС Windows Vista содержит множество
нововведений, в том числе более широкое использование методов
синхронизации без блокировок, улучшенная гранулярность блокировки,
более плотная упаковка структур данных, увеличенный размер страниц
операций ввода-вывода, поддержка архитектур памяти современных
графических процессоров и более эффективное использование
аппаратного буфера ассоциативной трансляции (TLB). Помимо этого
диспетчер памяти в Windows Vista поддерживает динамическое выделение
адресного пространства для меняющейся рабочей нагрузки.
В ОС Windows Vista впервые представлены четыре
новые технологии увеличения производительности: SuperFetch,
ReadyBoost, ReadyBoot и ReadyDrive. Они будут подробно рассмотрены
далее в этой статье.
Динамическое адресное пространство ядра
ОС Windows и приложения, выполняемые под ее
управлением, сталкиваются с ограничениями адресного пространства
32-разрядных процессоров. Размер адресного пространства ядра ОС
Windows по умолчанию ограничен значением 2 Гбайт (половина
32-разрядного виртуального адресного пространства). Вторая половина
зарезервирована для использования процессом, выполняющимся в текущий
момент на ЦП. На свою половину памяти ядро должно отобразить себя,
драйверы устройств, кэш файловой системы, стеки ядра, структуры
данных кода для каждого сеанса, а также невыгружаемые
(заблокированные в физической памяти) и выгружаемые буферы,
выделенные драйверами устройств. В операционных системах,
предшествовавших ОС Windows Vista, диспетчер памяти распределял
адресные пространства для перечисленных нужд в момент загрузки
системы. Этот негибкий механизм приводил иногда к ситуациям, когда
некоторые области адресного пространства оказывались исчерпанными, в
то время как в других еще оставалось много свободного места.
Нехватка адресного пространства в одной из областей может привести к
сбоям в работе приложений и нарушить операции ввода-вывода,
выполняемые драйверами устройств.
В 32-разрядной версии ОС Windows Vista диспетчер
памяти динамически распределяет адресное пространство ядра, выделяя
и освобождая адресное пространство с учетом потребностей текущей
рабочей нагрузки. Таким образом, количество виртуальной памяти,
используемое для хранения выгружаемых буферов, может увеличиваться,
когда этого требуют драйверы устройств, и уменьшаться, когда
драйверы устройств освобождают память. Это позволяет ОС Windows
Vista поддерживать более широкий диапазон рабочих нагрузок, а
32-разрядная версия следующего выпуска ОС Windows Server® (кодовое название «Longhorn») сможет
поддерживать больше одновременно работающих пользователей сервера
терминалов.
Конечно, в 64-разрядной версии ОС Windows Vista
пределы адресных пространств не представляют практических
ограничений, поэтому они не требуют каких-либо особых мер и
установлены на максимальные значения.
Приоритеты памяти
Помимо приоритетов ввода-вывода (которые
обсуждались в предыдущем выпуске), в ОС Windows Vista появились
также и приоритеты памяти. Чтобы понять, как система использует
приоритеты памяти, нужно разобраться, как в диспетчере памяти
реализован кэш памяти, называемый списком ожидания (Standby List).
Во всех версиях ОС Windows, предшествовавших Windows Vista,
физическая страница, затребованная системой у приложения (размер
страницы обычно составляет 4 Кбайт), помещалась диспетчером памяти в
конец списка ожидания. Если процессу снова требовался доступ к этой
странице, диспетчер памяти извлекал ее из списка ожидания и вновь
назначал процессу. Если процессу требовалась новая страница
физической памяти, но свободной памяти не было, диспетчер памяти
отдавал процессу страницу из начала списка ожидания. В такой схеме
все страницы в списке ожидания были равнозначны, и порядок страниц
определялся только временем их помещения в список.
В ОС Windows Vista каждая страница памяти имеет
приоритет от 0 до 7, и диспетчер памяти разделяет список ожидания на
8 списков, в каждом из которых хранятся страницы с соответствующим
приоритетом. Если диспетчеру памяти нужно забрать страницу из списка
ожидания, первыми будут извлекаться страницы из списков с более
низким приоритетом. Приоритет страницы обычно совпадает с
приоритетом потока, который первым вызвал выделение этой страницы.
(Приоритет страницы с совместным доступом соответствует наивысшему
приоритету памяти среди потоков, совместно использующих эту
страницу). Поток наследует значение приоритета памяти от процесса,
которому он принадлежит. Диспетчер памяти назначает низкий приоритет
для страниц, которые он считывает с диска, когда предвидится
обращение процесса к памяти.
По умолчанию значение приоритета памяти процессов
равняется 5, но приложения и система могут менять значения
приоритетов памяти для процессов и потоков. Реальная выгода от
использования приоритетов памяти становится понятной, если
рассматривать систему относительных приоритетов страниц на более
высоком уровне, а именно на уровне функции SuperFetch.
Функция SuperFetch
Среди существенных изменений в работе диспетчера
памяти – изменение способа управления физической памятью. У способа
управления на основе списка ожидания, который использовался в
предыдущих версиях ОС Windows, есть два ограничения. Во-первых,
приоритет страниц определяется только на основании предшествующего
поведения процессов без предсказания возможных будущих требований
процессов к памяти. Во-вторых, определение приоритета осуществляется
только на основании списка страниц памяти, которыми процесс владеет
в конкретный момент времени. Эти недостатки могут привести к таким
последствиям, как «послеобеденный синдром», когда пользователь
оставляет на некоторое время свое рабочее место, и на компьютере
запускается системное приложение, интенсивно работающее с памятью
(например, выполняется сканирование диска антивирусом или
производится дефрагментация диска). Работа такого приложения
приводит к тому, что данные пользовательских приложений, которые
находились в кэше, оказываются перезаписанными. Вернувшись на
рабочее место, пользователь в течение некоторого времени страдает от
низкой производительности, поскольку приложения запрашивают свои
данные и код с диска.
В ОС Windows XP была реализована поддержка
упреждающего чтения, благодаря которой происходила более быстрая
загрузка системы и запуск приложений. В память заранее загружались
данные, к которым предположительно будет требоваться доступ. Такое
решение принималось на основании истории предыдущих загрузок системы
и запусков приложений. Функция SuperFetch в ОС Windows Vista
является существенным развитием схемы управления памятью, поскольку,
помимо статистики недавнего доступа, она учитывает историю обращений
к памяти за длительный период и проактивное управление памятью.
Функция SuperFetch реализована в библиотеке
%SystemRoot%\System32\Sysmain.dll; она выполняется в качестве службы
Windows внутри процесса Service Host
(%SystemRoot%\System32\Svchost.exe). Благодаря поддержке со стороны
диспетчера памяти эта схема позволяет службе получать историю
обращений к страницам памяти и отдавать диспетчеру памяти указания
по предварительной загрузке данных или кода из файлов на диске или
из файла подкачки в список ожидания, а также присваивать приоритет
страницам памяти. Служба SuperFetch существенно расширяет
отслеживание страниц памяти, учитывая страницы, которые были ранее
загружены в память, но впоследствии освобождены диспетчером памяти
для других данных и кода. Эта информация хранится в папке
%SystemRoot%\Prefetch в виде файлов сценариев с расширением «.db»
вместе со стандартными файлами упреждающего чтения, используемыми
для оптимизации запуска приложений. Располагая подробной информацией
об использовании памяти, служба SuperFetch может осуществлять
предварительную загрузку данных и кода при освобождении физической
памяти.
Когда освобождается память (например, при
завершении работы приложения или когда приложение освобождает
выделенную память), служба SuperFetch дает диспетчеру памяти
инструкцию загрузить недавно выгруженные данные и код. Эта процедура
осуществляется со скоростью в несколько страниц в секунду с
приоритетом ввода-вывода «Very Low» (очень низкий), поэтому
предварительная загрузка не мешает работе пользовательских и других
активных приложений. Благодаря этому, когда пользователь оставляет
свое рабочее место на время обеденного перерыва, и фоновые задачи,
интенсивно работающие с памятью, приводят к выгрузке страниц памяти
активных пользовательских приложений, службе SuperFetch зачастую
удается вернуть большинство страниц в память еще до того, как
пользователь вернется на рабочее место. У службы SuperFetch есть
также специальные сценарии поддержки гибернации, ждущего режима,
быстрого переключения пользователей (FUS) и запуска приложений.
Например, когда система переходит в режим гибернации, служба
SuperFetch сохраняет в файле гибернации данные и код, доступ к
которым вероятнее всего потребуется после загрузки системы, с учетом
истории предыдущих переходов в режим гибернации. В случае
возобновления работы ОС Windows XP из режима гибернации при
обращении к данным, находившимся в кэше до перехода в режим
гибернации, необходимо было заново считывать эти данные с диска.
На врезке «Наблюдение за службой SuperFetch» представлены краткие результаты влияния службы SuperFetch на объем
доступной памяти.
Наблюдение за службой
SuperFetch
После работы в течение некоторого времени в ОС Windows Vista
пользователь может заметить, что на вкладке «Быстродействие»
диспетчера задач показатель свободной физической памяти становится
невысоким. Это объясняется тем, что служба SuperFetch и стандартное
кэширование Windows используют всю доступную физическую память для
кэширования данных с диска. Например, если сразу после загрузки
системы открыть диспетчер задач, можно заметить, что показатель
свободной памяти уменьшается, в то время как показатель кэшированной
памяти увеличивается. Если запустить приложение, использующее для
работы большой объем памяти, а затем завершить его работу (подойдет
любой бесплатный «оптимизатор памяти», который выделяет большое
количество памяти и затем освобождает ее), или просто скопировать
очень большой файл, показатель свободной памяти возрастет, и на
графике использования физической памяти будет наблюдаться падение по
мере того, как в систему возвращается освобожденная память. Однако
через некоторое время служба SuperFetch снова заполнит кэш данными,
которые были вытеснены из памяти, и показатель кэшированной памяти
возрастет, а показатель свободной памяти уменьшится.
Watching
memory
Функция ReadyBoost
Скорость работы ЦП и памяти гораздо выше скорости
работы жесткого диска, из-за чего жесткие диски часто являются узким
местом для производительности системы. Операции произвольного
дискового ввода-вывода особенно сильно влияют на производительность,
потому что время позиционирования головок жестких дисков (порядка 10
мс) – это вечность для современных процессоров с тактовой частотой 3
ГГц. Хотя оперативная память идеально подходит для кэширования
дисковых данных, ее стоимость сравнительно высока. Флэш-память
обычно дешевле оперативной памяти, при этом время произвольного
доступа у флэш-памяти может быть на порядок меньше, чем у жесткого
диска. Поэтому в ОС Windows Vista добавлена функция под названием
ReadyBoost, которая позволяет воспользоваться преимуществами
запоминающих устройств на основе флэш-памяти, создавая на них
промежуточный уровень кэширования, логически расположенный между
оперативной памятью и жесткими дисками.
Функция ReadyBoost состоит из службы,
реализованной в файле %SystemRoot%\System32\Emdmgmt.dll, которая
выполняется в процессе Service Host, и драйвера фильтра томов
%SystemRoot%\System32\Drivers\Ecache.sys (EMD – это сокращение от
рабочего названия функции ReadyBoost «External Memory Device»
(внешнее устройство памяти), которое использовалось в процессе ее
разработки). При подключении запоминающего устройства флэш-памяти к
компьютеру служба ReadyBoost определяет производительность этого
устройства и записывает результат в раздел реестра
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
NT\Currentversion\Emdmgmt, как показано на рис.
1.
Figure
1 ReadyBoost device test results
in the registry
Если объем памяти устройства от 256 МБ до 32 ГБ,
скорость передачи для произвольных операций чтения блоками по 4 КБ
превышает 2,5 МБ/с, скорость передачи для произвольных операций
записи блоками по 512 КБ превышает 1,75 МБ/с, и это устройство еще
не используется для кэширования, служба ReadyBoost предложит
выделить до 4 ГБайт памяти этого устройства для кэширования дисков.
(Хотя служба ReadyBoost может работать с разделами NTFS,
максимальный объем кэша ограничен 4 ГБ для совместимости с файловой
системой FAT32). Если пользователь соглашается, служба создает в
корневой папке устройства файл кэша с именем ReadyBoost.sfcache и
отдает службе SuperFetch указание заполнить кэш в фоновом
режиме.
После инициализации кэширования службой
ReadyBoost драйвер устройства Ecache.sys перехватывает все обращения
чтения и записи к локальным жестким дискам (например, диску C:\) и
копирует записываемые данные в созданный службой файл кэширования.
Драйвер Ecache.sys осуществляет сжатие данных, достигая обычно
степени сжатия 2:1, поэтому кэш объемом 4 ГБ, как правило, содержит
около 8 ГБ данных. Драйвер шифрует каждый записываемый блок с
помощью ключа сеанса, генерируемого случайным образом при каждой
загрузке системы; при этом используется алгоритм AES. Шифрование
обеспечивает конфиденциальность данных, содержащихся в кэше, на
случай извлечения устройства.
Если служба ReadyBoost определяет, что
осуществляется произвольное чтение данных, и эти данные есть в кэше,
данные извлекаются из кэша. Но ввиду того, что у жестких дисков
скорость последовательного чтения выше, чем у флэш-памяти, операции
последовательного чтения осуществляются непосредственно с диска,
даже если эти данные есть в кэше.
Функция ReadyBoot
Если в системе установлено менее 512 МБ
оперативной памяти, механизм упреждающего чтения при загрузке ОС
Windows Vista не отличается от механизма, использовавшегося при
загрузке ОС Windows XP. Если же размер оперативной памяти превышает
700 МБ, то для оптимизации процесса загрузки используется кэш в ОЗУ.
Размер этого кэша зависит от общего объема доступной памяти; он
достаточно велик, чтобы обеспечить эффективное кэширование, но
оставляет при этом достаточно свободной памяти для нормального
выполнения процедуры загрузки системы.
После каждой загрузки системы служба ReadyBoost
(та же самая служба, которая реализует описанную выше функцию
ReadyBoost) в моменты простоя ЦП планирует кэширование для следующей
загрузки системы. Она анализирует информацию об обращениях к файлам
за пять предыдущих загрузок и определяет, к каким файлам
производились обращения, и где эти файлы расположены на диске.
Обработанная информация об обращениях сохраняется в папке
%SystemRoot%\Prefetch\Readyboot в виде файлов с расширением «.fx», а
план кэширования сохраняется в разделе реестра
HKLM\System\CurrentControlSet\Services\Ecache\Parameters в виде
значений типа REG_BINARY с именами, соответствующими именам
внутренних дисков.
Кэширование реализуется с помощью того же
драйвера, что и в функции ReadyBoost (драйвер Ecache.sys), но
управление заполнением кэша во время загрузки осуществляется службой
ReadyBoost. Хотя кэш загрузки сжимается так же, как и кэш
ReadyBoost, есть еще одно отличие между управлением кэшем в функциях
ReadyBoost и ReadyBoot. В отличие от функции ReadyBoost, в режиме
ReadyBoot содержимое кэша не изменяется при операциях чтения и
записи, а определяется только обновлениями, вносимыми службой
ReadyBoost. Служба ReadyBoost удаляет кэш через 90 секунд после
начала загрузки или в случае, если требуется дополнительная
оперативная память. Статистика использования кэша записывается в
раздел реестра
HKLM\System\CurrentControlSet\Services\Ecache\Parameters\ReadyBootStats,
как показано на рис. 2. Измерение
производительности, проведенное в корпорации Майкрософт, показало,
что при использовании функции ReadyBoot производительность
увеличивается примерно на 20 процентов по сравнению с технологией
упреждающего чтения, используемой при загрузке ОС Windows XP.
Figure
2 ReadyBoot Performance statistics
Продолжение>>
|
|