Это — первая статья серии, посвященной нововведениям в ядре ОС Windows Vista. В этой работебудут затронуты изменения в области процессов, потоков и ввода-вывода. Следующие статьи будут посвящены управлению памятью, запуску и завершению работы, надежности и восстановлению, а также безопасности.
Данная статья охватывает изменения только ядра ОС Windows Vista™, в особенности файла Ntoskrnl.exe и связанных с ним компонентов. Следует помнить, что многие существенные изменения в ОС Windows Vista не затрагивают собственно ядро системы, и следовательно, здесь рассмотрены не будут. Это касается усовершенствований оболочки (например интегрированный поиск на рабочем столе), работы в сети (например новый стек IPv6 и двусторонний брандмауэр) и графической модели нового поколения (Aero™ Glass, платформа Windows® Presentation Foundation, диспетчер окон рабочего стола и новая модель графических драйверов). Также не будет рассмотрена новая инфраструктура драйверов пользовательского режима (UMDF) и режима ядра (KMDF) ОС Windows, поскольку ее можно устанавливать и на более ранние версии этой операционной системы.
Счетчик циклов центрального процессора
ОС Windows Vista содержит множество усовершенствований в области процессов и потоков, включая использование счетчика циклов центрального процессора для более равномерного выделения ресурсов, а также новую службу Multimedia Class Scheduler Service (MMCSS), способствующую безошибочному воспроизведению содержимого мультимедийными приложениями.
Все версии ОС Windows NT® до Windows Vista включительно выполняют подпрограммы прерывания интервального таймера примерно каждые 10 или 15 мс, в зависимости от аппаратной платформы. Данная подпрограмма обновляет статистику загрузки центрального процессора (ЦП) потоком, который ею прерван, так как если бы этот поток выполнялся весь интервал, хотя в действительности выполнение потока могло начаться перед самым завершением данного интервала. Далее поток мог формально получить ресурсы ЦП, но не получить возможности выполняться, поскольку вместо этого могли быть выполнены подпрограммы аппаратного или программного прерывания .
Подсчет времени на основе интервалов может подходить средствам диагностики, сообщающим загрузку ЦП процессами и потоками, но использование этого способа планировщиком потоков может приводить к нерациональному распределению ресурсов ЦП. По умолчанию клиентские версии ОС Windows позволяют выполнение потоков длительностью до 2 тактов (до 6 тактов на переднем плане). Однако на самом деле поток может совсем не получить времени ЦП, или же получить до 6 циклов (до 18 циклов на переднем плане), в зависимости от его поведения и прочей активности в системе.
Рисунок 1 демонстрирует случай нерационального распределения ресурсов, которое может произойти, если два потока с одинаковым приоритетом готовы к выполнению одновременно. Поток A выполняется до завершения следующего временного интервала, когда планировщик предполагает, что он выполнялся в течение всего интервала, и поэтому решает, что очередь потока A закончилась. Более того, потоку A засчитывается еще и прерывание, произошедшее во время его выполнения. На следующий интервал планировщик отдает предпочтение потоку B, который выполняется в течение полного интервала.
Рисунок 1 Неравномерное выделение ресурсов потокам
В ОС Windows Vista планировщик отслеживает точное количество циклов ЦП, в течение которых выполняется поток, с помощью регистра счетчика циклов современных процессоров. Определив, сколько циклов может выполнить процессор на протяжении интервала времени, планировщик может точнее раздавать ресурсы ЦП. К тому же, планировщик ОС Windows Vista не засчитывает выполнение прерывания во время выполнения потока. Это означает, что поток в ОС Windows Vista всегда получит, по крайней мере, свою очередь выполнения, не превышающую один дополнительный временной интервал, что обеспечивает более справедливое выделение ресурсов и предсказуемое поведение приложений. На рис. 2 показана реакция ОС Windows Vista на ситуацию, изображенную на рис. 1, выделением обоим потокам, по меньшей мере, по одному временному интервалу выполнения.
Рисунок 2 Планирование распределения ресурсов на основе циклов в ОС Windows Vista
Врезка «Наблюдение за загрузкой ЦП процессом» демонстрирует, как можно наблюдать за использование процессом циклов ЦП с помощью программы Process Explorer.
Служба Multimedia Class Scheduler Service
Пользователи ожидают от мультимедийных приложений, таких как проигрыватели аудио и видео, ровного и безошибочного воспроизведения. Однако из-за занятости ЦП другими параллельно выполняющимися приложениями, например антивирусными программами, индексированием содержимого или даже почтовым клиентом могут возникать неприятные задержки и прерывания. Для обеспечения более качественного воспроизведения в ОС Windows Vista вводится служба MMCSS, управляющая приоритетами мультимедийных потоков для выполнения процессором.
Мультимедийное приложение, например проигрыватель Windows Media®, регистрируется в службе MMCSS с помощью новых функций прикладного интерфейса, отображающих его мультимедийные характеристики, которые должны совпадать с характеристиками, перечисленными по именам в следующем разделе реестра:
Разделы различных задач указывают, какое предпочтение получают потоки, связанные с разными типами мультимедиа, при выделении ресурсов ЦП и графического процессора (хотя управление ресурсами графического процессора в ОС Windows Vista не реализовано). На рис. 3 показано содержание одного из разделов задач реестра сразу после установки ОС Windows Vista, хотя сторонние разработчики могут добавлять и собственные определения задач.
Рис. 3 Определение аудиозадачи в планировщике классов мультимедиа.
Служба MMCSS, реализованная в файле %SystemRoot%\System32\Mmcss.dll и запускаемая в процессе работы узла службы (Svchost.exe), имеет поток управления приоритетами, который выполняется с приоритетом 27. (Приоритеты потоков в ОС Windows находятся в диапазоне от 0 до 31). Этот поток повышает приоритет зарегистрированных потоков мультимедиа до диапазона, связанного со значением Scheduling Category раздела реестра данной задачи, как показано на рисунке 4. В системе Windows приоритеты потоков от 16 и выше относятся к диапазону приоритетов реального времени, что выше приоритета любых потоков в системе (за исключением рабочих потоков диспетчера памяти, которые выполняются с приоритетом 28 или 29). Права на увеличение приоритета, необходимые для установки приоритетов потоков реального времени, есть только у учетных записей с правами администратора, например у локальной системной учетной записи, в которой выполняется служба MMCSS.
При проигрывании звукового файла проигрыватель Windows Media регистрирует потоки задачи аудио, а при проигрывании файла видео — потоки задачи воспроизведения. Служба MMCSS повышает приоритет всех потоков, заявивших о доставке потоковых данных, одновременно, когда они выполняются в процессе, которому принадлежит окно переднего плана, и если в разделе определения их задачи значение BackgroundOnly установлено в True.
Но в то время, как служба MMCSS помогает потокам мультимедиа получить необходимое время ЦП, она также гарантирует получение, по крайней мере, части процессорного времени другими процессами для обеспечения реакции системы и других приложений. Следовательно, служба MMCSS резервирует для других действий определенную часть процессорного времени , заданную в следующем разделе реестра:
По умолчанию это составляет 20 процентов, т.е. служба MMCSS отслеживает загрузку ЦП и не разрешает выполнение потоков с повышенным приоритетом в течение времени свыше 8 мс из 10, если ресурсы ЦП запрашиваются другими потоками. Чтобы потоки мультимедиа не мешали другим потокам в течение остальных 2 мс, планировщик понижает их приоритет до диапазона от 1 до 7.
Изменения, относящиеся к операциям ввода-вывода в ОС Windows Vista, включают в себя файловые символические ссылки, более эффективную обработку завершения операций ввода-вывода, полную поддержку отмены операций ввода-вывода и поддержку приоритетов операций ввода-вывода.
Одной из функций файловой системы, которой по мнению многих недоставало в системе NTFS, является поддержка символических ссылок на файлы (или, как они называются в UNIX-системах, гибких ссылок), которая появилась в ОС Windows Vista. В версии NTFS для Windows 2000 были представлены символические ссылки на каталоги, которые назывались соединениями каталогов, что позволяло создавать каталоги, указывающие на другие каталоги, но до выхода ОС Windows Vista файловая система NTFS поддерживала только жесткие ссылки на файлы.
Основным отличием в том, как в ОС Windows разрешаются символические ссылки и соединения каталогов, является способ их обработки. ОС Windows обрабатывает символические ссылки в локальной системе даже если они ссылаются на место на удаленном файловом сервере. ОС Windows обрабатывает соединения каталогов, ссылающиеся на удаленный файловый сервер, на самом сервере. Символические ссылки на сервере могут, таким образом, ссылаться на местоположения, доступные только с клиентских компьютеров, например тома на других клиентских компьютерах, что невозможно для соединений каталогов. Для решения этой проблемы ОС Windows Vista поддерживает новый тип символических ссылок как для файлов, так и для каталогов.
Многие команды файловой системы обновлены для учета особенностей символических ссылок. Например, команда Delete (Удалить) не следует по ссылке, что приводило бы к удалению целевого объекта, а удаляет саму ссылку. Однако в связи с тем, что некоторые приложения могут неправильно обрабатывать символические ссылки, для создания таких ссылок необходимы права на создание символических ссылок, которые по умолчанию имеются только у администраторов.
Символическую ссылку можно создать из командной строки с помощью команды Mklink. Встроенная команда вывода содержимого каталога командной строки обозначает символические ссылки пометкой и показывает конечный объект в квадратных скобках, как показано на рисунке 5. Проводник Windows также понимает символические ссылки и отображает их со стрелкой как ярлыки. Конечный объект ссылки можно видеть в Проводнике, если добавить к окну обзора столбец Link Target (Цель ссылки).
Рисунок 5 Создание символической ссылки с помощью команды Mklink
Завершение и отмена операций ввода-вывода
В систему ввода-вывода введено множество внутренних изменений, которые могут улучшить производительность серверных приложений. Как правило, такие приложения используют объект синхронизации, называемый портом завершения, для ожидания завершения асинхронных запросов ввода-вывода. До выхода ОС Windows Vista при завершении операции ввода-вывода инициировавший данную операцию поток выполнял задачу завершения ввода-вывода, что приводило к переключению в процесс, к которому принадлежал данный поток, и прерыванию прочих действий. Затем система ввода-вывода обновляла состояние порта завершения, что приводило к возобновлению потока, ожидавшего изменения состояния порта.
В ОС Windows Vista обработка завершения ввода-вывода выполняется не потоком, инициировавшим операцию ввода-вывода, а потоком, ожидающим изменения состояния порта завершения. Это относительно небольшое изменение позволяет избежать ненужного планирования выполнения потоков и переключения контекста, что приводило к снижению общей производительности системы и приложений. Для еще большего повышения производительности сервер может получать результаты разных операций ввода-вывода от завершения одним запросом, избегая переходов в режим ядра.
Вероятно, одним из наиболее заметных нововведений в систему ввода-вывода с точки зрения конечного пользователя является поддержка в ОС Windows Vista отмены синхронных операций ввода-вывода. Всем, кто когда-либо выполнял команду net view или пытался обратиться к общему ресурсу на выключенном удаленном компьютере под управлением ОС Windows XP или Windows Server® 2003, знакомы проблемы с операциями ввода-вывода, которые невозможно отменить: команда или окно проводника не отвечали до истечения времени ожидания сети. Приложению не оставалось ничего иного, кроме как ожидать ошибки выполнения операции, поскольку не существовало способа оповестить драйвер устройства, выполняющий операцию ввода-вывода, о том, что данную операцию выполнять уже не нужно.
Большинство операций ввода-вывода в ОС Windows Vista можно отменить, включая операцию открытия файла, которую используют команда Net View и Проводник. Однако для того, чтобы приложения отвечали на запросы пользователя об отмене операции ввода-вывода, их необходимо обновить, и многие служебные программы ОС Windows Vista, взаимодействующих с устройствами, имеющими интервал ожидания, уже поддерживают данную возможность. Например, в диалоговых окнах открытия и сохранения файлов, применяющихся практически во всех приложениях ОС Windows, включая сторонние приложения, теперь во время отображения содержимого папки доступна кнопка Cancel (Отменить). Синхронные операции ввода-вывода команды Net также могут быть отменены нажатием комбинации клавиш Ctrl+C.
В преимуществах возможности отмены операций ввода-вывода легко убедиться, открыв окно командной строки в ОС Windows Vista и набрав команду:
net view (\\nonexistentmachine)
Команда не будет отвечать до тех пор, пока ОС Windows будет пытаться связаться с несуществующей системой, но ее можно будет прервать, воспользовавшись сочетанием клавиш Ctrl+C. В ОС Windows XP комбинация клавиш Ctrl+C не действовала и команда не отвечала до истечения срока ожидания сети.
Еще одной разновидностью проблем с вводом-выводом в предыдущих версиях ОС Windows было то, что драйверы устройств не могли быть отменены должным образом, поскольку не существовало простого способа известить их об этом. Если пользователю приходилось завершать процесс, а затем видеть, как он остается в списке процессов, было можно наблюдать, как драйвер устройства не может ответить на запрос завершения процесса и отмены операции ввода-вывода, инициированной незавершенным процессом. ОС Windows не может окончательно завершить процесс до того, как все операции ввода-вывода данного процесса не будут либо завершены, либо отменены. В ОС Windows Vista драйверы устройств без проблем регистрируют извещения о завершении процесса, так что большинство проблем, связанных с незавершаемыми процессами, остались в прошлом.
Приоритет операций ввода-вывода
Несмотря на то, что операционная система Windows всегда поддерживала приоритеты использования ЦП, в ней отсутствовало понятие приоритетов операций ввода-вывода. Без поддержки приоритетов ввода-вывода фоновые операции, например индексация поиска, поиск вирусов и дефрагментация диска могут существенно ухудшать скорость ответа операций переднего плана. Пользователь, запускающий приложение или открывающий документ в то время, как другой процесс выполняет, например, операцию дискового ввода-вывода, сталкивается с задержками, поскольку приложению переднего плана приходится дожидаться доступа к диску. С теми же препятствиями сталкивается воспроизведение с жесткого диска потокового мультимедийного содержимого, например песни.
ОС Windows Vista обеспечивает два новых способа распределения приоритетов для предоставления предпочтения операциям ввода-вывода переднего плана: приоритеты на отдельные операции ввода-вывода и резервирование полосы пропускания ввода-вывода. Система ввода-вывода в ОС Windows Vista обеспечивает внутреннюю поддержку приоритетов операций ввода-вывода, как показано на рисунке 6, но используются только четыре приоритета (возможно, следующие версии ОС Windows будут поддерживать приоритет High (Высокий)).
Рисунок 6.
Приоритетом по умолчанию для операций ввода-вывода является Medium (Средний), а диспетчер памяти использует приоритет High (Высокий) для записи на диск содержимого памяти в ситуациях нехватки памяти для освобождения ОЗУ для других данных и кода. Планировщик задач ОС Windows устанавливает приоритет по умолчанию для задач ввода-вывода Low (Низкий), а написанные для ОС Windows Vista приложения, осуществляющие фоновую обработку, указывают приоритет Very Low (Очень низкий). Все фоновые операции в ОС Windows Vista, включая сканирование Windows Defender (Защитник ОС Windows) и индексирование поиска на рабочем столе, используют приоритет ввода-вывода Very Low (Очень низкий).
Драйвер устройства класса системного хранения (%SystemRoot%\System32\Classpnp.sys) обеспечивает приоритеты ввода-вывода, которые автоматически применяются к операциям ввода-вывода, ориентированных на большинство устройств хранения. Этот и другие драйверы хранения помещают в свои очереди операции ввода-вывода с приоритетом Medium (Средний) до операций с приоритетами Low (Низкий) и Very Low (Очень низкий), но при этом выполняют, как минимум, одну операцию с приоритетом Low (Низкий) или Very Low (Очень низкий) в секунду, чтобы не препятствовать выполнению фоновых процессов. Данные, прочитанные операциями с приоритетами Low (Низкий) и Very Low (Очень низкий), также приводят к тому, что диспетчер кэша производит запись изменений на диск незамедлительно, не откладывая, и обходит логику упреждающего чтения для операций чтения, что в противном случае приводило бы к упреждающему чтению из файлов, открытых для чтения. Пример операций с приоритетом Very Low (Очень низкий), выводимых программой Process Monitor, можно увидеть на боковой врезке «Просмотр операций ввода-вывода с приоритетом Very Low (Очень низкий)».
Поддержка резервирования полосы пропускания в ОС Windows Vista удобна для применения приложениями воспроизведения данных мультимедиа, и проигрыватель Windows Media пользуется ею наряду с повышением приоритетов службой MMCSS для почти безошибочного воспроизведения локального содержимого. Приложение проигрывателя мультимедиа запрашивает у системы ввода-вывода гарантии возможности чтения данных на указанной скорости и если устройство может предоставлять данные с указанной скоростью, а существующие ограничения резервирования это позволяют, оно предоставляет приложению данные о допустимой скорости и объеме операций ввода-вывода. Система ввода-вывода станет обслуживать другие операции только в том случае, если возможно удовлетворить требования приложений, зарезервировавших целевое устройство хранения.
В завершение следует упомянуть о еще одном изменении в системе ввода-вывода, относящемся к объему операций ввода-вывода. Со времен первой версии ОС Windows NT диспетчер памяти и система ввода-вывода ограничивали объем данных, обрабатываемых отдельным запросом ввода-вывода для устройства хранения, 64 КБ. Таким образом, даже если запрос ввода-вывода приложения был значительно больше, он разбивался на отдельные запросы, не превышающие 64 КБ. Каждая операция ввода-вывода подразумевала дополнительные затраты ресурсов на переключение в режим ядра и инициирование передачи ввода-вывода на устройство хранения, поэтому в ОС Windows Vista объем операций ввода-вывода больше не ограничивается. Некоторые компоненты пользовательского режима ОС Windows Vista подверглись модификациям для того, чтобы воспользоваться преимуществами большего объема операций ввода-вывода, включая функцию копирования в Проводнике и команду командной строки Copy (Копировать), которые теперь оперируют операциями ввода-вывода объемом 1 МБ.
Что дальше
Были рассмотрены две области, в которых ядро ОС Windows Vista подверглось улучшениям. Более подробное рассмотрение будет представлено в следующем издании книги Windows Internals (Внутренняя структура ОС Windows) (в соавторстве с Дэвидом Соломоном), которое должно выйти одновременно с ОС Windows Server под кодовым названием «Longhorn». В следующей статье данной серии будет продолжено знакомство с новым ядром и обсуждены вопросы управления памятью, а также запуска и завершения работы системы.
Марк Руссинович занимает должность технического специалиста в подразделении Platform and Services корпорации Майкрософт. Он один из соавторов книги Microsoft Windows Internals (Внутренняя структура ОС Microsoft Windows ), издательство Microsoft Press, 2004, и часто выступает с докладами на конференциях для IT-специалистов и разработчиков. Он был принят на работу в корпорацию Майкрософт после недавнего приобретения ею компании Winternals Software, одним из основателем которой он являлся. Он также создал веб-узел Sysinternals, на котором им были опубликованы утилиты Process Explorer, Filemon и Regmon.