Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 36
Текст из файла (страница 36)
Такой подход приводит к существованию определенного промежутка времени между запуском и переустановкой обработчика, в течение которого сигнал не может быль перехвачен. По этой причине говорят, что ранние реализации ТЛх)1Х имеют ненадежные сигналы. Сушествует также и проблема производительности, относяшаяся к спяшим процессам.
В ранних реализациях вся информация, относящаяся к диспозиции сигналов', сохраняется в массиве и вщпаЦ 1, который содержит одну запись о каждом типе сигналов. Массив располагается в области ш Элемент этого массива содержит адрес обработчика, определенного в приложении, а также параметр 516 1)Г)., в котором регламентируется действие по умолчанию, или используется 516 16М для указания на необходимость игнорирования сигнала. Так как ядро может считывать данные только из области и текущего процесса, оно не знает, каким образом другой процесс должен распорядиться сигналом.
Более того, если ядру системы необходимо послать сигнал про- ' То есть повелению лри их получении. — Прим. ред. 4.4. Надежные сигналы 156 цессу, находящемуся в состоянии прерываемого сна, оно не может знать, игнорирует процесс такой сигнал или нет. Таким образом оно отправит сигнал и разбудит тем самым процесс, предполагая, что тот обработает сигнал. Если процесс обнаружит, что он разбужен сигналом, который им игнорируется, он просто снова заснет. Такие совершенно излишние пробуждения приводят в результате к совершенно ненужным переключениям контекста и потере времени на обработку сигналов. Очевидно, что лучшим вариантом представляется распознавание сигналов ядром и сброс тех из них, которые должны игнорироваться, без необходимости участия в этом процесса.
В завершение скажем, что система БЧК2 не обладает средствами временного блокирования сигналов для задержки их доставки до тех пор, пока они не будут разблокированы. Эта система также не имеет поддержки управления заданиями, при которой группы процессов могут быть приостановлены и возобновлены для того, чтобы получить доступ к терминалу. 4.4. Надежные сигналы Проблемы, озвученные в предыдущем разделе, были впервые решены в системе 4.2ВЯЭ, в которой был представлен управляющий механизм надежных и гибких в обработке сигналов.
В ОС 4.ЗВЯК были сделаны дополнительные усовершенствования, но базовые средства остались неизменными. Между тем компания АТЛЕТ представила собственную версию надежных сигналов в своей системе БЧКЗ ~ Ц. Эта версия была несовместима с интерфейсом ВЗР и оказалась не настолько развитой. Разработчики сохранили в реализации БЧКЗ совместимость с исходным механизмом сигналов, который был в БЧК2. В обеих системах, 4.2ВЗР и БЧКЗ, была предпринята попытка решения одних и те же проблем разными способами. В итоге каждая из этих ОС обладает собственным набором системных вызовов, используемых для доступа к средствам управления сигналами. Эти вызовы имеют как различные имена, так и отличающуюся друг от друга семантику.
Стандарт РО31Х.1 явился попыткой навести порядок в имеющемся хаосе, определив стандартный набор функций, которые должны быть реализованы во всех системах, претендующих на совместимость с ним. Функции согласно этому стандарту могут быть реализованы как в виде системных вызовов, так и в виде библиотечных процедур. На основе требований РО51Х в системе БУК4 был представлен новый интерфейс, который удовлетворял стандарту РОЯХ и оказался совместим с ВЗР и со всеми предыдущими версиями 111ч1Х, созданными ранее компанией АТйТ. Этот раздел начинается с описания основных возможностей механизма надежных сигналов. Затем вы увидите краткое описание интерфейсов систем БУКЗ и 4.3ВЗР, а в конце раздела вы познакомитесь с подробным изложением сигнального интерфейса ОС ЗЧК4.
156 Глава 4. Сигналы и управление сеансами 4.4.1. Основные возможности Все реализации механизма надежных сигналов обладают некоторыми общими возможностями, перечисленными ниже. + Постоянно установленные обработчики (регз1зсепс Ьапс11егз). Обработчики сигналов остаются установленными даже после возникновения сигнала и не требуют дополнительных переустановок. Такой подход защищает от существования временного интервала между запуском обработчика сигнала и его переустановкой, во время которого повторно поступивший сигнал может завершить процесс.
+ Маскирование (шазЫпй). Сигнал может быть временно маскирован (слова «блокирован» и «маскирован» являются синонимами и взаимозаменяемы при разговоре о сигналах), Если вырабатывается сигнал, который уже блокирован процессом, ядро системы будет помнить о этом и не станет посылать такой сигнал процессу незамедлительно. Сигнал будет переправлен и обработан после того, как процесс разблокирует его. Такой подход дает возможность программисту защитить критические области кода от прерывания его выполнения при возникновении определенных сигналов. + Спящие процессы (з1еер1пя ргосезз). Некоторая информация о диспозиции сигналов в процессе является видимой для ядра (посредством хранения данных в структуре ргос вместо области и), даже если процесс не находится в текущий момент на выполнении. Следовательно, если ядро генерирует сигнал для процесса, находящегося в прерываемом сне, но тот игнорирует или блокирует данный сигнал, то ядро не станет будить такой процесс.
+ Разблокирование и ожидание (ипЫос)г апд ууа1г). Системный вызов равзе блокирует процесс до тех пор, пока ему не будет доставлен сигнал. Механизм надежных сигналов предлагает еше один вызов, з(драцзе, который атомарно демаскирует сигнал и блокирует процесс до тех пор, пока тот не получит такой сигнал. Если демаскированный сигнал уже находится в ожидании, то произойдет немедленный возврат из этого системного вызова. 4.4.2. Сигналы в системе ЗЧВЗ Система 5'у'КЗ поддерживает все возможности, описанные в предыдущем разделе.
Однако реализация механизма сигналов в этой ОС имеет некоторые недостатки. Проиллюстрируем это на примере с использованием системного вызова з1драцзе. Представьте, что процессом объявлен обработчик, перехватывающий сигнал 516001Т и устанавливающий глобальный флаг при его захвате. Процесс 4.4. Надежные сигналы 157 единожды проверяет флаг и, если тот не установлен, ждет его установки. Проверка и последующее ожидание вместе представляют собой критический участок кода: если сигнал будет доставлен после проведения проверки, но до начала ожидания, он будет потерян' и, следовательно, процесс может ожидать сигнал вечно. Таким образом, процессу необходимо маскировать сигнал 516001Т на время проверки флага. Но если процесс войдет в режим ожидания с маскированным сигналом, то в таком случае сигнал никогда не будет доставлен.
Следовательно, нам необходим некий атомарный вызов, который бы демаскировал сигнал и блокировал процесс в ожидании, Эту функцию обеспечивает системный вызов в(драиве. Пример кода, работающего в Б'чти, представлен в листинге 4.2. Листинг 4.2. Использование в1драцве дпв ожидания сигнала )пт 519 гесетчеб - 0: чо1б Папб1ег((пс в)д) в19 гесе1чеб++: ) жадп() ( в)двес(516001Т, 'папб1ег); /* ждем сигнала, если он уже не находится в ренине ожидания*! в)дйо1б(516001Т); ип(1е (в)д гесе)чеб-О) I* сигнал еще не доставлен *! в1драове(5161МТ) т !* сигнал прибыл, обработка*! Пример показывает некоторые возможности системы Б'чти по обработке сигналов.
Вызовы в(д))оЫ и в(дгеЬе позволяют блокировать и разблокировать сигнал. Вызов гйдравве атомарно деблокирует сигнал и переводит процесс в состояние сна до тех пор, пока тот не получит сигнал, который им не игнорируется и не заблокирован.
Системный вызов в(дзес определяет постоянный обработчик, не сбрасываемый в действие по умолчанию после возникновения сигнала. Старый вызов в(дпа( остался в системе для обратной совместимости. Обработчики, задаваемые при помощи этого вызова, не являются постоянными. Такой интерфейс обладает несколькими недостатками [91. Важно то, что системные вызовы 519))оЫ, в(дгеЬе и в(драцве могут работать только с одним ' Так как и флаг установится уже после его проверки. — Прим. ред. т В строке, видимо, ошибка, н вместо 5161ИТ должно быть 51600П, иначе незачем вызывать йдло(б на 516001Т, ибо зто приведет к блокированию обработчика 516001Т и, следовательно, флаг никогда не изменит своего значения, что, в свою очередь, не даст выйти из цикла.
— Прим. ред. 158 Глава 4. Сигналы и управление сеансами сигналом в один момент времени. Не существует способа атомарного блокирования или деблокирования нескольких сигналов одновременно. Если обработчик, показанный в листинге 4,2, будет использован несколькими сигналами сразу, не существует приемлемого способа программно выделить критическую область. Мы можем блокировать сигналы по одному в один момент времени, но вызов з1драпзе не сумеет атомарно разблокировать все эти сигналы и далее перевести процесс в состояние ожидания.
В системе ЗЧКЗ также отсутствует управление заданиями и такие возможности, как автоматический перезапуск системных вызовов. Такие возможности (наряду с некоторыми другими) представлены в ОС 4В51). 4.4.3. Механизм сигналов в В80 Впервые механизм надежных сигналов был представлен в ОС 4.2ВЯЭ. Возможности, предлагаемые механизмом сигналов в системе ВЯЗ 17), являются более развитыми, чем аналогичные возможности, представленные в ОС ЗУКЗ. В большинстве системных вызовов одним из входных аргументов передается 32-битовая маска сигналов, биты которой отображают, с какими из сигналов будет оперировать функция (по одному биту на каждый сигнал).