Теория распараллеливания и синхронизация. Демьянович Ю.К - 53 стр.

UptoLike

Приведенная только что программа представляет один из ал-
горитмов "разрыва узла" для двух процессов.
Однако, эта программа не исключает одновременное появление
процессов в своих критических секциях; действительно, если после
присваивания в CS1 last = 1 процесс CS2 вошел в свою критиче-
скую секцию, то он успевает присвоить last = 2 и проверить, что
in1 = false после этого процесс CS1 присваивает in1 = true). В
этом случае процесс CS1 сможет войти в свою критическую секцию
то время как CS2 еще не вышел из своей критической секции).
Таким образом, корректная реализация алгоритма разрыва уз-
ла существенно зависит от работы оборудования: существенная раз-
ница в скорости обработки процессов может нарушить правиль-
ность реализации приведенной программ ы, так что оба процесса
окажутся в своих критических секциях.
Читателю рекомендуется предложить свои варианты "р азрыва
узла" и проанализировать их с точки зрения реализуемости при
тех или иных предположениях о работе оборудовани я.
§7 Алгоритм билета
Здесь получим одно из возможных обобщений алгоритма разрыва
узла на случай n процессов.
Моделью приводимого решения является вытягивание билетов
(номеров) и последующее ожидание своей очереди в пр едп оложе -
нии, что п осле довательн ое вытягивание билетов сопровождается
возрастанием их номеров; это решение называется алгоритмом би-
лета.
АЛГОРИТМ БИЛЕТА: КРУПНОМОДУЛЬНОЕ РЕШЕНИЕ
1) int number = 1, next = 1, turn[1 : n] = ([n]0);
2) process CS[i = 1 to n] {
3) while (true) {
4) < turn[i] = number; number = number + 1; >
5) < await (turn[i] == next); >
6) [критическая секция];
54