- •Общие сведения, ос 90-х годов.
- •Рабочие станции
- •Цели проекта Windows nt: расширяемость и переносимость.
- •Расширяемость
- •Переносимость
- •Цели проекта Windows nt: надежность, совместимость и производительность.
- •Совместимость
- •Производительность
- •Модели Windows nt: клиент-сервер.
- •Объектная модель. Симметричная мультипроцессорная обработка.
- •Защищенные подсистемы. Исполнительная система.
- •Исполнительная система
- •Основные понятия: сессия регистрации, подсистемы среды.
- •Сессия регистрации
- •Подсистемы среды
- •Базовые сервисы: объекты, объекты в памяти.
- •Объекты
- •Объекты размещаются в памяти ос.
- •Ввод-вывод и файловые системы
- •Интернационализация, регионы, Unicode.
- •Интернационализация
- •Регионы
- •Структурная обработка исключений.
- •Удержание объектов
- •Учет использования ресурсов
- •Методы объектов.
- •Защита объектов. Маркеры доступа.
- •Маркеры доступа
- •Списки контроля доступа. Общий принцип работы.
- •Как все это работает вместе
Структурная обработка исключений.
Вторая особая архитектура, поддерживаемая и используемая Windows NT, называется структурной обработкой исключений. Исключения (exceptions) — это синхронные ошибки или нетипичные события, вызывающие исполнение кода вне обычного потока управления. В отличие от прерываний, которые генерируются внешним источником, исключения возникают при исполнении программой некоторого кода и могут быть воспроизведены.
Например, когда программа вызывает функцию С mallocQ, типичным результатом будет выделение памяти и возвращение указателя на нее. Исключительная ситуация возникает тогда, когда из-за некоторой проблемы, например, недостатка свободной памяти, не удается выделить новый блок. При этом функция возвращает указатель NULL
Возврат особого значения, указывающего на исключение — это обычная, но примитивная форма обработки исключений, и она имеет ряд недостатков. Во-первых, программист обязан скрупулезно соблюдать ритуал проверки возвращаемого значения и либо реагировать на ошибки, либо передавать их на более высокий уровень программы. Если на одном из уровней проверка не проводится, то ошибки могут повлиять на не имеющие отношения к месту их возникновения части программы. Во-вторых, текст программы загромождается операторами If...Then...Else, обрабатывающими нетипичные случаи. В-третьих, информация о причине возникновения проблем не всегда легко доступна коду, который должен обработать ошибку.
Исключения могут обнаруживаться как программно, так и аппаратно. Например, аппаратура обнаруживает исключения "деление на 0", тогда как программное обеспечение определяет нарушения защиты памяти. Структурная обработка исключений — это метод, применяемый Windows NT для обработки как программных, так и аппаратных исключений, с использованием структур управления (отсюда и название) некоторого языка программирования. Структурная обработка исключений позволяет любому блоку кода определить, от исключений каких типов он хочет защищаться, и зарегистрировать специальный участок кода — обработчик исключений (exception manager), который исполняется при возникновении исключений заданных типов в этом блоке.
Приводимый ниже код представляет собой пример процедуры на Microsoft С, в которую входит обработчик исключений. Функция является модифицированным вариантом стандартной библиотечной функции strlen(), возвращающей длину строки, которая заканчивается нулевым символом.
Обычная функция strlen() быстро просматривает память по одному символу, до тех пор пока не найдет символ NULL. Но если строка не заканчивается нулем или указатель на строку неверен, то strlen() может внезапно завершиться с исключением "нарушение защиты памяти".
Приведенная здесь модифицированная версия перехватывает исключение и возвращает осмысленное значение (не обязательно верное, просто осмысленное) вместо аварийного завершения программы. Новое ключевое слово try служит отметкой начала блока кода, который может вызвать нарушение защиты. Если исключение возникает внутри этого блока, то управление передается на ключевое слово except, за которым в скобках следует фильтр исключений. Фильтр исключений дает возможность задать обработку только для некоторых типов исключений. Если значение фильтра равно EXCEPTION_EXECUTE_HANDLER, то исполняется обработчик исключения, в данном случае оператор return (count). Фильтры исключений — это достаточно мощное средство, так как они могут обращаться к локальным данным и иметь любую сложность. Применение фильтров позволяет исполнять обработчик только при точном соблюдении заданных условий. Передача управления обработчику исключений называется возбуждением исключения (raising an exception). Обратите внимание, что код обработки ошибок удален с основного пути выполнения программы.
Каждый блок кода может иметь собственный обработчик исключений, и обработчики могут быть вложены друг в друга. При возникновении исключения фильтр исключений может проверить его тип и по результатам проверки указать ОС: выполнить обработчик исключений, продолжить выполнение программы, завершить работу программы или продолжить поиск обработчика в охватывающем блоке кода.
Исключения ОС — не единственный тип исключений, которые может обрабатывать приложение. Приложения сами могут генерировать исключения при помощи функции Win32 API RaiseException(), вызывая тем самым передачу-управления соответствующему обработчику исключений. Для поддержки этой операции ОС регистрирует обработчики исключений и просматривает их в надлежащем порядке в случае возбуждения исключения. Если ни один из обработчиков не взялся за обработку проблемы, то ОС завершает программу, вызвавшую ошибку. Средство обработки исключений Windows NT не зависит от используемого языка программирования; один и тот же механизм используется для всех языков. Каждый язык определяет, каким образом в нем раскрывается этот механизм.
Другой
тип обработчика исключений, известный
как обработчик завершения
(termination handler),
позволяет приложению гарантировать
выполнение некоторого блока кода, даже
если защищенный блок завершается
ненормально. Обработчики завершения
часто содержат код, освобождающий
ресурсы, чтобы в случае ненормального
завершения процедуры выделенные ею
ресурсы были возвращены системе.
Следующий фрагмент кода иллюстрирует
назначение обработчика завершения:
Критическая секция — это синхронизационный объект Win32, который гарантирует, что данный блок кода будет исполняться одновременно не более чем одним потоком. В нашем примере поток получает доступ к критической секции, выделяет буфер, после чего модифицирует его содержимое. Если случится что-то не то (например, произойдет необработанное исключение) и процедура завершится в тот момент, когда поток находится в критической секции, то остальные потоки, ожидающие доступ к этому ресурсу, будут заблокированы навсегда. Более того, буфер, выделенный потоком, будет потерян, так как ОС не сможет его освободить сама. (Разработчики часто называют такого рода ошибки утечками памяти. Если их происходит слишком много, то память постепенно "утекает".) Обработчик завершения гарантирует, что поток освободит объект-критическую секцию и буфер. Обработчики завершения исполняются всегда, когда поток управления выходит из тела блока try...finally, независимо от способа, которым происходит этот выход.
Обработчики исключений и завершений могут использоваться для достижения устойчивой работы приложения как по отдельности, так и в комбинации. Windows NT использует оба типа обработчиков для обеспечения надежной работы на всех уровнях системы.
Объектная модель Windows NT:
Объекты. Использование объектов.
Файловая и объектная модель.
Структура и типы объектов.
Управление объектами: имена, каталоги.
Управление объектами: домены, символические связи.
Контроль доступа
к объектам WinNT:
Описатели и удержание объектов. Учет использования ресурсов..
Хотя имена объектов важны для хранения и совместного использования объектов, они используются не часто. Процесс указывает имя объекта, когда он создает объект или открывает его описатель. После этого процесс использует описатель объекта. Ссылка на объект при помощи его описателя выполняется быстрее, чем по имени, так как диспетчер объекта может опустить поиск имени и найти объект непосредственно.
Описатель объекта NT — это индекс в специфичной для процесса таблице объектов (object table). Таблица объектов процесса содержит указатели на все объекты, описатели которых открыты процессом. Процесс может получить описатель объекта, создав объект, или открыв описатель существующего объекта, или унаследовав описатель от другого процесса, или получив дубликат описателя из другого процесса. На рис. 3-7 показана связь между процессом и его таблицей объектов.
Каждый вход таблицы объектов содержит предоставленные права доступа для соответствующего описателя и его режим наследования (inheritance designation) — иными словами, получат ли процессы, созданные данным процессом, копию этого описателя в своих таблицах объектов. Хотя термин описатель (handle), строго говоря, относится только к индексу в таблице, разработчики используют этот термин и для обозначения данных, хранящихся в соответствующем входе таблицы.
Рис. 3-7. Структура таблицы объектов.
Два процесса совместно используют объект, если оба они открыли его описатели. Каждый из этих описателей уникален, как показано на рис. 3-8.
Создатель объекта определяет, могут ли описатели объекта наследоваться из процесса теми процессами, которые он создал. Это средство позволяет поддерживать среды, включая Win32 и POSIX, разрешающие наследование ресурсов.
При завершении процесса соответствующий объект-процесс становится кандидатом на удаление из системы (в зависимости от того, используется ли он все еще другим процессом, как будет описано далее). Прежде чем удалить
Рис. 3-8. Совместное использование объекта.
объект-процесс, диспетчер объектов вызывает метод "удалить" для объектов-процессов, который закрывает все описатели в таблице объектов процесса.
