- •Оглавление
- •Классификация операционных систем
- •2. Структура, состав и назначение подсистем типовой системы программирования (Visual Studio или Delphi).
- •4. Взаимодействие программ — интеграция приложени: технология com — основные принципы, типы и правила построения программных интерфейсов, достоинства и недостатки.
- •5. Объект, сервер, клиент. Схема взаимодействия клиента и объекта com. Объект
- •Интерфейс
- •Интерфейс iUnknown
- •Библиотека сом
- •Создание объекта
- •6. Технологи обмена сообщениями: проблемы интеграции приложений, основные принципы, шаблоны, достоинства и недостатки.
- •7. Принципы построения корпоративных информационных систем (кис), их типы и проблемы. Основные проблемы реализации архивных хранилищ. К основным принципам построения кис относятся:
- •Корпоративные информационные системы можно также разделить на два класса: финансово-управленческие и производственные.
- •Также различают виды кис, такие как заказные (уникальные) и тиражируемые кис.
- •Основные проблемы реализации архивных хранилищ
- •8. Синхронизация: семафоры, мьютексы, барьеры, взаимоблокировки — реентерабельность.
- •Семафоры
- •Мьютексы
- •Барьеры
- •Взаимоблокировки
- •Реентерабельность
- •Синхронизация при низком irql
- •Механизмы синхронизации режима ядра
- •Объекты диспетчера ядра
- •Условия освобождения различных синхронизирующих объектов
- •10. Основные системные механизмы Windows и их назначение.
- •Диспетчеризация ловушек
- •Диспетчер объектов
- •Синхронизация
- •Системные рабочие потоки
- •Глобальные флаги Windows
- •Трассировка событий ядра
- •Объекты исполнительной системы
- •Структура объектов
- •Методы объекта
- •Описатели объектов и таблица описателей, принадлежащая процессу
- •Внутренние объекты, объекты исполнительной системы (executive objects)
- •Хранение объектов в памяти
- •Имена объектов
- •Стандартные каталоги объектов
- •Пространство имен сеанса
- •Диспетчеризация 32-разрядных системных сервисов
- •Диспетчеризация 64-разрядных системных сервисов
- •Диспетчеризация системных сервисов режима ядра
- •Прерывания dpc или диспетчеризации
- •Прерывания apc
- •Необработанные исключения
- •Трассировка событий ядра
- •17. Реестр Windows: назначение, организация, ключи, ульи, редактирование, достоинства и недостатки. Реестр
- •Логическая структура реестра
- •Структура реестра
- •Хранение реестра
- •18. Статическое и динамическое связывание, dll-библиотеки — назначение, структура. Статические и динамические библиотеки.
- •Основные этапы компьютерного моделирования
- •Виды алгоритмов
- •Основные этапы полного построения алгоритма.
- •Правильность алгоритма.
- •Реализация алгоритма.
- •Принципы эффективных алгоритмов.
- •Правила оформления текстов программ.
- •Архитектура программного обеспечения в качестве классического жизненного цикла системы — недостатки классического цикла.
- •Основные параметры при разработке архитектуры.
- •Примеры технологии проектирования пс (стратегии проектирования: водопадная, инкрементная, эволюционная, спиральная стратегии)
- •Понятие надежности по
- •Отказы, сбои, восстановление
- •Основные задачи технической диагностики
- •Показатели качества и надежности программных средств (iso 9126:1991)
- •Тестирование корректности определения и использования данных на маршрутах исполнения программы.
- •Основные типы
- •Средства разработки
- •Загрузка/выгрузка
- •Организация и точки входа
- •Диспетчер PnP
- •Структуры драйверов в ос
- •23. Администрирование программного обеспечения пк: принципы, задачи, документирование, регламентные работы — профилактика. Администрирование программного обеспечения пк
- •Принципы
- •Документирование
- •Регламентные работы — профилактика.
- •Средства разработки .Net-приложений
- •Корпоративные .Net-серверы и их краткие характеристики
- •Сервер Application Center
- •Реализация Web-ферм, кластеров
- •Exchange Server и его основные функции
Прерывания apc
APC (asynchronous procedure call) позволяет выполнять пользовательские программы и системный код в контексте конкретного пользовательского потока (а значит, и в адресном пространстве конкретного процесса). Поскольку для выполнения в контексте конкретного потока APC ставятся в очередь и выполняются при IRQL ниже «DPC/dispatch», на их работу не налагаются ограничения, свойственные DPC АРС - процедура может обращаться к ресурсам (объектам), ждать освобождения описателей объектов, генерировать ошибки страниц и вызывать системные сервисы.
APC описывается управляющим объектом ядра — ЛРС — объектом. APC, ждущие выполнения, находятся в очереди ЛРС (APC queue), управляемой ядром. Очереди APC — в отличие от общесистемной очереди DPC — специфичны для конкретного потока, так как у каждого потока своя очередь APC При запросе на постановку APC в очередь ядро помещает его (APC) в очередь того потока, который будет выполнять АРС - процедуру. Далее ядро генерирует программное прерывание с уровнем APC, и поток, когда он в конечном счете начинает выполняться, обрабатывает APC
APC бывают двух видов: режима ядра и пользовательского режима. APC режима ядра для выполнения в контексте целевого потока не нужно «разрешение» со стороны этого потока, тогда как для APC пользовательского режима это обязательно. APC режима ядра прерывает поток и выполняет процедуру без вмешательства или согласия потока. APC режима ядра тоже бывают двух типов: обычные (normal) и специальные (special). Поток может отключить все APC режима ядра, повысив IRQL до уровня APC_LEVEL или вызвав KeEnterGuardedRegion, которая впервые появилась в Windows Server 2003.KeEnterGuardedRegion отключает доставку APC, устанавливая поле SpecialApcDisable в структуре KTHREAD вызвавшего потока (об этой структуре см. главу 6). Поток также может отключить только обычные APC режима ядра вызовом KeEnterCriticalRegion, которая устанавливает поле KernelApcDisable в структуре KTHREAD потока.
Исполнительная система использует APC режима ядра для тех задач операционной системы, которые нужно выполнить в адресном пространстве (контексте) конкретного потока. Так, через специальные APC режима ядра она может указать потоку прекратить выполнение системного сервиса, допускающего прерывание, или записать результаты операции асинхронного ввода-вывода в адресное пространство этого потока. Подсистемы окружения используют такие APC, чтобы приостановить поток или завершить себя, а также чтобы получить или установить контекст пользовательского потока. Подсистема POSIX эмулирует через APC режима ядра передачу POSIX - сигналов процессам POSIX.
Драйверы устройств также применяют APC режима ядра. Например, если инициирована операция ввода-вывода и поток переходит в состояние ожидания, к процессору может быть подключен другой поток из другого процесса. По завершении передачи данных устройством система ввода-вывода должна как-то вернуться в контекст потока, инициировавшего эту операцию ввода-вывода, чтобы он мог скопировать ее результаты в буфер в адресном пространстве своего процесса. Система ввода-вывода использует для выполнения подобных действий специальные APC режима ядра (применение APC в системе ввода-вывода подробно рассматривается в главе 9).
Некоторые Windows - функции вроде ReadFileEx, WriteFileEx и QueueUser-APC вызывают APC пользовательского режима. Так, функции ReadFileEx и WriteFileEx позволяют вызывающей программе указать процедуру завершения ввода-вывода (completion procedure), которая будет вызвана по окончании операции ввода-вывода. Процедура завершения ввода-вывода реализуется помещением APC в очередь потока, выдавшего запрос на ввод-вывод. Однако обратный вызов процедуры завершения не обязательно происходит в момент постановки APC в очередь, поскольку APC пользовательского режима передаются потоку, только если он находится в состоянии тревожного ожидания (alertable wait state). Поток может перейти в такое состояние, вызвав одну из Windows - функций: либоWaitForMultipleObjectsEx, либо Sleep-Ex. B обоих случаях, как только в очереди появится APC пользовательского режима, ядро прервет поток, передаст управление АРС - процедуре и возобновит его выполнение лишь после завершения АРС - процедуры. B отличие от APC режима ядра, которые выполняются на уровне «APC», APC пользовательского режима выполняются на уровне «passive».
Появление APC может переупорядочить очереди ожидания — списки, определяющие, какие потоки ждут, в каком порядке и на каких объектах (см. раздел по синхронизации далее в этой главе). Если в момент появления APC поток находится в состоянии ожидания, то после обработки АРС - процедуры поток возвращается в состояние ожидания, но перемещается в конец списка потоков, ждущих те же объекты.
14. Система прерываний в ПК. Последовательность действий процессора при реализации прерывания. Классификация видов прерываний. Организация приемов запросов на прерывания.
Организация обработки прерываний в ЭВМ
Прерывание - это прекращение выполнения текущей команды или текущей последовательности команд для обработки некоторого события специальной программой — обработчиком прерывания, с последующим возвратом к выполнению прерванной программы. Событие может быть вызвано особой ситуацией, сложившейся при выполнении программы, или сигналом от внешнего устройства. Прерывание используется для быстрой реакции процессора на особые ситуации, возникающие при выполнении программы и взаимодействии с внешними устройствами.
Механизм прерывания обеспечивается соответствующими аппаратно-программными средствами компьютера.
Любая особая ситуация, вызывающая прерывание, сопровождается сигналом, называемым запросом прерывания (ЗП). Запросы прерываний от внешних устройств поступают в процессор по специальным линиям, а запросы, возникающие в процессе выполнения программы, поступают непосредственно изнутри микропроцессора. Механизмы обработки прерываний обоих типов схожи. Рассмотрим функционирование компьютера при появлении сигнала запроса прерывания, опираясь в основном на обработку аппаратных прерываний.
Рис. 14.1. Выполнение прерывания в компьютере: tр - время реакции процессора на запрос прерывания; tс - время сохранения состояния прерываемой программы и вызова обработчика прерывания; tв - время восстановления прерванной программы
После появления сигнала запроса прерывания ЭВМ переходит к выполнению программы — обработчика прерывания. Обработчик выполняет те действия, которые необходимы в связи с возникшей особой ситуацией. Например, такой ситуацией может быть нажатие клавиши на клавиатуре компьютера. Тогда обработчик должен передать код нажатой клавиши из контроллера клавиатуры в процессор и, возможно, проанализировать этот код. По окончании работы обработчика управление передается прерванной программе.
Прерывания делятся на аппаратные и программные
Аппаратные прерывания используются для организации взаимодействия с внешними устройствами. Запросы аппаратных прерываний поступают на специальные входы микропроцессора. Они бывают:
маскируемые, которые могут быть замаскированы программными средствами компьютера;
немаскируемые, запрос от которых таким образом замаскирован быть не может.
Программные прерывания вызываются следующими ситуациями:
особый случай, возникший при выполнении команды и препятствующий нормальному продолжению программы (переполнение, нарушение защиты памяти, отсутствие нужной страницы в оперативной памяти и т.п.);
наличие в программе специальной команды прерывания INT n, используемой обычно программистом при обращениях к специальным функциям операционной системы для ввода-вывода информации.
Каждому запросу прерывания в компьютере присваивается свой номер (тип прерывания), используемый для определения адреса обработчика прерывания.
При поступлении запроса прерывания компьютер выполняет следующую последовательность действий:
определение наиболее приоритетного незамаскированного запроса на прерывание (если одновременно поступило несколько запросов);
определение типа выбранного запроса;
сохранение текущего состояния счетчика команд и регистра флагов;
определение адреса обработчика прерывания по типу прерывания и передача управления первой команде этого обработчика;
выполнение программы — обработчика прерывания;
восстановление сохраненных значений счетчика команд и регистра флагов прерванной программы;
продолжение выполнения прерванной программы.
Этапы 1-4 выполняются аппаратными средствами ЭВМ автоматически при появлении запроса прерывания. Этап 6 также выполняется аппаратно по команде возврата из обработчика прерывания.
Задача программиста - составить программу — обработчик прерывания, которая выполняла бы действия, связанные с появлением запроса данного типа, и поместить адрес начала этой программы в специальной таблице адресов прерываний. Программа-обработчик, как правило, должна начинаться с сохранения состояния тех регистров процессора, которые будут ею изменяться, и заканчиваться восстановлением состояния этих регистров. Программа-обработчик должна завершаться специальной командой, указывающей процессору на необходимость возврата в прерванную программу.
15. Диспетчеризация исключений. Определение, назначение, механизмы. Диспетчер исключений. Обработчики исключений (в т.ч. на основе SEH-фрейма). Порт отладчика (debugger port) и порт исключений (exception port). Необработанные исключения.
Диспетчеризация исключений
B отличие от прерываний, которые могут возникать в любой момент, исключения являются прямым следствием действий выполняемой программы. Windows вводит понятие структурной обработки исключений (structured exception handling, SEH), позволяющей приложениям получать управление при возникновении исключений. При этом приложение может исправить ситуацию, которая привела к исключению, провести раскрутку стека (завершив таким образом выполнение подпрограммы, вызвавшей исключение) или уведомить систему о том, что данное исключение ему не известно, и тогда система продолжит поиск подходящего обработчика для данного исключения. B этом разделе мы исходим из того, что вы знакомы с базовыми концепциями структурной обработки исключений Windows; в ином случае сначала прочитайте соответствующую часть справочной документации Windows API из Platform SDK или главы 23–25 из четвертого издания книги Джеффри Рихтера «Windows для профессионалов». Учтите: хотя обработка исключений возможна через расширения языка программирования (например, с помощью конструкции _try в Microsoft Visual C++), она является системным механизмом и поэтому не зависит от конкретного языка.
B системах типа x86 все исключения имеют предопределенные номера прерываний, прямо соответствующие записям в IDT, ссылающимся на обработчики ловушек конкретных исключений. B таблице 3–2 перечислены исключения, определенные для систем типа x86, с указанием номеров прерываний. Как уже говорилось, первая часть IDT используется для исключений, а аппаратные прерывания располагаются за ней.
Все исключения, кроме достаточно простых, которые могут быть разрешены обработчиком ловушек, обслуживаются модулем ядра — диспетчером исключений (exception dispatcher). Его задача заключается в поиске обработчика, способного «справиться» с данным исключением. Примерами независимых от архитектуры исключений могут служить нарушения доступа к памяти, целочисленное деление на нуль, переполнение целых чисел, исключения при операциях с плавающей точкой и точки прерывания отладчика. Полный список независимых от архитектуры исключений см. в справочной документации Windows API.
Ядро перехватывает и обрабатывает некоторые из этих исключений прозрачно для пользовательских программ. Так, если при выполнении отлаживаемой программы встретилась точка прерывания, генерируется исключение, обрабатываемое ядром за счет вызова отладчика. Ряд исключений ядро обрабатывает, просто возвращая код неудачной операции.
Определенные исключения могут передаваться в неизменном виде пользовательским процессам. Например, при ошибке доступа к памяти или при переполнении в ходе арифметической операции генерируется исключение, не обрабатываемое операционной системой. Для обработки этих исключений подсистема окружения может устанавливать обработчики исключений на основе SEH - фрейма (далее для краткости — обработчик SEH - фрейма). Этим термином обозначается обработчик исключения, сопоставленный с вызовом конкретной процедуры. При активизации такой процедуры в стек заталкивается стековый фрейм, представляющий вызов этой процедуры. Со стековым фреймом можно сопоставить один или несколько обработчиков исключений, каждый из которых защищает определенный блок кода исходной программы. При возникновении исключения ядро ищет обработчик, сопоставленный с текущим стековым фреймом. Если его нет, ядро ищет обработчик, сопоставленный с предыдущим стековым фреймом, — и так до тех пор, пока не будет найден подходящий обработчик. Если найти обработчик исключения не удалось, ядро вызывает собственные обработчики по умолчанию.
Когда происходит исключение (аппаратное или программное), цепочка событий начинается в ядре. Процессор передает управление обработчику ловушки в ядре, который создает фрейм ловушки по аналогии с тем, как это происходит при прерывании. Фрейм ловушки позволяет системе после обработки исключения возобновить работу с той точки, где она была прервана. Обработчик ловушки также создает запись исключения, содержащую сведения о ее причине и другую сопутствующую информацию.
Если исключение возникает в режиме ядра, то для его обработки диспетчер исключений просто вызывает процедуру поиска подходящего обработчика SEH-фрейма. Поскольку необработанные исключения режима ядра были бы фатальными ошибками операционной системы, диспетчер всегда находит какой-нибудь обработчик.
Если исключение возникает в пользовательском режиме, диспетчер исключений предпринимает более сложные действия.
Подсистема Windows предусматривает порт отладчика (debugger port) и порт исключений (exception port) для приема уведомлений об исключениях пользовательского режима в Windows - процессах. Они применяются ядром при обработке исключений по умолчанию, как показано на рис.3–8.
Точки прерывания в отлаживаемой программе являются распространенной причиной исключений. Поэтому диспетчер исключений первым делом проверяет, подключен ли к процессу, вызвавшему исключение, отладчик. Если подключен и системой является Windows 2000, диспетчер исключений посылает отладчику через LPC первое предупреждение. (Это уведомление на самом деле сначала поступает диспетчеру сеансов, а тот пересылает его соответствующему отладчику.) B Windows XP и Windows Server 2003 диспетчер исключений посылает сообщение объекта отладчика (debugger object message) объекту отладки (debug object), сопоставленному с процессом (который внутри системы рассматривается как порт).
Если к процессу не подключен отладчик или если отладчик не в состоянии обработать данное исключение, диспетчер исключений переключается в пользовательский режим, копирует фрейм ловушки в пользовательский стек, имеющий формат структуры данных CONTEXT (документирована в Platform SDK), и вызывает процедуру поиска обработчика SEH - фрейма. Если поиск не дал результатов, диспетчер возвращается в режим ядра и снова вызывает отладчик, чтобы пользователь мог продолжить отладку. При этом посылается второе (и последнее) предупреждение.
Если отладчик не запущен и обработчики SEH - фреймов не найдены, ядро посылает сообщение в порт исключений, сопоставленный с процессом потока. Этот порт (если таковой есть) регистрируется подсистемой окружения, контролирующей данный поток. Порт исключений дает возможность подсистеме окружения (прослушивающей этот порт) транслировать исходное исключение в уведомление или исключение, специфичное для ее окружения. CSRSS (Client/Server Run-Time Subsystem) просто выводит окно сообщения, уведомляющее пользователя о сбое, и завершает процесс. Когда подсистема POSIX получает от ядра сообщение о том, что один из потоков вызвал исключение, эта подсистема посылает вызвавшему исключение потоку сигнал в стиле POSIX. Ho, если ядро уже дошло до этого этапа в обработке исключения, а подсистема не способна обработать данное исключение, выполняется обработчик ядра по умолчанию, просто завершающий процесс, поток которого вызвал исключение.
