А. Робачевский - Операционная система UNIX (1114671), страница 47
Текст из файла (страница 47)
д. Такое уведомлениеотправляется процессу в виде сигнала.Если процесс установил таймер, ему будет от!правлен сигнал, когда значение таймера станетравным нулю.Доставка и обработка сигналаДля каждого сигнала в системе определена обработка по умолчанию, ко!торую выполняет ядро, если процесс не указал другого действия. В общемслучае существуют пять возможных действий: завершить выполнение про!цесса (с созданием образа core и без), игнорировать сигнал, остановитьпроцесс и продолжить процесс (справедливо для остановленного процесса,для остальных сигнал игнорируется), наиболее употребительным из кото!рых является первое.www.books-shop.comСигналы239Как уже обсуждалось в главе 2, процесс может изменить действие поумолчанию, либо зарегистрировав собственный обработчик сигнала, либоуказав, что сигнал следует игнорировать.
Процесс также может заблокиро!вать сигнал, отложив на некоторое время его обработку. Это возможно недля всех сигналов. Например, для сигналови SIGSTOP единст!венным действием является действие по умолчанию, эти сигналы нельзяни перехватить, ни заблокировать, ни игнорировать. Для ряда сигналов,преимущественно связанных с аппаратными ошибками и особыми ситуа!циями, обработка, отличная от умалчиваемой, не рекомендуется, так какможет привести к непредсказуемым (для процесса) результатам.Следует заметить, что любая обработка сигнала, в том числе обработка поумолчанию, подразумевает, что процесс выполняется.
На системах с высо!кой загрузкой это может привести к существенным задержкам между от!правлением и доставкой сигнала, т. к. процесс не получит сигнал, пока небудет выбран планировщиком, и ему не будут предоставлены вычисли!тельные ресурсы. Этот вопрос был затронут при разговоре о точности тай!меров, которые может использовать процесс.Доставка сигнала происходит после того, как ядро от имени процесса вы!зывает системную процедурукоторая проверяет, существуют лиожидающие доставки сигналы, адресованные данному процессу. Функцияissigвызывается ядром в трех случаях:1. Непосредственно перед возвращением из режима ядра в режим задачипосле обработки системного вызова или прерывания.2.
Непосредственно перед переходом процесса в состояние сна с приори!тетом, допускающим прерывание сигналом.3. Сразу же после пробуждения после сна с приоритетом, допускающимпрерывание сигналом.Если процедура() обнаруживает ожидающие доставки сигналы, яд!ро вызывает функцию доставки сигнала, которая выполняет действия поумолчанию или вызывает специальную функциюзапускаю!щую обработчик сигнала, зарегистрированный процессом. Функциявозвращает процесс в режим задачи, передает управление об!работчику сигнала, а затем восстанавливает контекст процесса для про!должения прерванного сигналом выполнения.Рассмотрим типичные ситуации, связанные с отправлением и доставкойсигналов. Допустим, пользователь, работая за терминалом, нажимает кла!прерывания (<Del> или <Ctrl>+<C> для большинства систем).
На!жатие любой клавиши вызывает аппаратное прерывание (например, пре!рывание от последовательного порта), а драйвер терминала при обработкеэтого прерывания определяет, что была нажата специальная клавиша, ге!нерирующая сигнал, и отправляет текущему процессу, связанному с тер!миналом, сигнал S I G I N T . Когда процесс будет выбран планировщиком иȾɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.com240Глава 3.процессамизапущен на выполнение, при переходе в режим задачи он обнаружит по!ступление сигнала и обработает его.
Если же в момент генерации сигналатерминальным драйвером процесс, которому был адресован сигнал, ужевыполнялся (т. е. был прерван обработчиком терминального прерывания),он также обработает сигнал при возврате в режим задачи после обработкипрерывания.Работа с сигналами, связанными с особыми ситуациями, незначительноотличается от вышеописанной. Особая ситуация возникает при выполне!нии процессом определенной инструкции, вызывающей в системе ошибку(например, деление на ноль, обращение к недопустимой области памяти,недопустимая инструкция или вызов и т.
д.). Если такое происходит, вы!зывается системный обработчик особой ситуации, и процесс переходит врежим ядра, почти так же, как и при обработке любого другого прерыва!ния. Обработчик отправляет процессу соответствующий сигнал, которыйдоставляется, когда выполнение возвращается в режим задачи.При обсуждении состояния сна процесса мы выделили две категории со!бытий, вызывающих состояние сна процесса: допускающие прерываниесигналом и не допускающие такого прерывания. В последнем случае сиг!нал будет терпеливо ожидать нормального пробуждения процесса, напри!мер, после завершения операции дискового ввода/вывода.В первом случае, доставка сигнала будет проверена ядром непосредственноперед переходом процесса в состояние сна. Если такой сигнал поступил,будет вызван обработчик сигнала, а системный вызов, который выполнял!ся процессом, будет аварийнос ошибкой EINTR.
Если генерациясигнала произошла в течение сна процесса, ядро будет вынуждено разбу!дить его и снять прерванный системный вызов (ошибка EINTR). Послепробуждения процесса либо вследствие получения сигнала, либо из!за на!ступления ожидаемого события, ядром будет вызвана функциякоторая обнаружит поступление сигнала и вызовет соответствующуюВзаимодействие между процессамиКак уже обсуждалось, в UNIX процессы выполняются в собственном ад!ресном пространстве и по существу изолированы друг от друга. Тем самымсведены к минимуму возможности влияния процессов друг на друга, чтоявляется необходимым в многозадачных операционных системах.
ОднакоВ BSD UNIX были введено понятие перезапускаемых системных вызовов. Суть этого меха!низма заключается в том, что прерванный сигналом системный вызов автоматически по!вторяется после обработки сигнала,аварийного завершения с ошибкой EINTR. До!пускается отключение этой возможности для конкретных сигналов.www.books-shop.comпроцессамиот одиночного изолированного процесса мало пользы. Сама концепцияUNIX заключается в модульности, т.
е. основана на взаимодействии междуотдельными процессами.Для реализации взаимодействия требуется:обеспечить средства взаимодействия между процессамии одновременноП исключить нежелательное влияние одного процесса на другой.Взаимодействие между процессами необходимо для решения следующихзадач:Передача данных.
Один процесс передает данные другому процессу,при этом их объем может варьироваться от десятков байтов до не!скольких мегабайтов.П Совместное использование данных. Вместо копирования информацииот одного процесса к другому, процессы могут совместно использо!вать одну копию данных, причем изменения, сделанные одним про!цессом, будут сразу же заметны для другого.
Количество взаимодей!ствующих процессов может быть больше двух. При совместном ис!пользовании ресурсов процессам может понадобиться некоторыйпротокол взаимодействия для сохранения целостности данных и ис!ключения конфликтов при доступе к ним.О Извещения. Процесс может известить другой процесс или группупроцессов о наступлении некоторого события. Это может понадо!биться, например, для синхронизации выполнения нескольких про!цессов.Очевидно, что решать данную задачу средствами самих процессов неэффек!тивно, а в рамках многозадачной системы — опасно и потому невозможно.Таким образом, сама операционная система должна обеспечить механизмымежпроцессного взаимодействияCommunication,К средствам межпроцессного взаимодействия, присутствующим во всехверсиях UNIX, можно отнести:П сигналыП каналыFIFO (именованные каналы)П сообщения (очереди сообщений)П семафорыП разделяемую памятьПоследние три типа IPC обычно обобщенно называют System VВо многих версиях UNIX есть еще одно средство IPC —впервыепредложенные в BSD UNIX (им посвящен отдельный раздел главы).www.books-shop.com242Глава 3.управления процессамиСигналы изначально были предложены как средство уведомления обошибках, но могут использоваться и для элементарногонапример, длясинхронизации процессов или для передачи простейших команд от одногопроцесса кОднако использование сигналов в качестве средстваограничено из!за того, что сигналы очень ресурсоемки.
Отправка сиг!нала требует выполнения системного вызова, а его доставка — прерыванияпроцесса!получателя и интенсивных операций со стеком процесса для вы!зова функции обработки и продолжения его нормального выполнения.При этом сигналы слабо информативны и их число весьма ограничено.Поэтому сразу переходим к следующему механизму — каналам.КаналыВспомните синтаксис организации программных каналов при работе в ко!мандной строке shell:cat m y f i l e]При этом (стандартный) вывод программыкоторая выводит содер!жимое файла myfile, передается на (стандартный) ввод программыкоторая, в свою очередь подсчитывает количество строк, слов и символов.В результате мы получим что!то вроде:12 45 260что будет означать количество строк, слов и символов в файле myfile.Таким образом, два процесса обменялись данными.