2. Язык UML. Руководство пользователя. Буч_ Рамбо_ Якобсон (2-е издание) (2006) (1185732), страница 66
Текст из файла (страница 66)
В системе, где есть одновременно активные и пассивные объекты, следует рассматривать четыре возможных комбинации.ВоFпервых, сообщение может быть передано одним пассивнымобъектом другому такому же. Если предположить, что в любой момент времени существует лишь один поток управления, проходящий через оба объекта, такое взаимодействие – не что иное, какпростой вызов операции.ВоFвторых, сообщение может быть передано от одного активногообъекта другому активному. Здесь можно говорить о межпроцесснойкоммуникации, которая может осуществляться двумя способами.В первом варианте некоторый активный объект может синхронновызывать операцию другого.
Такой способ имеет семантику рандеву:вызывающий объект затребует выполнение операции и ждет, пока принимающая сторона получит вызов, выполнит некоторую операцию342Процессы и потокии вернет некоторый объект (если есть что возвращать); затем обаобъекта продолжают работать независимо друг от друга. В течениевсего времени выполнения вызова оба потока управления будутблокированы. Во втором варианте один активный объект можетасинхронно послать сигнал другому или вызвать его операцию.
Семантика такого способа напоминает почтовый ящик (mailbox): вызывающая сторона посылает сигнал или вызывает операцию, послечего продолжает работу. Тем временем получающая сторона принимает сигнал или вызов, как только будет к этому готова. Пока онаобрабатывает запрос, все вновь поступающие события или вызовыставятся в очередь.
Отреагировав на запрос, принимающий объектпродолжает свою работу. Семантика почтового ящика проявляетсяв том, что оба объекта не синхронизированы – просто один оставляет сообщение для другого.В UML синхронное сообщение изображается закрашеннойстрелкой, а асинхронное – обычной (см. рис. 23.2).Рис. 23.2. КоммуникацияВFтретьих, сообщение может быть передано от активного объекта пассивному. Трудности возникают в случае, когда сразу несколькоактивных объектов передают свой поток управления одному и томуже пассивному. В такой ситуации следует очень аккуратно моделировать синхронизацию потоков, о чем мы поговорим в следующемразделе.ОграниченияВFчетвертых, пассивный объект может передавать сообщеобсуждают- ния активному.
На первый взгляд это может показаться некорся в главе 6.ректным, но если вспомнить, что каждый поток управления принадлежит некоторому активному объекту, то становится ясно,что передача пассивным объектом сообщения активному имеетБазовые понятия343ту же семантику, что и обмен сообщениями между двумя активными объектами.На заметку. С помощью ограничений можно моделироватьразличные вариации посылки синхронных и асинхронных сообщений. Например, для моделирования отложенного рандеву,имеющегося в языке Ada, можно воспользоваться синхронным сообщением с ограничением в формате {wait=0}, котороеговорит о том, что вызывающий объект не будет дожидатьсяполучателя.
Можно смоделировать таймQаут с помощью ограничения в формате {wait=1ms}, которое говорит, что вызывающий объект будет ждать приема сообщения получателемне более одной миллисекунды.СинхронизацияПопробуйте на секунду представить себе многочисленные потоки управления в параллельной системе. Когда поток проходитчерез некоторую операцию, мы говорим, что эта операция являетсяточкой выполнения. Если операция определена в некотором классе, то можно сказать, что точкой выполнения является конкретныйэкземпляр этого класса. В одной операции (и, стало быть, в одном объекте) могут одновременно находиться несколько потоковуправления, а бывает и так, что разные потоки находятся в разныхоперациях, но все же в одном объекте.Проблема возникает тогда, когда в одном объекте находятсясразу несколько потоков управления.
Если не проявить осторожность, то более чем один поток может модифицировать один и тотже атрибут, что приведет к некорректному изменению состоянияобъекта или потере информации. Это классическая проблема взаимного исключения. Ошибки при обработке такой ситуации могутстать причиной различных видов конкуренции между потокамии их взаимной интерференции, что проявляется в таинственныхи не подающихся воспроизведению сбоях параллельной системы.Ключ к решению проблемы – сериализация доступа к критическому объекту. У данного подхода есть три разновидности, сутькаждой из которых заключается в присоединении к операциям,определенным в классе, некоторых синхронизирующих свойств.UML позволяет моделировать все три возможности:1. Sequential (последовательная) – вызывающие стороны должны координировать свои действия еще до входа в вызываемый объект, так что в любой момент времени внутри объекта находится ровно один поток управления.
При наличииПроцессы и потоки344нескольких потоков управления не могут гарантироватьсясемантика и целостность объекта;2. Guarded (защищенная) – семантика и целостность объекта гарантируются при наличии нескольких потоков управленияпутем упорядочения вызовов всех защищенных операцийобъекта. По существу, в каждый момент времени может выполняться одна операция над объектом, что сводит такойподход к последовательному.
При этом существует опасность взаимной блокировки;3. Concurrent (параллельная) – семантика и целостность объектапри наличии нескольких потоков управления гарантируетсяза счет отделения операций изменения данных от операцийчтения. Это достигается благодаря тщательному соблюдению правил проектирования.Некоторые языки программирования поддерживают перечисленные конструкции непосредственно. Так в языке Java есть свойство synchronized, эквивалентное свойству concurrent в UML.
В любомязыке, поддерживающем параллельность, все три подхода можнореализовать с помощью семафоров (semaphores).Ограничения обсуждаются в главе 6.На рис. 23.3 показано, как эти свойства присоединяются к операции, – путем применения нотации, принятой в UML для ограничений. Обратите внимание, что одновременность должна бытьобъявлена отдельно как для каждой операции, так и для целого объекта. Объявление одновременности для операции означает беспроблемное единовременное выполнение ее многочисленных вызовов.Объявление одновременности для объекта позволяет вызовам разных операций выполняться одновременно и без ошибок.
Это болеестрогое условие.Рис. 23.3. СинхронизацияНа заметку. С помощью ограничений можно моделироватьразличные вариации примитивов синхронизации. Например,можно модифицировать свойство concurrent, разрешив наличие нескольких читателей, но только одного писателя.Типичные приемы моделирования345Типичные приемы моделированияМоделирование множества потоковуправленияМеханизмыобсуждаются в главе 29,диаграммыклассов –в главе 8,диаграммывзаимодействия –в главе 19.Представленияпроцессовобсуждаются в главе 19,классы –в главах 4 и 9,связи – в главах 5 и 10.Построение системы с несколькими потоками управления – непростая задача. Надо не только решить, как распределить работумежду параллельными активными объектами, но и продумать механизмы коммуникации и синхронизации между активными и пассивными объектами в системе, гарантирующие правильность их поведения в присутствии нескольких потоков управления. Поэтомуполезно визуализировать способы взаимодействия этих потоков.В UML это можно сделать с помощью диаграмм взаимодействия(для описания динамической семантики), в которых участвуют активные классы и объекты.Для моделирования нескольких потоков управления потребуется: Идентифицировать возможности распараллеливания действий и материализовать каждый поток управления в виде активного класса.
Сгруппировать общие множества активныхобъектов в активный класс. Важно избегать усложнения системы вследствие слишком большого количества параллельных потоков управления. Рассмотреть баланс распределения обязанностей между этимиактивными классами, а затем исследовать, с какими другимиактивными и пассивными классами статически кооперируется каждый из них.
Убедиться, что каждый активный классимеет внутреннюю структуру с высокой степенью сцепления и слабо связан с соседними классами, и что для каждогокласса правильно выбран набор атрибутов, операций и сигналов. Отобразить статические решения в виде диаграмм классов,явно выделив каждый активный класс. Рассмотреть, как каждая группа классов динамически кооперируется с прочими. Отобразить свои решения на диаграммах взаимодействия.
Явно показать активные объектыкак начальные точки соответствующих потоков управления.Идентифицировать каждую связанную последовательность,присваивая ей имя активного объекта. Обратить особое внимание на коммуникации между активными объектами, по мере необходимости пользуясь как синхронными, так и асинхронными сообщениями.346Процессы и потоки Обеспечить синхронизацию активных объектов и тех пассивных объектов, с которыми они кооперируются. Применяйте наиболее подходящую семантику – последовательную, защищенную или параллельную.На рис. 23.4 показана часть представления трейдерской системыс точки зрения процессов.
Вы видите три объекта, которые параллельно питают систему информацией: StockTicker (БиржевойТикер),IndexWatcher (НаблюдательИндекса) и CNNNewsFeed (НовостнаяЛентаCNN), названные соответственно s, i и c. Два из них, s и I, обмениваются каждый со своим экземпляром класса Analyst (Аналитик) –а1 и а2. В рамках этого небольшого фрагмента модели класс Analystможет быть спроектирован в упрощенном виде – из расчета на то,что в каждый момент времени в любом из его экземпляров можетбыть активен только один поток управления. Однако оба экземпляра класса Analyst одновременно общаются с объектом AlertManager(ДиспетчерОповещений), которому мы дали имя m. Следовательно,m необходимо спроектировать так, чтобы он сохранял свою семантику в присутствии нескольких потоков управления.
Объекты mи c одновременно общаются с t – объектом класса TradingManager (МенеджерПоПродажам). Каждому соединению присвоен порядковыйномер, определяемый тем, какой поток управления им владеет.На заметку. Диаграммы взаимодействия, подобные представленной выше, полезны для визуализации тех мест, где двапотока управления могут пересекаться и где, следовательно,необходимо обратить особое внимание на проблемы коммуникации и синхронизации. С помощью инструментальныхсредств допускается реализация дополнительных визуальныхметок – например, раскрашивание потоков в разные цвета.Рис. 23.4.