На этом шаге рассмотрим временные ограничения и местоположение распределенной системы в UML.
Моделирование времени и пространства – важный элемент любой распределенной системы или системы реального времени. Для визуализации, специфицирования, конструирования и документирования таких систем UML предлагает различные средства, включая отметки времени, временные выражения, ограничения и помеченные значения.
Приступая к моделированию большинства программных систем, обычно делают установку на идеальность среды: предполагают, что доставка сообщения осуществляется мгновенно, сетевые сбои исключены, рабочие станции никогда не выходят из строя, а загрузка сети всегда равномерна. К сожалению, реальность отнюдь не укладывается в эту схему: сообщения доставляются с некоторой задержкой (а иногда и вовсе не доставляются), сеть "падает", рабочие станции "зависают" и загрузка сети далека от сбалансированной. Поэтому, рассматривая моделируемую систему, необходимо принимать во внимание как пространственные, так и временные характеристики.
Система реального времени (real time system) называется так потому, что она должна выполнять свои функции в строго определенный абсолютный или относительный момент времени и затрачивать на это предсказуемое и зачастую ограниченное время. Среди подобных систем бывают такие, для которых требуемое время реакции исчисляется нано- или миллисекундами. Но встречаются системы "почти реального времени", для которых допустимое время реакции – порядка секунды и даже больше.
Под распределенной системой (distributed system) понимается такая система, компоненты которой могут быть физически размещены на различных узлах. Узлы могут представлять собой разные процессоры, смонтированные в одном и том же корпусе, или разные компьютеры, находящиеся в противоположных точках земного шара.
Чтобы удовлетворить потребности моделирования систем реального времени и распределенных систем, UML включает графическое представление для отметок времени, временных выражений, временных ограничений и местоположения, как показано на рис. 1.
Рис.1. Временные ограничения и местоположение
Отметка времени (timing mark) служит для обозначения момента времени, в который произошло событие. Она изображается в виде засечки (короткой горизонтальной линии) на границе диаграммы последовательности.
Временное выражение (time expression) – это выражение, значением которого является абсолютное или относительное время. Временное выражение может быть также сформировано с использованием имени сообщения и указания стадии его обработки, например request.sendTime или request.receiveTime.
Временное ограничение (timing constraint) – это семантическое утверждение об относительном или абсолютном времени. Графически временное ограничение изображается как любое другое – строкой, заключенной в скобки, и обычно связано с некоторым элементом зависимостью.
Местоположение (location) – это размещение компонента в узле. Является атрибутом объекта.
Для систем реального времени, как следует из самого названия, важна своевременность реакции. События в них могут происходить регулярно или спонтанно, но в любом случае время реакции на событие должно быть предсказуемо – либо в абсолютном выражении, либо относительно момента возникновения события.
Передача сообщений – это один из динамических аспектов любой системы, поэтому при моделировании ее временных особенностей с помощью UML можно каждому сообщению, принимающему участие во взаимодействии, дать имя, которое будет использоваться как отметка времени. Обычно сообщениям, принимающим участие во взаимодействии, имена не присваиваются. Как правило, при их изображении используется имя события, например сигнала или вызова. При этом нельзя вводить имя события в запись выражения, поскольку одно и то же событие может повлечь за собой различные сообщения. Если имеет место такого рода неоднозначность, следует присвоить явное имя сообщению в отметке времени, чтобы в дальнейшем его можно было использовать во временном выражении. Если задано имя сообщения, допускается применение любой из трех его функций – sendTime, receiveTime, transmissionTime (не описаны в UML).
Для синхронных вызовов можно также указать ссылку на время кругового (round-trip) сообщения – executionTime (не описаны в UML). Эти функции удобны для построения сложных временных выражений (в том числе включающих веса и смещение), которые представляют собой константы или переменные (если эти переменные можно вычислить в момент выполнения). Наконец, как показано на рис. 2, временное выражение можно поместить внутрь временного ограничения, чтобы описать поведение системы во времени. Как и любые другие ограничения, они изображаются рядом с соответствующим сообщением или явно присоединяются с помощью связей зависимости.
Рис.2. Время
Вместо явного упоминания времени в выражениях стоит употреблять именованные константы, в особенности при моделировании сложных систем. Константы можно определить в одной части модели, а затем использовать в других местах. Тогда будет проще модифицировать модель, если временные требования к системе изменятся.
Распределенные системы по своей природе состоят из компонентов, физически рассредоточенных по разным узлам. Очень часто местоположение (location) компонентов фиксируется в момент установки системы. Но встречаются и такие системы, в которых компоненты мигрируют с одного узла на другой.
В UML вид системы с точки зрения размещения моделируется с помощью диаграмм размещения, описывающих топологию процессоров и устройств, на которых функционирует система. Артефакты, такие как исполняемые модули, библиотеки и таблицы, размещаются в этих узлах. Каждый экземпляр узла владеет собственными экземплярами тех или иных артефактов, а каждый экземпляр артефакта принадлежит ровно одному экземпляру узла (хотя различные экземпляры артефакта одного вида могут находиться на разных узлах).
Компоненты и классы могут быть материализованы в виде артефактов. Так, на рис. 3 класс LoadAgent (АгентЗагрузки) материализован в виде артефакта initializer.exe, который размещается на узле типа Router (Маршрутизатор).
Рис.3. Местоположение
Как видно из рисунка, моделировать положение артефакта в UML можно двумя способами. Во-первых, как в случае с Router, можно физически поместить элемент (его текстовое или графическое описание) в дополнительный раздел включающего узла. Во-вторых, вы можете использовать зависимость с ключевым словом "deploy" от артефакта к узлу, который его содержит.
На следующем шаге рассмотрим типичные приемы моделирования временных ограничений в UML.