- •Глава 6.Мультипрограммирование на основе прерываний .
- •Назначение и типы прерываний .
- •Механизм прерываний
- •Программные прерывания .
- •Диспетчеризация и приоритезация прерываний в ос .
- •Функции централизованного диспетчера прерываний на примере Windows nt. Прерывания на аппаратном уровне.
- •Процедуры обработки прерываний и текущий процесс .
- •Системные вызовы .
- •Принципы обработки прерываний в ос Unix .
Процедуры обработки прерываний и текущий процесс .
Важной особенностью процедур , выполняемых по запросам прерываний , является то , что они выполняют работу , чаще всего не связанную с текущем процессом . Например , драйвер диска может получить управление после того , как контроллер диска записал в соответствующие сектора информацию , полученную от процесса А , но этот момент времени , скорее всего , не совпадет с периодом очередной итерации выполнения процесса А или его потока .В наиболее типичном случае процесс А будет находиться в состоянии ожидания завершения операции ввода – вывода ( при синхронном режиме выполнения этой операции ) и драйвер диска прервет какой – либо процесс В. В Windows NT процедуры , вызываемые как DPC , также могут работать в контексте процесса , отличающегося от того , для которого они выполняют свои функции . Поэтому для такого рода процедур вводятся ограничения – они не имеют права использовать ресурсы ( память , открытые файлы и т.п. ) , с которыми работает текущий процесс , или же от имени этого процесса запрашивать выделение дополнительных ресурсов . Процедуры обработки прерываний работают с ресурсами , которые были выделены им при инициализации соответствующего драйвера или инициализации самой ОС . Эти ресурсы принадлежат операционной системе , а не конкретному процессу . В частности память выделяется драйверам из системной области , то есть той области , на которую отображаются сегменты из общей части виртуального адресного пространства всех процессов.
Рис. 6.2 . Жизненный цикл процесса
В Windows NT существуют процедуры обработки прерываний , которые выполняются всегда в контексте определенного процесса . Это процедуры , вызываемые с помощью программного прерывания АРС (Asynchronous Procedure Call ).
Для них в диспетчере прерываний предусмотрен свой уровень приоритета IRQL , выше уровня для обычного кода , но ниже уровня DPC . Основное назначение APC процедур – перемещение данных , полученных драйвером от какого – либо устройства ввода- вывода , из памяти системной области , куда они помещаются после считывания из регистров контроллера этого устройства , в индивидуальную часть адресного пространства процесса , запросившего операцию ввода – вывода .
Диспетчеризация прерываний является важной функцией ОС , и эта функция реализована практически во всех мультипрограммных ОС . В ОС реализуется двухуровневый механизм планирования работ . Верхний уровень планирования выполняется диспетчером прерываний , который распределяет процессорное время между потоком поступающих запросов на прерывание различных типов – внешних , внутренних и программных . Оставшееся процессорное время распределяется диспетчером потоков .
Системные вызовы .
Системный вызов позволяет приложению обратиться к операционной системе с просьбой выполнить то или иное действие , оформленное как процедура кодового сегмента ОС .
Реализация системных вызовов должна удовлетворить следующим требованиям :
Обеспечивать переключение в привилегированный режим ;
Обладать высокой скоростью вызова процедур ОС ;
Обеспечивать по возможности единообразное обращение к системным вызовам для всех аппаратных платформ , на которых работает ОС ;
Допускать легкое расширение набора системных вызовов ;
Обеспечивать контроль со стороны ОС за корректным использованием системных вызовов .
Первое требование для большинства аппаратных платформ может быть выполнено только с помощью механизма программных прерываний .
Для обеспечения высокой скорости было бы полезно использовать векторные свойства системы программных прерываний , имеющихся во многих процессорах , то есть закрепить за каждым системным вызовом определенное значение вектора . Приложение при таком способе вызова непосредственно указывает в аргументе запроса значение вектора , после чего управление немедленно передается требуемой процедуре ОС . Однако этот децентрализованный способ передачи управления привязан к особенностям аппаратной платформы , а также не позволяет операционной системе легко модифицировать набор системных вызовов и контролировать их использование .
В большинстве ОС системные вызовы обслуживаются по централизованной схеме , основанного на существовании диспетчера системных вызовов . При любом системном вызове приложение выполняет программное прерывание с определенным и единственным номером вектора . Например , ОС Linux использует для системных вызовов команду INT 80h , а ОС Windows NT - INT 2Eh . Перед выполнением программного прерывания приложение тем или иным способом передает операционной системе номер системного вызова , который является индексом в таблице адреса процедур ОС , реализующих системные вызовы .Способ передачи зависит от реализации , например номер можно поместить в определенный регистр общего назначения процессора или передать через стек . Также некоторым способом передаются аргументы системного вызова , они могут как помещаться в регистры общего назначения , так и передаваться через стек или массив , находящийся в оперативной памяти . Массив удобен при большом объеме данных , передаваемых в качестве аргументов , при этом в регистре общего назначения указывается адрес этого массива .
Диспетчер системных вызовов представляет собой простую программу , которая сохраняет содержимое в системном стеке , поскольку в результате программного прерывания процессор переходит в привилегированный режим .
