Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
У. Столлингс ГЛАВА 6 Межзадачное взаимодействие...doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
3.19 Mб
Скачать

Семафоры

Система вызовов семафоров в UNIX System V представляет собой обобщение примитивов wait и signal, определенных в главе 5, "Параллельные вычисления: взаимоисключения и многозадачность". Все требуемые при работе с семафорами операции выполняются ядром автоматически; ни один процесс не может получить доступ к семафору, пока с ним выполняется операция, вызванная другим процессом.

Семафор состоит из следующих элементов.

  • Текущее значение семафора.

  • Идентификатор последнего процесса, работавшего с семафором.

  • Количество процессов, ожидающих, пока значение семафора не превысит текущее.

  • Количество процессов, ожидающих, пока значение семафора не станет равным нулю.

С семафором связаны очереди приостановленных процессов.

При создании семафоры принадлежат множествам. Множество может содержать как один так и несколько создаваемых семафоров. Системный вызов semctl позволяет установить значения всех семафоров множества одновременно. Кроме того, имеется системный вызов semop, в качестве аргумента которому передается список операций с семафорами (по одной для каждого семафора из множества). При этом вызове ядро выполняет указанные операции одновремен­но. Каждая из операций определяется значением sem_op. Если sem_op положительно, ядро увеличивает значение семафора и активизирует все процессы, ожидающие увеличения значения семафора.

  • Если sem_op равно 0, ядро проверяет значение семафора. Если оно нулевое, то ядро переходит к выполнению операций со следующим семафором; в противном случае количество процессов, ожидающих обнуления семафора, увеличивается, и процесс приостанавливается до тех пор, пока значение семафора не станет равным нулю.

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

  • Если sem_op отрицательно, а его абсолютное значение больше значения семафора, ядро приостанавливает процесс до тех пор, пока значение семафора не увеличится.

Такое обобщение семафоров обеспечивает значительную гибкость при выполнении синхронизации и координации процессов.

Сигналы

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

Процессы могут посылать сигналы друг другу; в обмене сигналами может принимать участие и ядро. Доставка сигнала выполняется путем обновления поля в таблице процесса, которому послан данный сигнал. Поскольку каждый сигнал соответствует отдельному биту, сигналы одного типа не могут накапливаться в виде очереди. Сигнал обрабатывается сразу же после активизации процесса или возврата его из системного вызова. Процесс может ответить на сигнал выполнением некоторых действий по умолчанию (например, завершением работы), выполнить функцию обработки сигнала или проигнорировать его.

В табл. 6.1 перечислены сигналы UNIX SVR4.

Значение Имя Описание

01 SIGHUP Завесить; посылается процессу, когда ядро полагает, то пользователь этого процесса выполняет бесполезную работу

02 SIGINT Прерывание

03 SIGQUIT Выход; посылается пользователем, для того чтобы вызвать остановку процесса и сброс дампа памяти

04 SIGILL Некорректная инструкция

05 SIGTRAP Запуск кода трассировки процесса

06 SIGIOT Инструкция IOT

07 SIGEMT Инструкция ЕМТ

08 SIGFPT Исключение при работе с числами с плавающей точкой

09 SIGKILL Прекращение работы процесса

10 SIGBUS Ошибка шины

11 SIGSEGV Нарушение сегментации; процесс пытается обратиться к ячейке памяти вне своего виртуального адресного пространства

12 SIGSYS Неверный аргумент системного вызова

13 SIGPIPE Запись в канал, к которому не присоединены процессы, считывающие из него информацию

14 SIGALARM Сигнал от часов; используется, когда процесс должен получить сигнал после определенного периода времени

15 SIGTERM Завершение работы программы

16 SIGUSR1 Пользовательский сигнал 1

17 SIGUSR2 Пользовательский сигнал 2

18 SIGCLD Завершение дочернего процесса

19 SIGPWR Сбой питания