- •Глава 6 Взаимоблокировка и голодание
- •6.1. Принципы взаимного блокирования
- •Повторно используемые ресурсы
- •Расходуемые ресурсы
- •Условия возникновения взаимоблокировок
- •6.2. Предотвращение взаимоблокировок
- •Взаимоисключения
- •Удержание и ожидание
- •Отсутствие перераспределения
- •Циклическое ожидание
- •6.3. Устранение взаимоблокировок
- •Запрещение запуска процесса
- •Запрет выделения ресурса
- •А.) Глобальная структура данных
- •6.4. Обнаружение взаимоблокировок
- •Алгоритм обнаружения взаимоблокировки
- •Восстановление
- •6.5 Интегрированные стратегии разрешения взаимоблокировок
- •6.6. Задача об обедающих философах
- •6.7. Механизмы параллельных вычислений в unix
- •Сообщения
- •Разделяемая память
- •Семафоры
- •Сигналы
- •6.8. Прщийвы синхронизации потоков solaris
- •Блокировки взаимоисключений
- •Семафоры
- •Блокировки читатели/писатель
- •Переменные условий
- •6.9. Механизмы параллельных вычислений в windows 2000
- •6.10. Резюме, ключевые термины и контрольные вопросы
- •Контрольные вопросы
- •6.11. Рекомендуемая литература
- •6.12. Задачи
Семафоры
Система вызовов семафоров в 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 Сбой питания |
