- •Пример системы управления лифтами
- •1. Описание задачи
- •2. Модель прецедентов
- •2.1. Прецедент «Выбор Этажа Назначения»
- •2.2. Прецедент «Вызов Лифта»
- •2.3. Абстрактные прецеденты
- •2.4. Абстрактный прецедент «Остановка Лифта на Этаже»
- •2.5. Абстрактный прецедент «Планирование Лифта»
- •2.7. Конкретный прецедент «Вызов Лифта»
- •18.3. Статическая модель предметной области
- •2.6. Конкретный прецедент «Выбор Этажа Назначения»
- •5. Динамическая модель
- •5.1. Диаграмма кооперации для прецедента «Выбор Этажа Назначения»
- •5.2. Диаграмма кооперации для прецедента «Вызов Лифта»
- •5.3. Диаграмма кооперации для прецедента «Остановка Лифта на Этаже»
- •5.4. Абстрактный прецедент «Отправить Лифт»
- •6. Модель состояний
- •7. Консолидация диаграмм кооперации
- •8. Разбиение на подсистемы
- •9. Разбиение системы на задачи
- •9.1. Выделение задач в подсистеме лифта
- •9.2. Выделение задач в подсистеме этажа
- •9.3. Выделение задач в подсистеме планировщика
- •9.4. Определение интерфейсов задач
- •9.5. Проектирование класса абстрагирования данных
- •9.6. Обсуждение альтернативных архитектур
- •10. Проект распределенной системы управления лифтами
- •10.1. Структура подсистемы лифта
- •10.2. Структура подсистемы этажа
- •10.3. Структура подсистемы планировщика
- •10.4. Интерфейсы подсистем
- •11. Проектирование скрывающих информацию классов
- •11.1. Проектирование классов интерфейса устройств
- •11.2. Проектирование класса, зависящего от состояния
- •12. Разработка детального проекта программы
- •12.1. Проектирование объектов-разъемов для лифта
- •12.2. Проектирование составных задач
- •13. Конфигурирование целевой системы
- •14. Анализ производительности нераспределенной системы управления лифтами
- •14.1. Сценарий для анализа производительности
- •14.2. Последовательности событий
- •14.3. Назначение приоритетов
- •14.4. Планирование в реальном времени для нераспределенной архитектуры
- •14.5. Последовательность событий «Остановка Лифта на Этаже»
- •14.6. Последовательность событий «Выбор Этажа Назначения»
- •14.7. Последовательность событий «Вызов Лифта»
- •15. Анализ производительности распределенной системы управления лифтами
- •15.1. Сценарий для анализа производительности
- •15.2. Планирование в реальном времени для распределенной архитектуры
- •15.3. Последовательность событий «Остановка Лифта на Этаже»
- •15.4. Последовательность событий «Выбор Этажа Назначения»
- •15.5. Последовательность событий «Вызов Лифта»
9. Разбиение системы на задачи
Далее рассматривается разбиение на задачи. Для этого необходимо проанализировать все объекты на диаграммах кооперации и применить критерии выделения задач. Мы сделаем это для каждой диаграммы по очереди.
В распределенной системе управления лифтами имеется по одному экземпляру Подсистемы Лифта для каждого лифта и по одному экземпляру Подсистемы Этажа для каждого этажа (см. рис.15). Но, если трактовать систему как нераспределенную, можно кое-что упростить. В данном случае система управления лифтами отображается на один процессор или сильно связанную многопроцессорную конфигурацию (с общей памятью).
Важным аспектом нераспределенного решения является то, что сущностный объект Состояние и План Движения Лифта доступен всем лифтам, равно как и Планировщику, то есть его можно расположить в централизованном хранилище данных. Для слабо связанной распределенной системы, в которой нет разделяемой памяти, этот подход не годится. Распределенное решение опишем в разделе 10.
Рис.18. Уточненная статическая модель системы управления лифтами
9.1. Выделение задач в подсистеме лифта
Рассмотрим архитектуру задач Подсистемы Лифта для нераспределенного случая.
На диаграмме кооперации Выбор Этажа Назначения (см. рис.5) нужно обратить внимание на объект интерфейса устройства, который получает входную информацию от актера, и затем проследить цепочку взаимодействий. Объект Интерфейс Кнопки Лифта выделяется в самостоятельную задачу Интерфейс Кнопок Лифта с помощью критерия асинхронного интерфейса устройства ввода. Применив инверсию задач, мы проектируем одну задачу, которая будет отвечать за все кнопки лифта, вместо того чтобы иметь по одной задаче на каждую кнопку. Задача Интерфейс Кнопок Лифта активизируется прерыванием, возникающим при нажатии любой кнопки. Затем она считывает входную информацию от кнопки и посылает запрос Диспетчеру Лифта, а сама тем временем готовится к приходу следующего прерывания. Диспетчер Лифта, который является объектом-координатором, получает сообщения от Интерфейса Кнопок Лифта в данном прецеденте и от Планировщика в прецеденте Вызов Лифта (см. рис.6). Он выделяется в координирующую задачу, активизируемую приходом сообщения Запрос Планировщика или Запрос Лифта. Состояние и План Движения Лифта - это пассивный объект абстрагирования данных, у которого нет своего потока управления.
Рассмотрим далее прецедент Остановка Лифта на Этаже на рис.7. Объект Интерфейс Датчика Прибытия становится асинхронной задачей интерфейса устройства ввода - Интерфейс Датчиков Прибытия - по тем же причинам, что и в случае с задачей Интерфейс Кнопок Лифта. Он посылает номер этажа объекту Управление Лифтом, о котором речь пойдет ниже.
Разберем диаграмму состояний Управление Лифтом на рис.13. Здесь есть зависящий от состояния управляющий объект, который исполняет диаграмму состояний. На этапе анализа все аспекты физического объекта «лифт», связанные с управлением, были отображены на управляющий объект Управление Лифтом (см. рис.7 и 9). Если имеется несколько лифтов, то управляются они независимо, так что в модели присутствует по одному такому объекту для каждого лифта. В ходе разбиения на задачи каждый объект Управление Лифтом отображается на отдельную задачу Контроллер Лифта. Любая задача исполняет диаграмму состояний для своего лифта, как показано на рис.13.
Задача Контроллер Лифта взаимодействует с несколькими объектами интерфейса устройств вывода, которые работают непосредственно с внешней средой, в частности с мотором, дверью и лампочками лифта. Все эти устройства пассивны (то есть не генерируют прерываний), следовательно, асинхронные задачи не нужны. Каждый запрос на вывод информации выполняется по требованию, поэтому не нужны и периодические задачи. Кроме того, вызывающая задача обязана дожидаться завершения вывода, поэтому нет необходимости и в пассивной задаче вывода. Таким образом, объект вывода на устройство не стоит выделять в самостоятельную задачу, он объединяется с задачей Контроллер Лифта в соответствии с критерием группировки задач. Например, если Контроллер Лифта инициирует действие Закрыть Дверь, он ждет ответа Дверь Закрыта, поскольку лифт не может начать движение, пока дверь не закроется.
Рассмотрим выполнение задачи Контроллер Лифта подробнее. Она получает сообщение Приближается к Этажу, находясь в состоянии Лифт Едет (см. рис.8). Затем Контроллер Лифта посылает сообщение объекту Состояние и План Движения Лифта, требуя Проверить Этот Этаж. Состояние изменяется только в том случае, если в соответствии с планом лифт должен остановиться на данном этаже. При этом объект Состояние и План Движения Лифта отправляет сообщение Приближается к Нужному Этажу, которое переводит Контроллер Лифта в состояние Лифт Останавливается и инициирует действие Стоп. Объекту Интерфейс Мотора передается сообщение Стоп (см. рис.7). Контроллер Лифта выходит из этого состояния только при получении ответа Лифт Остановился от Интерфейса Мотора. Таким образом, Контроллер Лифта и Интерфейс Мотора неспособны работать одновременно. Аналогичный анализ показывает, что одновременно не могут исполняться также объекты Контроллер Лифта и Интерфейс Двери. Следовательно, на основе критерия группировки задач допустимо объединить объекты Интерфейс Мотора и Интерфейс Двери с задачей Контроллер Лифта.
Диспетчер Лифта (всего один экземпляр в нераспределенном решении) реализуется асинхронно по отношению к задаче Контроллер Лифта, так как запрос к лифту может прийти в любой момент. Поэтому Диспетчер Лифта вычленяется в отдельную задачу-координатор, которая активизируется асинхронно по событию Запрос Лифта или Запрос Планировщика и обычно исполняется независимо от задачи Контроллер Лифта. Единственное взаимодействие между двумя задачами возникает, когда лифт находится в состоянии Стоит и поступает новый запрос. В этом случае Диспетчер Лифта активизирует задачу Контроллер Лифта.
Итак, в нераспределенной системе управления лифтами Подсистема Лифта разбивается на четыре задачи: Интерфейс Кнопок Лифта, Интерфейс Датчиков Прибытия, Диспетчер Лифта и Контроллер Лифта. Имеется по одному экземпляру первых трех задач и столько экземпляров четвертой задачи, сколько есть лифтов. Все экземпляры задачи Контроллер Лифта идентичны и исполняют собственную копию диаграммы состояний Управление Лифтом. Предварительная архитектура задач изображена на начальной диаграмме параллельной кооперации (рис.19).
