Решение проблемы взаимного исключения. Запрет прерываний. Переменная блокировки

Межпроцессное взаимодействие. Состояние состязания. Критические области.

Межпроцессное взаимодействие

Во время работы системы возникает необходимость организованного взаимодействия между процессами, по возможности не используя прерывания. Такое взаимодействие называется межпроцессным (IPC - Interprocess Communication).

Проблемы разбиваются на 3 пункта:

- передача информации от одного процесса другому;

- контроль над деятельностью процесса - необходимо гарантировать, что 2 процесса не пересекутся в критических ситуациях (например, одновременный доступ к файлу);

- согласованность действий процессов (если процесс А поставляет информацию процессу Б, то процесс Б не должен отработать раньше А).

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

Состояние состязания

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

К ритические области

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

Для правильной совместной работы взаимного исключения недостаточно. Необходимо выполнение четырех условий:

- два процесса не должны одновременно находится в критической области;

- в программе не должно быть предположений о скорости или количестве процессов;

- процесс, находящийся вне критической области, не может блокировать другие процессы;

- невозможна ситуация, в которой процесс вечно ждет попадания в критическую область.

1. Запрет прерываний. Самое простое решение состоит в запрещении всех прерываний при входе процесса в критическую область. Таким образом становится невозможным прерывание по таймеру, что исключает передачу процессора другому процессу. Недостатки:

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

- в многопроцессорной системе запрет прерываний касается только одного процессора. Остальные процессоры продолжат свою работу в нормальном режиме, сохраняя доступ к разделяемым данным.

2. Переменные блокировки. Допустим, существует одна совместно используемая переменная, изначально равная нулю. Если процесс хочет попасть в критическую область, он считывает значение этой переменной, сравнивает ее с нулем, и, в случае равенства, изменяет значение на единицу и входит в критическую область. Если переменная равна 1, то процесс ожидает (не уходит в состояние блокировки или готовности). Недостаток: один процесс считывает переменную, успешно сравнивает ее с нулем, но до того, как успевает сменить ее значение на единицу, управление получает другой процесс. Он изменяет значение на единицу и входит в критическую область. При передаче управления первому процессу, он повторно устанавливает значение переменной блокировки в единицу и входит в критическую область. Соответственно, в критической области находится 2 процесса, что противоречит условию №1. Повторной проверкой значения переменной такая ситуация не решается.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: