Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 38
Текст из файла (страница 38)
4.6.2. Доставка и обработка Процесс ведет проверку на наличие сигналов при помощи функции |за[9(), вызываемой после обработки системного вызова или прерывания, но перед возвращением из режима ядра. Вызов [аз[9() производится также и в случаях ' Здесь, видимо, ошибка, н имеется а аиду все-такн поле р т|9. — Прим. ред. Опять же, должно быть, не р сцгйд, а р т|9. — Прим. ред.
4.6.1. Генерация сигналов После вырабатывания сигнала ядро проверяет структуру ргос процесса, которому этот сигнал предназначен. Если сигнал необходимо проигнорировать, то ядро на этом завершит обработку, не предпринимая никаких действий. В иных случаях он будет добавлен в набор ожидающих сигналов, расположенный в поле р сига[9'. Так как р сцгз!дт является всего лишь битовой маской, где каждому сигналу отводится только один бит, ядро не может записать в нее несколько повторных экземпляров одного сигнала. Следовательно, процесс будет знать только об одном приходе ожидающего сигнала. Если процесс находится в прерываемом сне и сигнал не заблокирован, то ядро системы разбудит такой процесс для получения сигнала.
Более того, сигналы управления заданиями, такие как 5165ТОР или 5ТОСО|9Т, напрямую приостанавливают или продолжают функционирование процесса без проведения их доставки. 4.7, Исключительные состояния 163 перехода в режим прерываемого сна или выхода из него (то есть пробуждения). Функция 1зз19() считывает установленные биты в поле р сцгз1В'. Если какой-либо бит установлен, то эта функция проверяет р НоЫ на предмет существования блокировки этого сигнала. Если сигнал не блокируется, то 1зз1д() сохраняет номер сигнала в р з19' и возвращает значение 1йОЕ Когда сигнал является ожидающим, ядро вызывает для его обработки рз1п(). Функция рз1о() проверяет информацию области ц, относящуюся к этому сигналу. Если не задан ни один обработчик, произойдет действие по умолчанию, обычно это завершение процесса.
Если необходимо вызвать обработчик, то происходит изменение маски блокируемых сигналов р (тоЫ, в которую добавляется текущий сигнал, а также любой другой сигнал, ассоциируемый с ним в маске ц з19гпай. Текущий сигнал не добавляется в маску в том случае, если для его обработчика был установлен флаг 5А МООЕЕЕй. Точно так же, если был установлен флаг 5А кЕ5ЕТНАНО, действия, задаваемые в массиве ц з1опа([), сбрасываются на установленные по умолчанию. Последним этапом действий является вызов зепЫ9(), производимый функцией рз19(), который заставляет процесс вернуться в режим задачи и передать управление обработчику.
Вызов зевс(з19О гарантирует, что после завершения работы обработчика процесс восстановит свое выполнение с того места программы, на котором он был прерван сигналом. Если используется альтернативный стек, вызов зепбз1О() загрузит обработчик с указанным стеком. Реализация функции зепЫВ() является машинно-зависимой, так как ей необходимо знать о деталях работы со стеком и о манипуляциях с контекстом. 4.7. Исключительные состояния Исключительныез состояния (исключения) возникают, когда программа оказывается в необычной ситуации, и происходит это, как правило, вследствие ошибки. Например, попытка обращения по несуществующему адресу в памяти или деление на ноль повлекут за собой исключение. При возникновении исключения срабатывает ловушка в ядре, которая вырабатывает сигнал, уведомляющий процесс о возникшем исключении.
В системе ())ч)1Х для оповещения процесса об исключениях служат сигналы. Тип вырабатываемого сигнала зависит от природы исключения. Например, попытка обращения по несуществующему адресу может повлечь за собой генерацию сигнала 5165ЕОЧ. Если в приложении указан для него обработчик, то ядро системы запустит его, Если нет, то выполняется действие по умолчанию (обычно это завершение работы процесса).
Такой подход позволяет каждой ' Все.таки, наверное, в маске ожилаюгпих сигналов р в1о, — Прим. ред. ь Вот тут, вилимо, должно быть поле р согв19. — Прим, ред. Этот развел описывает только аппаратные исключения. Их не следует путать с программными исключениями, поддерживаемыми различными языками программировании, такими как С++. 164 Глава 4. Сигналы и управление сеансами программе устанавливать свои собственные обработчики исключений. Некоторые языки программирования (например, Ада) обладают встроенными механизмами обработки исключений. Обработчики могут быть реализованы в библиотеках языка.
Исключения часто используются отладчиками. При отладке (или трассировке) программы вырабатывают исключения в точках останова, а также по завершении выполнения системного вызова ехес. Отладчик должен перехватывать эти исключения для контроля над программой. Отладчику также может понадобиться перехватывать и другие выбранные им исключения и сигналы, вырабатываемые отлаживаемой программой. Системный вызов р1гасе системы ()Ы1Х разрешает такой перехват (более подробно о его работе можно прочесть в разделе 6.2А). Существует ряд недостатков в том способе, которым ()лПХ обрабатывает исключения. Во-первых, обработчик исключения запускается в том же контексте, в котором это исключение произошло. Это означает, что обработчик не имеет доступа к полному контексту регистров, существовавшему во время возникновения исключения. Когда происходит исключение, ядро системы передает лишь некоторый объем его контекста обработчику.
Этот объем зависит от конкретной реализации (ЛЧ1Х, а также от аппаратной платформы, на которой работает система, Вообще говоря, одна нить должна работать с двумя контекстами — с контекстом обработчика и тем контекстом, в котором произошло исключение.
Во-вторых, механизм сигиалов изначально разрабатывался для однонитевых процессов. Системы 1ЛЧ1Х, поддерживающие многонитевые процессы, столкнулись с определенными сложностями в адаптации подобной схемы сигналов, И последний недостаток, о котором необходимо упомянуть, это ограничение системного вызова ртгасе, который позволяет отладчику, основанному на нем, контролировать только своих непосредсгпвенных потомков. 4.8. Обработка исключительных состояний в Масп Ограничения механизмов обработки исключений в ()лПХ стали причиной разработки нового унифицированного средства, представленного в системе МасЬ [41. Целью разработчиков ОС стало создание такого механизма, который, с одной стороны, оставался бы совместимым с традиционной УЫ1Х на бинарном уровне, а с другой — поддерживал многонитевые приложения.
Это средство стало не только частью описываемой системы, но и частью ОС ОБР/1, основанной на МасЬ. Разработчики системы МасЬ отказались от идеи запуска обработчика в тои же контексте, в котором произошло исключение. В традиционной ()л11Х вариант одного контекста применялся только потому, что обработчику требовался доступ и функционирование в том же адресном пространстве, где про- 4.8. Обработка исключительных состояний в Масс 185 изошло исключение. Так как система МасЬ является многонитевой, обработчик может стартовать как отдельная нить той же задачи.
(Нити и задачи ОС МасЬ подробнее описаны в разделе 6.4. Вкратце задача объединяет набор ресурсов, в том числе и адресное пространство. Нить выполняется внутри задачи и представлена контекстом выполнения и контрольной точкой. Традиционный процесс 1)Ы1Х в МасЬ можно интерпретировать как задачу, содержащую единственную нить.) В системе МасЬ выделяются два понятия: нить-кжертва» (нитке в которой произошло исключение) и ее обработчик.
На рис. 4.2 показано взаимодействие между ними. Нить-жертва устанавливает исключение, уведомляя ядро о его возникновении. Затем она ожидает окончания функционирования обработчика этого исключения. Обработчик перехватывает возникшее исключение, получая уведомление от ядра. Это уведомление содержит информацию о нити-жертве и о типе исключения.
Затем происходит обработка исключения и его очистка, что дает возможность нити-жертве продолжить свое функционирование. Если обработка исключения не смогла завершиться успешно, то нить, в которой оно возникло, будет завершена. Описанные взаимодействия в чем-то похожи на поток управления исключениями 1)Ы1Х, отличаясь от него тем, что обработчик функционирует как отдельная нить. В результате операции устагговки, ожидания, перехвата и очистклг составляют вместе удаленный вызов процедуры, реализованный в системе МасЬ через средства взаимодействия процессов г'1РС, см. о них подробнее в разделе 6.4). Обработчик Жертва Рис. 4.2.