Один из наиболее важных процессов, происходящих за последнее время в области операционных систем, – постепенное переориентирование пользователей Windows на Windows NT. Представители Microsoft уже в течение достаточно долгого времени говорят о том, что Windows 9х заканчивает свое существование, и начиная с Windows 2000 корпорация будет разрабатывать только системы на основе ядра Windows NT.
К сожалению, современные версии NT почти лишают пользователя возможности насладиться последними достижениями игровой индустрии (это является причиной, по которой на домашних компьютерах, как правило, установлена Windows 9х), но для машины, которая предназначена исключительно для работы, NT оказывается намного лучше «домашней» серии ОС от Microsoft.
Многие хотят узнать больше об этой системе, причем не читая больших серьезных книг, предназначенных в основном для системных администраторов. Именно для такой категории пользователей и был написан этот материал.
Немного об истории Windows NT
Как известно, первая версия OS/2 была разработана совместными усилиями программистов из Microsoft и IBM и выпущена в 1987 г. Довольно скоро после нее появилась OS/2 1.3 – чуть ли не единственная ОС, реализующая все возможности процессора Intel 80286. После выпуска этой системы обе компании принялись за разработку новой ОС под рабочим названием OS/2 NT (NT расшифровывается как New Technology). И действительно она обладала многими чертами, присущими ОС для больших машин, которые выпускала IBM. Но в тот момент, когда практически весь код этой системы был отлажен, Microsoft разрывает контракт, выплачивает немалые деньги в качестве неустойки и переписывает GUI (графический интерфейс системы). Также специалисты вносят в систему некоторые изменения и выпускают ее на рынок под названием Windows NT. Появление этой ОС опередило выход новой версии OS/2, версия 2.0 которой является «прямым потомком* OS/2 NT. С этого момента дороги NT и OS/2 разошлись, и эти системы стали все более отличаться друг от друга с появлением последующих версий.
Поначалу Windows NT не завоевала большой популярности из-за слишком высоких по тем временам требований, предъявляемых к аппаратной части. Популярность пришла с выходом версии 3.51, которая была по достоинству оценена сначала системными администраторами, а затем и пользователями. Система была действительно неплоха. Она была полностью 32-битной, имела очень неплохой механизм защиты и выполняла те действия, которые от нее требовались, очень надежно. К сожалению, эта система была очень требовательна к ресурсам, особенно к объему RAM. Это в настоящее время нетрудно найти компьютер с большим количеством мегабайт ОЗУ, например на машине, где набивается этот текст, – 256 Мбайт RAM. Во времена же широкого распространения NT 3.51 даже на серверах найти 64 Мбайт было довольно затруднительно. А в 1996 г. компания выпустила Windows NT 4.0. Во время рекламной камлании представители Microsoft утверждали, что NT 4 –
нечто среднее между будущей суперОС и NT 3.5х. Может быть, именно из-за этого на четвертую версию боялись переходить довольно долго, но, когда система доказала свою конкурентоспособность, очень многие пользователи NT 3.5х перешли на 4.0. Сейчас NT 4.0 является одной из наиболее используемых операционных систем, поскольку она не только позволяет сделать очень многое, но и очень надежна. Теперь, когда читателю известна краткая история Windows NT, можно переходить к более детальному рассмотрению ее компонентов.
Основа концепции Windows NT
Структура: NT executive и защищенные подсистемы
При разработке структуры Windows NT была использована концепция микроядра. В соответствии с ней ОС разделена на несколько подсистем, каждая из которых выполняет отдельный набор сервисных функций, например сервис памяти, сервис по созданию процессов или сервис по планированию процессов.
Сервисы выполняются серверами. Каждый сервер реализуется в пользовательском режиме, исполняя цикл проверки запроса от клиента на одну из его сервисных функций. Клиент, которым может быть либо другая компонента ОС, либо прикладная программа, запрашивает сервис, посылая сообщение на сервер. Ядро ОС (или микроядро), работая в привилегированном режиме, доставляет сообщение нужному серверу, который выполняет операцию, после этого ядро возвращает результаты клиенту с помощью другого сообщения.
Структурно Windows NT может быть представлена в виде двух частей: одна работает в режиме пользователя, а другая -в режиме ядра (рис. 1).
Часть Windows NT, работающая в режиме ядра, называется исполнительной частью (executive). Она включает ряд компонентов, которые управляют виртуальной памятью, объектами (ресурсами), вво-дом/выводом и файловой системой (включая сетевые драйверы), взаимодействием процессов и частично системой безопасности. Эти компоненты взаимодействуют между собой с помощью межмодульной связи. Каждый компонент вызывает другие с помощью набора тщательно специфицированных внутренних процедур.
Часть Windows NT, работающую в режиме пользователя, составляют серверы – так называемые защищенные подсистемы (каждый из них выполняется в отдельном процессе, память которого отделена от других процессов системой управления виртуальной памятью NT executive). Поскольку подсистемы автоматически не могут совместно использовать память, они общаются друг с другом посредством посылки сообщений. Сообщения могут передаваться как между клиентом и сервером, так и между двумя серверами. Все сообщения проходят через исполнительную часть Windows NT. Ядро Windows NT планирует нити защищенных подсистем точно так же, как и нити обычных прикладных процессов.
Поддержку защищенных подсистем обеспечивает исполнительная часть -Windows NT executive, которая работает в пространстве ядра и никогда не сбрасывается на диск. Ее составными частями являются:
Менеджер объектов.
Создает, удаляет объекты NT executive (абстрактные типы данных, используемых для представления ресурсов системы) и управляет ими.
Монитор безопасности. Устанавливает правила защиты на локальном компьютере. Охраняет ресурсы операционной системы, выполняет защиту и регистрацию исполняемых объектов.
Менеджер процессов.
Создает и завершает, приостанавливает и возобновляет процессы и нити, а также хранит информацию о них.
Менеджер виртуальной памяти. Подсистема ввода/вывода. Включает в себя следующие компоненты:
• менеджер ввода/вывода, предоставляющий средства ввода/вывода, независимые от устройств;
• файловые системы – NT-драйверы, выполняющие файл-ориентированные запросы на ввод/вывод и транслирующие их в вызовы обычных устройств;
• сетевой редиректор и сетевой сервер -драйверы файловых систем, передающие удаленные запросы на ввод/вывод на машины сети и получающие запросы от них;
• драйверы устройств NT executive – низкоуровневые драйверы, которые непосредственно управляют устройством;
• менеджер кэша, реализующий кэширование диска.
Исполнительная часть основывается на службах нижнего уровня, предоставляемых ядром (его можно назвать и микроядром) NT. В функции ядра входит планирование процессов, обработка прерываний и исключительных ситуаций, синхронизация процессоров для многопроцессорных систем, восстановление системы после сбоев.
Ядро работает в привилегированном режиме и никогда не удаляется из памяти. Обратиться к ядру можно только посредством прерывания. Ядро расположено над уровнем аппаратных абстракций (Hardware Abstraction Level HAL), который концентрирует в одном месте большую часть машинно-зависимых процедур. HAL располагается между NT executive и аппаратным обеспечением и скрывает от системы такие детали, как контроллеры прерываний, интерфейсы ввода/вывода и механизмы взаимодействия между процессорами. Такое решение позволяет легко переносить Windows NT с одной платформы на другую путем замены слоя HAL.
При создании NT разработчики руководствовались задачами улучшения производительности и сетевых возможностей, а также требованием поддержки определенного набора прикладных сред. Эта цель была достигнута продуманным разделением функций между модулями ядра и остальными модулями. Например, передача данных в файловую систему и по сети производится быстрее в пространстве ядра, поэтому внутри ядра NT выделены буфера для небольших по объему (16-32 Кбайт) операций чтения и записи, являющихся типичными для приложений клиент-сервер и распределенных приложений. Размещение этих функций ввода/вывода внутри ядра, возможно, и портит академическую чистоту микроядра NT, но соответствует цели создания NT.
Защищенные подсистемы Windows NT работают в пользовательском режиме и создаются Windows NT во время загрузки операционной системы. Сразу после создания они начинают бесконечный цикл своего выполнения, отвечая на сообщения, поступающие к ним от прикладных процессов и других подсистем. Среди защищенных подсистем можно выделить подсистемы окружения. Они реализуют интерфейсы приложений операционной системы (API). Другие типы подсистем, называемые интегральными, исполняют необходимые операционной системе задачи. Например, большая часть системы безопасности Windows NT и сетевые серверы реализованы как интегральные подсистемы.
Наиболее важной подсистемой окружения является Win32 – подсистема, которая обеспечивает доступ для приложений к 32-bit Windows API. Дополнительно эта система обеспечивает графический интерфейс с пользователем и управляет вводом/выводом его данных. Также поддерживаются подсистемы POSIX, OS/2, 16-разрядная Windows и MS-DOS.
Каждая защищенная подсистема работает в режиме пользователя, вызывая системный сервис NT executive для выполнения привилегированных действий в режиме ядра. Сетевые серверы могут выполняться как в режиме пользователя, так и в режиме ядра (в зависимости от того, как они разработаны).
Подсистемы связываются между собой путем передачи сообщений. Когда, например, пользовательское приложение вызывает какую-нибудь API-процедуру, подсистема окружения, обеспечивающая эту процедуру, получает сообщение и выполняет ее либо обращаясь к ядру, либо посылая сообщение другой подсистеме. После завершения процедуры подсистема окружения посылает приложению сообщение, содержащее возвращаемое значение. Посылка сообщений и другая деятельность защищенных подсистем невидимы для пользователя.
Основным средством, скрепляющим все подсистемы Windows NT в единое целое, является механизм вызова локальных процедур (Local Procedure Call – LPC). LPC представляет собой оптимизированный вариант более общего средства -удаленного вызова процедур (RPC), которое используется для связи клиентов и серверов, расположенных на разных машинах сети.
Средства LPC поддерживают несколько способов передачи данных между клиентами и серверами: один – для передачи коротких сообщений, другой – для длинных, а третий оптимизирован специально для использования подсистемой Win32. Каждая подсистема устанавливает порт – канал связи, посредством которого с ней могут связываться другие процессы. Порты реализуются как объекты.
Windows NT использует защищенные подсистемы с целью:
• обеспечить несколько программных интерфейсов (API), по возможности не усложняя при этом базовый программный код (NT executive);
• изолировать базовую операционную систему от изменений или расширений в поддерживаемых API;
• объединить часть глобальных данных, требующихся всем API, и в то же время отделить данные, использующиеся каждым отдельным API, от всех остальных;
• защитить окружение каждого API от приложений, а также от окружений других API и защитить базовую операционную систему от различных окружений;
• позволить операционной системе расширяться в будущем за счет новых API.
Таким образом, реализация частей ОС в виде серверов, выполняющихся в режиме пользователя, является важнейшей частью проекта Windows NT и оказывает
глубокое воздействие на функционирование системы в целом.
Микроядро NT служит главным образом средством поддержки для переносимой основной части ОС – набора пользовательских сред. Концентрация машиннозависимых программ внутри микроядра делает перенос NT на разнообразные процессоры относительно легким. Но в то время, как некоторые микроядра (Mach и Chorus) предполагается поставлять в качестве самостоятельного программного продукта, из операционной системы Windows NT ядро вряд ли может быть вычленено для отдельного использования. Это является одной из причин того, что некоторые специалисты не считают Windows NT истинно микроядерной ОС в том смысле, в котором таковыми являются Mach и Chorus. Они же отмечают, что NT не исключает, как это положено, все надстроенные службы из пространства ядра и что драйверы устройств в NT по минимуму взаимодействуют с ядром, предпочитая работать непосредственно с лежащим ниже слоем аппаратной абстракции HAL.
Множественные прикладные среды
При разработке NT важнейшим рыночным требованием являлось обеспечение поддержки по крайней мере двух уже существующих программных интерфейсов -OS/2 и POSIX, а также возможности добавления других API в будущем.
Для того чтобы программа, написанная для одной ОС, могла быть выполнена в рамках другой, недостаточно лишь обеспечить совместимость API. Кроме этого необходимо обеспечить ей «родное» окружение: структуру процесса, средства управления памятью, средства обработки ошибок и исключительных ситуаций, механизмы защиты ресурсов и семантику файлового доступа. Отсюда ясно, что поддержка нескольких прикладных программных сред является очень сложной задачей, тесно связанной со структурой операционной системы. Она была успешно решена в Windows NT, при этом в полной мере использовался опыт разработчиков ОС Mach из университета Карнеги-Меллона, которые смогли в своей клиент-серверной реализации UNIX отделить базовые механизмы операционной системы от серверов API различных ОС.
Windows NT поддерживает 5 прикладных сред операционных систем: MS-DOS, 16-разрядный Windows, OS/2 1.x, POSIX и 32-разрядный Windows (Win32). Все они реализованы как подсистемы окружения. Каждая работает в собственном защищенном пользовательском пространстве. Подсистема Win32 обеспечивает поддержку дисплея, клавиатуры и мыши для четырех остальных подсистем.
16-битовые приложения DOS и Windows работают на VDM (virtual DOS machines – виртуальные машины DOS), каждая из которых эмулирует полный (80×86) процессор с MS-DOS. В NT VDM является приложением Win32, значит, как и обычные модули прикладных сред для UNIX, приложения DOS и 16-битовой Windows расположены в слое непосредственно над подсистемой Win32.
Подсистемы OS/2 и POSIX построены по-другому. В качестве полноценных подсистем NT они могут взаимодействовать с подсистемой Win32 для получения доступа к вводу и выводу, но также могут обращаться непосредственно к исполнительной системе NT за другими средствами операционной системы. Подсистема OS/2 может выполнять многие имеющиеся приложения OS/2 символьного режима, включая OS/2 SQL Server, и поддерживает именованные каналы и NetBIOS.
Однако возможности подсистемы POSIX весьма ограничены, несмотря на ее непосредственный доступ к службам ядра. Приложения POSIX должны быть откомпилированы специально для Windows NT. NT не поддерживает двоичный код, предназначенный для других POSIX-совместимых систем, таких, как UNIX. К тому же подсистема POSIX NT не поддерживает непосредственно печать, сетевой доступ (за исключением доступа к удаленным файловым системам) и многие средства Win32, например отображение на память файлов и графику.
На рис. 2 показана структура, обеспечивающая в Windows NT поддержку множественных прикладных сред NT executive выполняет базовые функции операционной системы и является той основой, на которой подсистемы окружения реализуют поддержку своих приложений. Все подсистемы равноправны и могут вызвать «родные» функции NT для создания соответствующей среды для своих приложений.
Каждая подсистема окружения имеет свое представление о том, что такое, например, процесс или описатель файла, поэтому структуры данных, используемые в каждом окружении, могут не совпадать. Следовательно, как только подсистема Win32 передала прикладной процесс другой подсистеме окружения, данное приложение становится клиентом этой подсистемы вплоть до завершения процесса. При этом подсистема Win32 перенаправляет входные сообщения от пользователя этому приложению, а также отображает вывод приложения на экране.
Объектно-ориентированный подход
Хотя NT и не является полностью объектно-ориентированной, в ее основе – объекты. Единообразная форма именования, совместного использования и учета системных ресурсов, простой и дешевый способ обеспечения безопасности системы и ее модификации – все эти преимущества могут быть достигнуты при использовании объектной модели.
В Windows NT любой ресурс системы, который одновременно может быть использован более чем одним процессом, включая файлы, совместно используемую память и физические устройства, реализован в виде объекта и управляется рядом функций. Такой подход сокращает число изменений, которые необходимо внести в операционную систему в процессе ее эксплуатации. Если, скажем, изменилось что-то в аппаратуре, то все, что необходимо сделать, это заменить соответствующий объект. Аналогично, если требуется поддержка новых ресурсов, то надо добавить только новый обьект, не изменяя при этом остального кода операционной системы.
Наиболее фундаментальное отличие между объектом и обыкновенной структурой данных заключается в том, что внутренняя структура данных объекта скрыта от наблюдения. Вы должны вызвать объектную функцию для того, чтобы получить данные из объекта или поместить их в него.
Вы не можете непосредственно изменять данные, находящиеся внутри объекта. Это отделяет средства реализации объекта от кода, который только использует его. Такая техника позволяет легко изменять впоследствии реализацию объектов.
Группа разрабопиков NT executive решила использовать объекты для представления системных ресурсов, потому что объекты обеспечивают централизованные средства для выполнения трех важных (и часто утомительных) задач ОС: поддержка воспринимаемых человеком имен системных ресурсов, разделение ресурсов и данных между процессами, защита ресурсов от несанкционированного доступа.
Не все структуры данных в NT executive являются объектами. Объектами сделаны только такие данные, которые нужно разделять, защищать, именовать или делать видимыми для программ пользовательского режима (с помощью системных функций). Структуры, которые используются только одним компонентом executive для выполнения внутренних функций, не являются объектами.
Несмотря на всестороннее использование объектов для представления разделяемых ресурсов, Windows NT не является объектно-ориентированной системой в строгом смысле. Большая часть кода операционной системы написана на С с целью обеспечения переносимости. Несмотря на то, что С не поддерживает непосредственно объектно-ориентированные конструкции, такие, как динамическое связывание типов данных, полиморфные функции или наследование классов, эти инструменталь
ные средства были использованы из-за их широкой распространенности.
Менеджер объектов – это компонента NT executive, которая ответственна за создание, удаление, защиту и слежение за NT-объектами. Менеджер объектов централизует операции управления ресурсами, которые в противном случае будут разбросаны по всей ОС.
Менеджер объектов NT выполняет следующие функции:
• выделяет память для объекта;
• присоединяет к объекту так называемый дескриптор безопасности, который определяет, кому разрешено использовать объект и что можно с ним делать;
• создает и манипулирует структурой каталога объектов, в котором хранятся имена объектов;
• создает описатель объекта и возвращает его вызывающему процессу.
Процессы пользовательского режима, включая подсистемы окружения, должны иметь описатель объекта перед тем, как их нити смогут использовать этот объект. Использование описателей для работы с системными ресурсами не является новой идеей. Например, библиотеки С и Паскаля (и других языков) возвращают описатели для открытых файлов. Аналогично приложения Win32 используют различные типы описателей для управления окнами, курсором мыши, иконками. В обоих случаях описатели служат косвенными указателями на системные ресурсы; эта косвенность предохраняет прикладные программы от рутинной работы непосредственно с системными структурами данных.
Каждый NT-объект является объектом определенного типа. Тип определяет данные, которые хранит объект, и «родные» системные функции, которые могут к нему применяться. Для того чтобы управлять различными объектами единообразно, менеджер объектов требует, чтобы каждый из них содержал несколько полей стандартной информации в определенном месте. До тех пор, пока эти данные имеются, менеджер не заботится о том, что еще хранится в объекте. Каждый объект состоит из двух частей – заголовка и тела, которые содержат стандартные и переменные данные объекта соответственно. Менеджер объектов работает с заголовком, а другие компоненты executive работают с телами объектов тех типов, которые они сами создают. Заголовок используется менеджером без учета типа объекта. В заголовке объекта любого типа содержится имя, каталог, дескриптор безопасности, квоты на использование ресурсов, счетчик открытых описателей, база данных открытых описателей, постоянный/временный признак, режим пользователя/ядра, указатель на тип объекта.
Кроме заголовка, каждый объект имеет тело, формат и содержание которого уникально определяется типом этого объекта: у всех объектов одного и того же типа одинаковый формат тела. При создании объекта исполнительная часть может оперировать данными в телах всех объектов этого типа.
Процессы и нити
Понятия процессов и нитей являются одними из ключевых понятий в современных операционных системах, поэтому стоит уделить им несколько большее внимание.
В разных ОС процессы реализуются по-разному. Эти различия заключаются в том, какими структурами данных представлены процессы, как они именуются, какими способами защищены друг от друга и какие отношения существуют между ними. Процессы Windows NT имеют следующие характерные свойства: реализованность в форме объектов (доступ к ним осуществляется посредством службы объектов); многонитевая организация; наличие встроенных средств синхронизации.
Менеджер процессов Windows NT не поддерживает между процессами отношений типа «родитель-потомок».
В любой системе понятие процесс включает следующее:
• исполняемый код;
• собственное адресное пространство, которое представляет собой совокупность виртуальных адресов, которые может использовать процесс;
• ресурсы системы, такие, как файлы, семафоры и т. п., которые назначены процессу операционной системой;
• хотя бы одну выполняемую нить.
Адресное пространство каждого процесса защищено от вмешательства в любого другого процесса. Это обеспечивается механизмами виртуальной памяти. Операционная система, конечно, тоже защищена от прикладных процессов. Чтобы выполнить какую-либо процедуру ОС или прочитать что-либо из ее области памяти, нить должна выполняться в режиме ядра. Пользовательские процессы получают доступ к функциям ядра посредством системных вызовов. В пользовательском режиме выполняются не только прикладные программы, но и защищенные подсистемы Windows NT.
В Windows NT процесс – просто объект, создаваемый и уничтожаемый менеджером объектов. Объект-процесс, как и другие объекты, содержит заголовок, который создает и инициализирует менеджер объектов. Менеджер процессов определяет атрибуты, хранимые в теле объекта-процесса, а также обеспечивает системный сервис, который восстанавливает и изменяет эти атрибуты.
В число атрибутов тела объекта-процесса входят:
• Идентификатор процесса – уникальное значение, которое идентифицирует процесс в рамках операционной системы. • Токен доступа – исполняемый объект, содержащий информацию о безопасности. • Базовый приоритет – основа для исполнительного приоритета нитей процесса. • Процессорная совместимость – набор процессоров, на которых могут выполняться нити процесса.
• Предельные значения квот – максимальное количество страничной и нестраничной системной памяти, дискового пространства, предназначенного для выгрузки страниц, процессорного времени,
которые могут быть использованы процессами пользователя.
• Время исполнения – общее количество времени, в течение которого выполняются все нити процесса.
Напомним, что нить является выполняемой единицей, которая располагается в адресном пространстве процесса и использует ресурсы, выделенные процессу. Подобно процессу, нить в Windows NT реализована в форме объекта и управляется менеджером объектов.
Объект-нить имеет следующие атрибуты тела:
• Идентификатор клиента – уникальное значение, которое идентифицирует нить при ее обращении к серверу.
• Контекст нити – информация, которая необходима ОС для того, чтобы продолжить выполнение прерванной нити. Контекст нити содержит текущее состояние регистров, стеков и индивидуальной области памяти, которая используется подсистемами и библиотеками.
• Динамический приоритет – значение приоритета нити в данный момент.
• Базовый приоритет – нижний предел динамического приоритета нити.
• Процессорная совместимость нитей -перечень типов процессоров, на которых может выполняться нить.
• Время выполнения нити – суммарное время выполнения нити в пользовательском режиме и в режиме ядра, накопленное за период существования нити.
• Состояние предупреждения – флаг, который показывает, что нить должна выполнять вызов асинхронной процедуры.
• Счетчик приостановок – текущее количество приостановок выполнения нити.
Как видно из перечня, многие атрибуты объекта-нити аналогичны атрибутам объекта-процесса. Весьма сходны и сервисные функции, которые могут быть выполнены над объектами-процессами и объектами-нитями: создание, открытие, завершение, приостановка, запрос и установка информации, запрос и установка контекста и другие функции.
Алгоритм планирования процессов и нитей
В Windows NT реализована вытесняющая многозадачность, при которой операционная система не ждет, когда нить сама захочет освободить процессор, а принудительно снимает ее с выполнения после того, как та израсходовала отведенное ей время (квант), или если в очереди готовых появилась нить с более высоким приоритетом. При такой организации разделения процессора ни одна нить не займет процессор на очень долгое время.
Жизненный цикл нити начинается в тот момент, когда программа создает новую нить. Запрос передается NT executive, менеджер процессов выделяет память для объекта-нити и обращается к ядру, чтобы инициализировать объект-нить ядра.
Диспетчер ядра использует для определения порядка выполнения нитей алгоритм, основанный на приоритетах, в соответствии с которым каждой нити присваивается число (приоритет), и нити с более высоким приоритетом выполняются раньше нитей с меньшим приоритетом. В самом начале нить получает приоритет от процесса, который создает ее. В свою очередь процесс получает приоритет в тот момент, когда его создает подсистема той или иной прикладной среды. Значение базового приоритета присваивается процессу системой по умолчанию или системным администратором. Нить наследует этот базовый приоритет и может изменить его, немного увеличив или уменьшив. На основании получившегося в результате приоритета, называемого приоритетом планирования, начинается выполнение нити. В ходе выполнения приоритет планирования может меняться.
Windows NT поддерживает 32 уровня приоритетов, разделенных на два класса -класс реального времени и класс переменных приоритетов. Нити реального времени, приоритеты которых находятся в диапазоне от 16 до 31, являются более приоритетными процессами и используются для выполнения задач, критичных ко времени.
Каждый раз, когда необходимо выбрать нить для выполнения, диспетчер прежде всего просматривает очередь готовых нитей реального времени и обращается к другим нитям, только когда очередь нитей реального времени пуста.
ство нитей в системе попадают в класс нитей с переменными приоритетами, диапазон приоритетов которых от 0 до 15. Этот класс имеет название «переменные приоритеты» потому, что диспетчер настраивает систему, выбирая (понижая или повышая) приоритеты нитей этого класса.
Алгоритм планирования нитей в Windows NT объединяет в себе обе базовые концепции – квантование и приоритеты. Как и во всех других алгоритмах, основанных на квантовании, каждой нити назначается квант, в течение которого она может выполняться. Нить освобождает процессор, если она блокируется, уходя в состояние ожидания, или завершается; если исчерпан квант или в очереди готовых появляется более приоритетная нить.
Использование динамических приоритетов, изменяющихся во времени, позволяет реализовать адаптивное планирование, при котором не дискриминируются интерактивные задачи, часто выполняющие операции ввода/вывода и недоиспользующие выделенные им кванты. Если нить полностью исчерпала свой квант, то ее приоритет понижается на некоторую величину. В то же время приоритет нитей, которые перешли в состояние ожидания, не использовав полностью выделенный им квант, повышается. Приоритет не изменяется, если нить вытеснена более приоритетной нитью.
Для того чтобы обеспечить хорошее время реакции системы, алгоритм планирования использует наряду с квантованием концепцию абсолютных приоритетов. В соответствии с этой концепцией при появлении в очереди готовых нитей такой, у которой приоритет выше, чем у выполняющейся в данный момент, происходит смена активной нити на нить с самым высоким приоритетом.
В многопроцессорных системах при диспетчеризации и планировании нитей играет роль их процессорная совместимость: после того, как ядро выбрало нить с наивысшим приоритетом, оно проверяет, какой процессор может выполнить данную нить и, если атрибут нити «процессорная совместимость» не позволяет нити выполняться ни на одном из свободных процессоров, выбирается следующая в порядке приоритетов нить.
На этом можно временно заблокировать, уходя в состояние ожидания, нить нашего описания внутреннего устройства операционной системы Windows NT. Ведь все возможности этой ОС практически невозможно представить в одной журнальной публикации. И если квант вашего внимания еще не исчерпан, то вам наверняка будут интересны публикации о Windows NT в ближайших номерах ПЛ.
А для того чтобы применить новые знания на практике, вы можете поставить себе на компьютер этот интересный программный продукт и попробовать в нем разобраться. Помните, что наилучшие результаты всегда достигаются при совмещении теории и практики.