OpenU.Ru
Особое состояние, которое позволяет осуществить синхронизацию управления между
двумя параллельными областями конечного автомата.
См. complex transition; composite
state; fork; join; state
machine; transition.
Семантика
Композитное состояние может насчитывать несколько параллельных областей, каждая
из которых имеет свое собственное последовательное множество состояний. При
входе в параллельное композитов состояние активизируется каждая из параллельных
областей. В каждой параллельной области есть один поток управления, который
выполняется независимо от остальных (поэтому области и называются параллельными).
Впрочем, время от времени управление между параллельными областями должно быть
синхронизировано. У перехода, входящего в такую параллельную область, может
быть сторожевое условие, зависящее от состояния другой области. Они могут быть
удобны при моделировании взаимоисключающих состояний или блоков кода, включая
использование общих ресурсов, однако не могут помочь в ситуациях, когда деятельность
в одной из областей в какой-то момент должна повлиять на деятельность в другой
области (даже если первая область после этого продолжает выполнение). Для моделирования
подобных ситуаций используется состояние синхронизации.
Состояние синхронизации является особым состоянием,
которое связывает две параллельных области. Области могут быть равноправными,
- иначе говоря, две параллельные области могут принадлежать одному и тому же
композитному состоянию, либо же они могут размещаться на любом уровне вложения
в других равноправных областях. Связываться последовательно эти области не могут.
Один переход связывает выходной сегмент развилки одной области с входом состояния
синхронизации, а другой - выход состояния синхронизации с входным сегментом
слияния в другой области. Иначе говоря, состояние синхронизации представляет
собой буфер, косвенно связывающий развилку в одной области
и слияние в другой. И у развилки, и у слияния должно
быть по одному входному и одному выходному состоянию, находящемуся внутри их
собственных областей.
Состояние синхронизации запоминает запуск перехода в первой области до тех пор,
пока во второй области не запустится переход слияния. Если условия перехода
слияния удовлетворены еще до того, как активизируется состояние синхронизации,
то слияние вес равно может осуществиться только после запуска перехода в первой
области. Другими словами, это состояние представляет собой переход во второй
области, который не может запуститься до тех пор, пока не запустится переход
в первой области. И противном случае оно блокируется до тех пор, пока не запустится
первый переход. Обратите внимание, что поскольку каждая развилка и каждое слияние
должны иметь внутри своей области по одному входному и выходному сегменту, состояния
синхронизации не изменяют ни основное последовательное поведение каждой параллельной
подобласти, ни правила вложений для композитных состояний (за исключением того,
что состояние синхронизации и его дуги принадлежат не какой-либо из параллельных
областей, и самому композитному суперсостоянию). Типичный пример состояния синхронизации
- отношения производитель-потребитель. Производитель запускает переход, который
активизирует состояние синхронизации, а у потребителя есть переход, для запуска
которого требуется активизация состояния синхронизации.
Если переход, входящий в состояние синхронизации, является частью цикла, то
первая область может уйти вперед по сравнению со второй областью. Используя
термин сетей Петри, можно сказать, что у состояния синхронизации может быть
несколько ярлыков (tokens). Таким образом, в отличие от обычного состояния,
состояние синхронизации представляет собой счетчик или очередь (в случае если
происходит обмен информацией между областями, - например, если состояние синхронизации
представляет собой состояние потока объектов).
По умолчанию состояние синхронизации может иметь неограниченное количество ярлыков
(либо же их число ограничивает сам разработчик). Превышение этого количества
является ошибкой времени выполнения. Чаще всего предельное количество ярлыков
не ограничено или равно единице. Последнее представляет собой простой регистр-защелку
и используется только тогда, когда существует гарантия, что во время выполнения
не возникнет перегрузки. Ответственность за это лежит на разработчике. Существующие
ярлыки состояния синхронизации уничтожаются при выходе из внешнего композитною
состояния. Состояние синхронизации должны быть пустым при каждом входе в композитную
область.
В состояние синхронизации может входить несколько дуг, однако все они должны
принадлежать развилкам одной последовательной области выполнения. Точно так
же из состояния синхронизации может исходить несколько дуг, которые затем образуют
слияния в этой последовательной области. Каждая область последовательна, поэтому
можно не опасаться, что между несколькими дугами возникнет конфликтная ситуация.
Состояние синхронизации может представлять собой состояние потока объектов.
В этом случае оно является очередью значений, передающихся от одной области
к другой.
Нотация
Состояние синхронизации изображается в виде маленького кружка, внутри которого
ставится обозначений предельного количества ярлыков (цифра или звездочка, символизирующая
неограниченное количество). От черти синхронизации (жирная черта) к состоянию
синхронизации идет стрелка перехода. Еще одна стрелка указывает на переход из
состояния синхронизации к черте синхронизации в другой области (рис. 177).
Состояние синхронизации лучше всего изображать на диаграмме между двумя областями,
однако, это не всегда возможно (так как эти области могут находиться далеко
друг от друга). В любом случае, топология таких связей является предельно ясной.
На диаграмме деятельности каждая дуга перехода представляет (косвенно) некое
состояние. Следовательно, стрелку перехода можно вести от выходного сегмента
развилки к входному сегменту слияния, а состояние синхронизации при этом можно
не показывать. (В этом случае состояние синхронизации бывает нужно изобразить
для того, чтобы явно указать максимальное количество ярлыков.)
Рис. 177. Конфигурация состояния синхронизации
Пример
На рис. 178 вы видите диаграмму состояний,
описывающую ситуацию покупки билетов. Процессы оформления билетов и взимания
за них платы протекают параллельно - за исключением того, что сначала в билетах
указываются места, а уже после этого вычисляется сумма оплаты и отправляется
счет. Синхронизация этих двух процессов обеспечивается при помощи состояния
синхронизации,
которое вводится между состоянием Pick seats (Выбрать места) и Post charges
(Отправить счет). После состояния Pick seats находится развилка, так как за
ним следуют как состояние Print tickets (Печатать билеты), так и состояние синхронизации.
Состоянию Print charges (Печатать счет) ожидать синхронизации не нужно. Перед
состоянием Post charges находится слияние, так как оно должно дождаться как
состояния Validate account (Проверить счет), так и состояния синхронизации.
После завершения обоих состояний - Print tickets и Post charges - осуществляется
выход из композитного состояния и активизируется состояние Mail-tickets (Отправить
билеты).
Рис. 178. Состояние синхронизации для единичного заказа
У состояния синхронизации может быть только один ярлык. Увеличивать их количество
нет необходимости, потому что при выполнении композитного состояния осуществляется
всего одна синхронизация.
На рис. 179 представлена пакетная версия процесса заполнения заказа (Fill Order).
В этом случае многие заказы заполняются в автономном режиме. Заказы заполняются
на одном сервере, а изменения (Gharge account) в них вносятся уже на другом.
Изменения нельзя вносить до тех пор, пока заказ не заполнен полностью. При этом
заказы могут оформляться до взимания платы, поэтому состояние син-
хронизации неограничено. Это стандартный пример ситуации производитель-потребитель.
Рис. 179. Ситуация производитель-потребитель с неограниченным состоянием синхронизации
Обсуждение
Состояния синхронизации служат для моделирования ситуаций типа производитель-потребитель
с минимальными издержками. При этом надежность системы будет выше, чем при моделировании
при помощи общих конструкций параллелизма, так как каждая параллельная область
поддерживает в любой момент времени только один поток управления. Кроме этого,
в данном случае не существует опасности перегрузки системы (если состояние синхронизации
неограничено), поскольку при каждом выходе из текущего внешнего композитного
состояния состояние синхронизации опустошается. Если состояния синхронизации
используются в циклах, у которых есть разветвления, то возникает опасность зависания
системы (одна область может закончить выполнение, не активизируя состояние синхронизации,
в то время как другая будет ожидать-ярлыка синхронизации, которому будет неоткуда
взяться). Такая же опасность возможна в случае, когда каждая область находится
и разветвлении, которое ожидает ярлыка синхронизации от другой области (deadlock).
Гарантированно избежать таких ситуаций в параллельных системах, которые допускают
условное выполнение, практически невозможно. Окончание выполнения в области
нельзя гарантировать даже при отсутствии состояний синхронизации - по причине
проблемы останова.