Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТОС_2013 / ТОС_9_м_пр_слайды.doc
Скачиваний:
10
Добавлен:
03.03.2016
Размер:
14.52 Mб
Скачать

Сигналы:

обслуживание сигналов операционной системой.

Простейшая форма межпро­цессного взаимодействия, позволяющая уведомлять процесс или группу про­цессов о наступлении некоторого события.

сигналы с точки зрения пользователя и программиста – в л.р.

Группы и сеансы

Такое представле­ние набора процессов используется в UNIX для управления доступом к терминалу и поддержки пользовательских сеансов работы в системе.

Основные понятия:

- Группа процессов. Каждый процесс принадлежит определенной груп­пе процессов. Каждая группа имеет уникальный идентификатор. Группа может иметь в своем составе лидера группы — процесс, чей идентификатор PID равен идентификатору группы. Обычно процесс наследует группу от родителя, но может покинуть ее и организовать собственную группу.

- Управляющий терминал. Процесс может быть связан с терминалом, который называется управляющим. Все процессы группы имеют один и тот же управляющий терминал.

- Специальный файл устройства /dev/tty. Этот файл связан с управ­ляющим терминалом процесса. Драйвер для этого псевдоустройства по существу перенаправляет запросы на фактический терминальный драйвер, который может быть различным для различных процессов. Например, два процесса, принадлежащие различным сеансам, от­крывая файл /dev/tty, получат доступ к различным терминалам.

Управление сигналами

Сигналы обеспечивают механизм вызова определенной процедуры при наступлении некоторого события.

Каждое событие имеет свой идентифи­катор и символьную константу.

Некоторые из этих событий имеют асин­хронный характер, например, когда пользователь нажимает клавишу <Del> или <Сtгl>+<С> для завершения выполнения процесса, другие являются уведомлением об ошибках и особых ситуациях, например, при попытке доступа к недопустимому адресу или вызовы недопустимой инструкции.

фазы механизма сигналов

  • ге­нерация (или отправление сигнала)

  • его доставка и обработка.

Сигнал от­правляется, когда происходит определенное событие, о наступлении кото­рого должен быть уведомлен процесс.

Сигнал считается доставленным, когда процесс, которому был отправлен сигнал, получает его и выполняет его обработку.

В промежутке между этими двумя моментами сигнал ожи­дает доставки.

Отправление сигнала

Ядро генерирует и отправляет процессу сигнал в ответ на ряд событий, которые могут быть вызваны самим процессом, другим процессом, преры­ванием или какими-либо внешними событиями.

основ­ные причины отправки сигнала:

Особые ситуации

Когда выполнение процесса вызывает особую ситуацию, например, деление на ноль, процесс получает соответствующий сигнал.

Терминальные прерывания

Нажатие некоторых клавиш терминала, напри­мер, <Dе1>, <Ctrl>+<С> или <Ctrl>+<\>, вызы­вает отправление сигнала текущему процессу, связанному с терминалом.

Другие процессы

Процесс может отправить сигнал другому про­цессу или группе процессов с помощью систем­ного вызова kill(). В этом случае сигналы яв­ляются элементарной формой межпроцессного взаимодействия.

Управление заданиями

Командные интерпретаторы, поддерживающие систему управления заданиями, используют сигналы для манипулирования фоновым и те­кущими задачами. Когда процесс, выполняю­щийся в фоновом режиме делает попытку чте­ния или записи на терминал, ему отправляется сигнал останова. Когда дочерний процесс за­вершает свою работу, родитель уведомляется об этом также с помощью сигнала.

Квоты

Когда процесс превышает выделенную ему кво­ту вычислительных ресурсов или ресурсов фай­ловой системы, ему отправляется соответст­вующий сигнал.

Уведомления

Процесс может запросить уведомление о насту­плении тех или иных событий, например, го­товности устройства и т. д. Такое уведомление отправляется процессу в виде сигнала.

Алармы

Если процесс установил таймер, ему будет от­правлен сигнал, когда значение таймера станет равным нулю.

Доставка и обработка сигнала

Для каждого сигнала в системе определена обработка по умолчанию, ко­торую выполняет ядро, если процесс не указал другого действия.

В общем случае - возможные действия:

-завершить выполнение про­цесса,

-игнорировать сигнал,

-остановить процесс

-продолжить процесс (справедливо для остановленного процесса, для остальных сигнал игнорируется),

наиболее употребительным из кото­рых является первое.

Процесс может

  • изменить действие по умолчанию,

  • либо зарегистрировать собственный обработчик сигнала,

  • либо указать, что сигнал следует игнорировать.

  • заблокиро­вать сигнал, отложив на некоторое время его обработку.

Это возможно не для всех сигналов. Например, для сигналов SIGKILL (сигнал, при получении которого вып-ние процесса прекращается) и SIGSTOP (остаглвка выплнения процесса от Ctrl-z) единст­венным действием является действие по умолчанию, эти сигналы нельзя ни перехватить, ни заблокировать, ни игнорировать

любая обработка сигнала, в том числе обработка по умолчанию, подразумевает, что процесс выполняется.

На системах с высо­кой загрузкой это может привести к существенным задержкам между от­правлением и доставкой сигнала, т. к. процесс не получит сигнал, пока не будет выбран планировщиком, и ему не будут предоставлены вычисли­тельные ресурсы.

Этот вопрос был затронут при разговоре о точности тай­меров, которые может использовать процесс.

Доставка сигнала происходит после того, как ядро от имени процесса вы­зывает системную процедуру issig(), которая проверяет, существуют ли ожидающие доставки сигналы, адресованные данному процессу.

Функция issig() вызывается ядром в трех случаях:

- Непосредственно перед возвращением из режима ядра в режим задачи после обработки системного вызова или прерывания.

- Непосредственно перед переходом процесса в состояние сна с приоритетом, допускающим прерывание сигналом.

- Сразу же после пробуждения после сна с приоритетом, допускающим прерывание сигналом.

Если процедура issig() обнаруживает ожидающие доставки сигналы, яд­ро вызывает функцию доставки сигнала, которая выполняет действия по умолчанию или вызывает специальную функцию sendsig(), запускаю­щую обработчик сигнала, зарегистрированный процессом.

Функция sendsig() возвращает процесс в режим задачи, передает управление об­работчику сигнала, а затем восстанавливает контекст процесса для про­должения прерванного сигналом выполнения.

Рассмотрим типичные ситуации, связанные с отправлением и доставкой сигналов. Допустим, пользователь, работая за терминалом, нажимает кла­вишу прерывания (<Del> или <Сtгl>+<С> для большинства систем). На­жатие любой клавиши вызывает аппаратное прерывание (например, пре­рывание от последовательного порта), а драйвер терминала при обработке этого прерывания определяет, что была нажата специальная клавиша, ге­нерирующая сигнал, и отправляет текущему процессу, связанному с тер­миналом, сигнал SIGINT. Когда процесс будет выбран планировщиком и запущен на выполнение, при переходе в режим задачи он обнаружит по­ступление сигнала и обработает его. Если же в момент генерации сигнала терминальным драйвером процесс, которому был адресован сигнал, уже выполнялся (т. е. был прерван обработчиком терминального прерывания), он также обработает сигнал при возврате в режим задачи после обработки прерывания.

Работа с сигналами, связанными с особыми ситуациями, незначительно отличается от вышеописанной. Особая ситуация возникает при выполне­нии процессом определенной инструкции, вызывающей в системе ошибку (например, деление на ноль, обращение к недопустимой области памяти, недопустимая инструкция или вызов и т. д.). Если такое происходит, вы­зывается системный обработчик особой ситуации, и процесс переходит в режим ядра, почти так же, как и при обработке любого другого прерыва­ния. Обработчик отправляет процессу соответствующий сигнал, который доставляется, когда выполнение возвращается в режим задачи.

При обсуждении состояния сна процесса мы выделили две категории со­бытий, вызывающих состояние сна процесса: допускающие прерывание сигналом и не допускающие такого прерывания. В последнем случае сиг­нал будет терпеливо ожидать нормального пробуждения процесса, напри­мер, после завершения операции дискового ввода/вывода.

В первом случае, доставка сигнала будет проверена ядром непосредственно перед переходом процесса в состояние сна. Если такой сигнал поступил, будет вызван обработчик сигнала, а системный вызов, который выполнял­ся процессом, будет аварийно завершен с ошибкой EINTR. Если генерация сигнала произошла в течение сна процесса, ядро .будет вынуждено разбу­дить его и снять прерванный системный вызов (ошибка EINTR). После пробуждения процесса либо вследствие получения сигнала, либо из-за наступления ожидаемого события, ядром будет вызвана функция issig(), которая обнаружит поступление сигнала и вызовет соответствующую обработку (В BSD UNIX были введено понятие перезапускаемых системных вызовов. Суть этого меха­низма заключается в том, что прерванный сигналом системный вызов автоматически по­вторяется после обработки сигнала, вместо аварийного завершения с ошибкой етмтк. До­пускается отключение этой возможности для конкретных сигналов.).