Задача о взаимном исключении.
Пусть несколько процессов разделяют общую переменную, запись, файл или другой элемент данных. Для обновления разделяемого элементаданных процесс должен сначала считать старое значение, затем вычислить новое и, наконец, записать его на то же место. Если два процесса P1 и P2в одно и то же время пытаются выполнить такую последовательность действий, то могут возникнуть искажения данных. Например, возможна последовательность:
Процесс P1 считывает значение х из разделяемого объекта;
Процесс P2 считывает значение х из разделяемого объекта;
Процесс P1 вычисляет новое значение х' = f(x);
Процесс P2 вычисляет новое значение х" = g(x);
Процесс P1 записывает х' в разделяемый объект;
Процесс P2 записывает х" в разделяемый объект, уничтожая значение х;
Результат вычисления процесса P1 потерян.
Для исключения подобных проблем используется метод взаимного исключения, основанный на понятии критическая секция. Критическая секция – это участок кода процесса, на котором он осуществляет доступ к разделяемому объекту данных. Прежде, чем выполнить свою критическую секцию, процесс ждёт, пока другой процесс не закончит выполнение собственной критической секции (если такое выполнение имеет место). Затем он входит в критическую секцию и блокирует доступ для любого другого процесса к своей критической секции. После выполнения процессом критической секции деблокируется доступ для других процессов к разделяемому объекту данных.
Следующая сеть Петри (рис. 4.8) моделирует механизм взаимного исключения для двух процессов P1 и P2. Она легко обобщается на произвольное число процессов.
Позиция mпредставляет условие «критическая секция свободна», разрешающее вход в критическую секцию. Попытка процесса P1 (P2) войти в критическую секцию осуществляется после помещения фишки в его позицию s1 (s2). Такая попытка может увенчаться успехом, если в позиции mсодержится фишка. Если оба процесса пытаются войти в критическую секцию одновременно, то переходы t1 и t2 вступят в конфликт, и только один из них сможет запуститься. Запуск t1 запретит запуск перехода t2, вынуждая процесс P2 ждать, пока процесс P1 выйдет из своей критической секции, и возвратит фишку обратно в позицию m.
Дата добавления: 2015-07-18; просмотров: 965;