Файл: А. В. Гордеев А. Ю. Молчанов системное программное обеспечение электронный вариант книги издательства Питер СанктПетербург Челябинск юургу каф. Автоматика и управление 2002 2 Предисловие Настоящий учебник.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 1061
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
38
Наконец, существуют собственно программные прерывания. Эти прерывания происходят по соответствующей команде прерывания, то есть по этой команде процессор осуществляет практически те же действия, что и при обычных внутрен- них прерываниях. Данный механизм был специально введен для того, чтобы пере- ключение на системные программные модули происходило не просто как переход в подпрограмму, а точно таким же образом, как и обычное прерывание. Этим обес- печивается автоматическое переключение процессора в привилегированный режим с возможностью исполнения любых команд.
Сигналы, вызывающие прерывания, формируются вне процессора или в самом процессоре; они могут возникать одновременно. Выбор одного из них для обра- ботки осуществляется на основе приоритетов, приписанных каждому типу пре- рывания. Очевидно, что прерывания от схем контроля процессора должны обла- дать наивысшим приоритетом (если аппаратура работает неправильно, то не имеет смысла продолжать обработку информации). На рис.1.5 изображен обычный поря- док (приоритеты) обработки прерываний в зависимости от типа прерываний. Учет приоритета может быть встроен в технические средства, а также определяться опе- рационной системой, то есть кроме аппаратно реализованных приоритетов преры- вания большинство вычислительных машин и комплексов допускают программно- аппаратное управление порядком обработки сигналов прерывания. Второй способ,
дополняя первый, позволяет применять различные дисциплины обслуживания пре-
рываний.
Наличие сигнала прерывания не обязательно должно вызывать прерывание исполняющейся программы. Процессор может обладать средствами защиты от прерываний: отключение системы прерываний, маскирование (запрет) отдельных сигналов прерывания. Программное управление этими средствами (существуют специальные команда для управления работой системы прерываний) позволяет операционной системе регулировать обработку сигналов прерывания, заставляя процессор обрабатывать их сразу по приходу, откладывать их обработку на неко- торое время или полностью игнорировать. Обычно операция прерывания выполня- ется только после завершения выполнения текущей команды. Поскольку сигналы
39
прерывания возникают в произвольные моменты времени, то на момент прерыва- ния может существовать несколько сигналов прерывания, которые могут быть об- работаны только последовательно. Чтобы обработать сигналы прерывания в ра- зумном порядке им (как уже отмечалось) присваиваются приоритеты. Сигнал с бо- лее высоким приоритетом обрабатывается в первую очередь, обработка остальных сигналов прерывания откладывается.
Рис. 1.5. Распределение прерываний по уровням приоритета
Программное управление специальными регистрами маски (маскирование сигналов прерывания) позволяет реализовать различные дисциплины обслужива- ния:
♦ с относительными приоритетами, то есть обслуживание не прерывается даже при наличии запросов с более высокими приоритетами. После окончания об- служивания данного запроса обслуживается запрос с наивысшим приоритетом. Для организации такой дисциплины необходимо в программе обслуживания данного запроса наложить маски на все остальные сигналы прерывания или просто отклю- чить систему прерываний;
♦ с абсолютными приоритетами, то есть всегда обслуживается прерывание с наивысшим приоритетом. Для реализации этого режима необходимо на время об- работки прерывания замаскировать все запросы с более низким приоритетом. При этом возможно многоуровневое прерывание, то есть прерывание программ обра- ботки прерываний. Число уровней прерывания в этом режиме изменяется и зависит от приоритета запроса;
Средства контроля процессора
Системный таймер
Магнитные диски
Сетевое оборудование
Терминалы
Программные прерывания
Внешние устройства
Высокий приоритет
Низкий приоритет
40
♦ по принципу стека, или, как иногда говорят, по дисциплине LCFS (last come first served – последним пришёл – первым обслужен), то есть запросы с более низ- ким приоритетом могут прерывать обработку прерывания с более высоким при- оритетом. Дли этого необходимо не накладывать маски ни на один сигнал преры- вания и не выключать систему прерываний.
Следует особо отметить, что для правильной реализации последних двух дис- циплин нужно обеспечить полное маскирование системы прерываний при выпол- нении шагов 1-4 и 6-7. Это необходимо для того, чтобы не потерять запрос и пра- вильно его обслужить. Многоуровневое прерывание должно происходить на этапе собственно обработки прерывания, а не на этапе перехода с одного процесса на другой.
Управление ходом выполнения задач со стороны ОС заключается в организа- ции реакций на прерывания, в организации обмена информацией (данными и про- граммами), предоставлении необходимых ресурсов, в динамике выполнения задачи и в организации сервиса. Причины прерываний определяет ОС (модуль, который называют супервизором прерываний), она же и выполняет действия, необходимые при данном прерывании и в данной ситуации. Поэтому в состав любой ОС реаль- ного времени прежде всего входят программы управления системой прерываний,
контроля состояний задач и событий, синхронизации задач, средства распределе- ния памяти и управления ею, а уже потом средства организации данных (с помо- щью файловых систем и т. д.). Следует, однако, заметить, что современная ОС ре- ального времени должна вносить в аппаратно-программный комплекс нечто боль- шее, нежели просто обеспечение быстрой реакции на прерывания.
Как мы уже знаем, при появлении запроса на прерывание система прерываний идентифицирует сигнал и, если прерывания разрешены, управление передаётся на соответствующую подпрограмму обработки. Из рис.1.4 видно, что в подпрограмме обработки прерывания имеются две служебные секции. Это – первая секция, в ко- торой осуществляется сохранение контекста прерванной задачи, который не смог быть сохранен на 2-м шаге, и последняя, заключительная секция, в которой, наобо- рот, осуществляется восстановление контекста. Для того чтобы система прерыва-
41
ний не среагировала повторно на сигнал запроса на прерывание, она обычно авто- матически «закрывает» (отключает) прерывания, поэтому необходимо потом в подпрограмме обработки прерываний вновь включать систему прерываний. Уста- новка рассмотренных режимов обработки прерываний (с относительными и абсо- лютными приоритетами, и по правилу LCFS) осуществляется в конце первой сек- ции подпрограммы обработки. Таким образом, на время выполнения центральной секции (в случае работы в режимах с абсолютными приоритетами и по дисциплине
LCFS) прерывания разрешены. На время работы заключительной секции подпро- граммы обработки система прерываний должна быть отключена и после восста- новления контекста вновь включена. Поскольку эти действия необходимо выпол- нять практически в каждой подпрограмме обработки прерываний, во многих опе- рационных системах первые секции подпрограмм обработки прерываний выделя- ются в специальный системный программный модуль, называемый супервизором
прерываний
Супервизор прерываний прежде всего сохраняет в дескрипторе текущей зада- чи рабочие регистры процессора, определяющие контекст прерываемого вычисли- тельного процесса. Далее он определяет ту подпрограмму, которая должна выпол- нить действия, связанные с обслуживанием настоящего (текущего) запроса на пре- рывание. Наконец, перед тем как передать управление этой подпрограмме, супер- визор прерываний устанавливает необходимый режим обработки прерывания. По- сле выполнения подпрограммы обработки прерывания управление вновь передаёт- ся супервизору, на этот раз уже на тот модуль, который занимается дис- петчеризацией задач (см. раздел «Качество диспетчеризации и гарантии обслу- живания», глава 2). И уже диспетчер задач, в свою очередь, в соответствии с при- нятым режимом распределения процессорного времени (между выполняющимися процессами) восстановит контекст той задачи, которой будет решено выделить процессор. Рассмотренная нами схема проиллюстрирована на рис. 1.6.
42
Рис. 1.6. Обработка прерывания при участии супервизоров ОС
Как мы видим из рис. 1.6, здесь нет непосредственного возврата в прерванную ранее программу непосредственно из самой подпрограммы обработки прерывания.
Для прямого непосредственного возврата достаточно адрес возврата сохранить в стеке, что и делает аппаратура процессора. При этом стек легко обеспечивает воз- можность возврата в случае вложенных прерываний, поскольку он всегда реализу- ет дисциплину LCFS (last come – first served).
Однако если бы контекст процессов сохранялся просто в стеке, как это обычно реализуется аппаратурой, а не в описанных выше дескрипторах задач, то у нас не было бы возможности гибко подходить к выбору той задачи, которой нужно пе- редать процессор после завершения работы подпрограммы обработки прерывания.
Естественно, что это только общий принцип. В конкретных процессорах и в кон- кретных ОС могут существовать некоторые отступления от рассмотренной схемы и/или дополнения к ней. Например, в современных процессорах часто имеются специальные аппаратные возможности для сохранения контекста прерываемого
Прерывание
Исполняемая программа
Отключение прерываний,
сохранение контекста прерванной программы,
установка режима работы системы прерываний
(маскирование)
Супервизор прерываний
Определение адреса программного модуля,
обслуживающего запрос на прерывание,
и передача управления на него
Выполнение кода подпрограммы обработки прерывания
Эта подпрограмма уже не заботится о сохранении контекста прерванного процесса
Выбор готовой к выполнению задачи
(на основе принятой дисциплины обслуживания)
Восстановление контекста задачи,
установка прежнего режима работы системы прерываний и передача управления этой задаче
Диспетчер задач
43
процесса непосредственно в его дескрипторе, то есть дескриптор процесса (по крайней мере, его часть) становится структурой данных, которую поддерживает аппаратура.
Для полного понимания принципов создания и механизмов реализации рас- сматриваемых далее современных ОС необходимо знать архитектуру персональ- ных компьютеров и, в частности, особенности системы прерывания. Этот вопрос более подробно рассмотрен в главе 4 «Управление вводом/выводом и файловые системы», посвящённом архитектуре микропроцессоров i80x86.
Основные виды ресурсов
Рассмотрим кратко основные виды ресурсов вычислительной системы и спо- собы их разделения (см. рис. 1.1). Прежде всего, одним из важнейших ресурсов яв- ляется сам процессор
1
, точнее – процессорное время. Процессорное время делится попеременно (параллельно). Имеется множество методов разделения этого ресурса
(см. раздел «Планирование и диспетчеризация процессов и задач», глава 2).
Вторым видом ресурсов вычислительной системы можно считать память. Опе- ративная память может быть разделена и одновременным способом (то есть в па- мяти одновременно может располагаться несколько процессов или, по крайней ме- ре, текущие фрагменты, участвующие в вычислениях), и попеременно (в разные моменты оперативная память может предоставляться для разных вычислительных процессов). Память – очень интересный вид ресурса. Дело в том, что в каждый конкретный момент времени процессор при выполнении вычислений обращается к очень ограниченному числу ячеек оперативной памяти. С этой точки зрения жела- тельно память разделять для возможно большего числа параллельно исполняемых процессов. С другой стороны, как правило, чем больше оперативной памяти может быть выделено для конкретного текущего процесса, тем лучше будут условия для его выполнения. Поэтому проблема эффективного разделения оперативной памяти между параллельно выполняемыми вычислительными процессами является одной
1
Разговор о процессоре как об одном из ресурсов более характерен для мультипроцессорных систем. В случае одно- процессорных систем чаще говорят о процессорном времени.
44
из самых актуальных. Достаточно подробно вопросы распределения памяти между параллельно выполняющимися процессами рассмотрены в главе 2 «Управление за- дачами и памятью в операционных системах».
Когда говорят о внешней памяти (например, память на магнитных дисках), то собственно память и доступ
2
к ней считаются разными видами ресурса. Каждый из этих ресурсов может предоставляться независимо от другого. Но для полной рабо- ты с внешней памятью необходимо иметь оба этих ресурса. Собственно внешняя память может разделяться одновременно, а доступ к ней – попеременно.
Если говорить о внешних устройствах, то они, как правило, могут разделяться параллельно, если используются механизмы прямого доступа. Если же устройство работает с последовательным доступом, то оно не может считаться разделяемым ресурсом. Простыми и наглядными примерами внешних устройств, которые не мо- гут быть разделяемыми, являются принтер и накопитель на магнитной ленте. Дей- ствительно, если допустить, что принтер можно разделять между двумя процесса- ми, которые смогут его использовать попеременно, то результаты печати, скорее всего, не смогут быть использованы – фрагменты выведенного текста могут пере- мешаться таким образом, что в них невозможно будет разобраться. Аналогично об- стоит дело и с накопителем на магнитной ленте. Если один процесс начнет что-то читать или писать, а второй при этом запросит перемотку ленты на её начало, то оба вычислительных процесса не смогут выполнить свои вычисления.
Очень важным видом ресурсов являются программные модули. Прежде всего,
мы будем рассматривать системные программные модули, поскольку именно они обычно и рассматриваются как программные ресурсы и в принципе могут быть распределены между выполняющимися процессами.
Как известно, программные модули могут быть однократно и многократно
(или повторно) используемыми. Однократно используемыми называют такие про- граммные модули, которые могут быть правильно выполнены только один раз. Это означает, что в процессе своего выполнения они могут испортить себя: либо по- вреждается часть кода, либо – исходные данные, от которых зависит ход вы-
2
Процесс обращения к данным
45
числений. Очевидно, что однократно используемые, программные модули явля- ются неделимым ресурсом. Более того, их обычно вообще не распределяют как ре- сурс системы. Системные однократно используемые программные модули, как правило, используются только на этапе загрузки ОС. При этом следует иметь в ви- ду тот очевидный факт, что собственно двоичные файлы, которые обычно хранятся на системном диске и в которых и записаны эти модули, не портятся, а потому мо- гут быть повторно использованы при следующем запуске ОС.
Повторно используемые программные модули, в свою очередь, могут быть не- привилегированными, привилегированными и реентерабельными.
Привилегированные программные модули работают в так называемом приви- легированном режиме, то есть при отключенной системе прерываний (часто гово- рят, что прерывания закрыты), так, что никакие внешние события не могут нару- шить естественный порядок вычислений. В результате программный модуль вы- полняется до своего конца, после чего он может быть вновь вызван на исполнение из другой задачи (другого вычислительного процесса). С позиций стороннего на- блюдателя по отношению к вычислительным процессам, которые попеременно
(причем, возможно, неоднократно) в течение срока своей «жизни» вызывают не- который привилегированный программный модуль, такой модуль будет выступать как попеременно разделяемый ресурс. Структура привилегированных программ- ных модулей изображена на рис. 1.7. Здесь в первой секции программного модуля выключается система прерываний. В последней секции, напротив, включается сис- тема прерываний.
Непривилегированные программные модули – это обычные программные мо- дули, которые могут быть прерваны во время своей работы. Следовательно, в об- щем случае их нельзя считать разделяемыми, потому что если после прерывания выполнения такого модуля, исполняемого в рамках одного вычислительного про- цесса, запустить его ещё раз по требованию другого вычислительного процесса, то промежуточные результаты для прерванных вычислений могут быть потеряны. В
противоположность этому, реентерабельные программные модули (reenterable
1
)
1
Reenterable – (дословно) допускающий повторные обращения (к модулю).
46
допускают повторное многократное прерывание своего исполнения и повторный их запуск по обращению из других задач (вычислительных процессов). Для этого реентерабельные программные модули должны быть созданы таким образом, что- бы было обеспечено сохранение промежуточных вычислений для прерываемых вычислений и возврат к ним, когда вычислительный процесс возобновляется с пре- рванной ранее точки. Это может быть реализовано двумя способами: с помощью статических и динамических методов выделения памяти под сохраняемые значе- ния. Основной, наиболее часто используемый динамический – способ выделения памяти для сохранения всех промежуточных результатов вычисления, относящих- ся к реентерабельному программному модулю, может быть проиллюстрирован с помощью рис. 1.8.
1 2 3 4 5 6 7 8 9 ... 37