Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Средства взаимодействия процессов на примере OS UNIX



Операционная система UNIX является многозадачной системой. Для управления взаимодействием процессов в фазе “пользователь” OS UNIX предоставляет средства внешней синхронизации и коммуникации процессов.

Для обеспечения возможности внешней синхронизации процессов в фазе “пользователь” OS UNIX для каждого процесса имитирует систему программных прерываний, называемых сигналами. Сигнальный механизм позволяет процессу реагировать на различные события, моменты появления которых не могут быть заранее предусмотрены. Обработка сигналов позволяет реализовать популярную в настоящее время методологию событийного программирования.

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

OS UNIX имеет более совершенные средства межпроцессорной коммуникации, обычно именуемые РС (Inter Process Communication). Средства IPC свободны от недостатков межпроцессорного обмена через файл. Традиционно к средствам IPC в OS UNIX относятся: именованные и неименованные (обычные) программные каналы, разделяемая память, семафоры и очереди сообщений.

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

Сигналы генерируются, когда происходят определенные события, которые вызывают посылку сигнала. Сигнальные события могут быть вызваны программными и аппаратными причинами, прерыванием от терминала, результатом измерения времени и выполнением других процессов. Если инициатор сигнала — ядро, другой процесс или интерактивные действия пользователя, то сигнал считается асинхронным по отношению к процессу-приемнику сигнала. Когда сигнал инициируется выполнением инструкций процесса-приемника, сигнал считается синхронным. В обоих случаях получение сигнала вызывает прерывание работы процесса-приемника сигнала и выполнение заранее определенных действий по его обработке.

Каждый сигнал имеет уникальный номер, однозначно определяющий событие, которым он вызван. Классические версии OS UNIX определяли 16 сигналов с номерами от 1 до 16. В современных версиях OS UNIX список сигналов расширен до 32. Для удобства спецификации сигналов используются символьные мнемоники. Ниже перечислены мнемоники основных сигналов, с кратким описанием событий, инициирующих их появление.

А синхронные терминальные сигналы

1. SIGHUP - разрыв связи с терминалом;

2. SIGINT - прерывание от терминала, генерируется при нажатии Ctrl-C;

3. SIGQUIT - сигнал выхода, генерируется при нажатии Ctrl-\.

Синхронные сигналы ловушки

4. SIGILL - попытка выполнить нелегальную машинную инструкцию;

5. SIGFPE - десятичное переполнение или деление на 0;

6. SIGBUS - ошибка шины при неверной косвенной адресации;

11. SIGSEGV - нарушение границ сегментов адресного пространства;

12. SIGSYS - неверный параметр при обращении к системному вызову;

13. SIGPIPE - разрыв программного канала.

Сигнал от таймера реального времени

14. SIGARM - ядром при истечении интервала, заданного системным выходом alarm.

Сигналы от событий е других процессах или системе

9. SIGKILL - безусловное завершение процесса;

15. SIGTERM - условное завершение процесса;

16. SIGUSR 1 - сигнал, определенный пользователем;

17. SIGUSR 2 - сигнал, определенный пользователем;

18. SIGCLD - изменение статуса процесса-потомка;

19. SIGPWR - рестарт по сбою питания;

23. SIGSTOP - приостановка выполнения процесса;

24. SIGCONT - возобновление выполнения приостановленного процесса.

Возможность принудительной посылки конкретному процессу или группе процессов определенного сигнала даже при отсутствии реальной причины его возникновения обеспечивают системный вызов и команда kill. Их аргументы задают номер сигнала и идентификатор процесса-приемника сигнала. Значение идентификатора процесса-приемника должно быть больше 0, когда сигнал посылается процессу индивидуально. При распределенной посылке сигнала аргумент идентификации приемника может быть равен 0, когда сигнал посылается группе процессов; равен - 1, когда сигнал посылается всем процессам владельца-источника сигнала; меньше -1, когда сигнал посылается всем процессам группы владельца процесса, инициатора сигнала.

Для организации обработки сигналов используются следующие сигнальные поля структуры struct proc дискрептора процесса-приемника сигнала: p_sig, p_hold, p_cursig, и p_catch.

Поле p_sig используется для регистрации номера принятого сигнала. При этом применяется следующий способ регистрации. Если принят сигнал с номером n, то устанавливается бит (n - 1) поляp_sig который будет сброшен после обработки сигнала. Например, значение поля p_sig равное 5, означает регистрацию сигналов SIGHUP в SIGQUIT с номерами 1 и З соответственно. Следует отметить, что OS UNIX не поддерживает очередь сигналов, поэтому, если процесс принял последовательно несколько одинаковых сигналов до начала обработки первого из них, то будет обработан только результат последнего приема. Очевидно, что разнотипные сигналы могут быть одновременно зарегистрированы в поле p_sig и обработаны в порядке их поступления.

Поле p_cursig сохраняет номер текущего сигнала, который должен быть обработан.

Поле p_hold фиксирует номера сигналов, обработка которых должна быть задержана на период выполнения какого-либо блока инструкций процедурного сегмента программы процесса. Блок программы процесса, когда появление определенных сигналов нежелательно, должен быть ограничен системными вызовами sighold и sigrelse, которые соответственно задерживают и освобождают обработку указанных сигналов.

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

Когда нужно установить стандартную обработку, принятую по умолчанию, в системный вызов signal вместо адреса обработки передается 0 или макрос SIG_DEL. Стандартной реакцией процесса на большинство сигналов является принудительное завершение процесса. Реакция по умолчанию на такие сигналы, как SIGQUIT, SIGFPE, SIGSEGV, SIGBUS приводит к принудительному завершению процесса с образованием файла дампа памяти.

Когда в процессе нужно игнорировать сигнал, в системный вызов signal вместо адреса функции обработки передается 1 или макрос SIG_IGN. Почти все сигналы могут быть принудительно игнорированы. По умолчанию игнорируются сигналы, которые не должны приводить к завершению процесса, например SIGCLD, SIGUSR 1, SIGUSR 2.

Под перехватом сигнала понимается передача в системный вызов signal адреса функции, которая реализует желаемую реакцию процесса на данный сигнал. Следует отметить, что после перехвата сигнала автоматически восстанавливается стандартная реакция на него. Поэтому целесообразно переустанавливать перехват сигнала системным вызовом . когда нужно сохранить его нестандартную обработку. Когда необходимость в перехвате сигнала исчерпана, следует восстановить обработку по умолчанию, используя системный вызов signal с аргументом 0 или SIG_DEL. Следует отметить, что сигнал безусловного завершения SIGKILL с номером 9 не может быть игнорирован или перехвачен никаким процессом.

Установленная реакция процесса на сигналы отражается контекстом процесса в форме таблицы сигналов u_signal. Записи этой таблицы упорядочены по номерам сигналов в виде массива адресов их функций обработки. Формально каждый элемент таблицы сигналов может принимать одно из трех значений в соответствии с выбранной альтернативой обработки:

u_signal [i]=0 - принята обработка по умолчанию сигнала i + 1;

u_signal [i]=1 - установлено игнорирование сигнала i+1;

u_signal [i]=n адрес функции обработки в адресном пространстве процесса при перехвате сигнала i+1.

Порожденный процесс наследует весь контекст обработки сигналов от процесса-предка. После смены программы выполнения процесса системным вызовом семейства exec установленная нестандартная обработка сигналов будет игнорирована. Если сигнал был принят во время реализации системного вызова, то выполнение последнего будет прервано для обработки сигнала. После завершения обработки сигнала прерванный системный вызов перезапускается автоматически. В заключение следует отметить, что механизм обработки сигналов в OS UNIX представляет собой реализацию эффективной методологии событийного программирования.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.