Лабораторная работа №3


Тема: Создание имитационной модели «Стоянка маршрутного такси»

Цель: на примере имитационной модели «Стоянка маршрутного такси» реализовать задачу взаимного исключения

1. Постановка задачи

Задача взаимного исключения возникает в следующих случаях:

• при создании сложных программных мультипроцессных средств;

• для моделирования логики экономического (логистического) процесса.

Рассмотрим практическое решение такой задачи средст­вами Pilgrim на примере имитационной модели «Стоянка маршрут­ного такси».

Имеется остановка маршрутного такси. С определенными интер­валами времени на остановку приходят пассажиры и подъезжают машины такси. Такси уезжает, когда в машину сядут 10 пассажиров. Если пришедший пассажир не обнаруживает стоящей машины такси, то он встает в очередь на посадку. Когда такси подъезжает на пустую остановку (нет ни одного человека), машина ждет пассажиров. Если такси подъехало, а на остановке уже стоит другая машина, которая пришла раньше, то вновь пришедшая машина встает в очередь.

Принцип работы узла delet: вошедший в него транзакт семейства «такси» становится транзактом семейства «пассажиры», входящие следом. Как только в узел войдет заданное количество транзактов-пассажиров, они поглотятся, а транзакт «тележка» переходит в сле­дующий узел; транзакты, собранные в нее, перестают существовать как заявки на обслуживание в системе. Параметры модели представ­лены в таблице1.

Опишем работу модели. Генератор 7 (рисунок 1) создает транзак­ты, имитирующие пассажиров. Интервал прихода пассажиров в со­ответствии с теоремой о суперпозиции потоков событий имеет экспоненциальное распределение.

Интервал генерации транзактов, имитирующих такси, имеет нормальное распределение (обоснова­ние: маршрут такси состоит из множества отрезков, поэтому имеют место условия центральной предельной теоремы, даже если на мар­шруте несколько машин). Использование в описании генератора 8 нормального закона распределения интервала генерации означает, что время между приездами такси на остановку чаще оказывается ближе к своему среднему значению и реже — дальше от него (чем больше отклонение интервала от среднего, тем реже это бывает).

Таблица 1

Параметры имитационной модели

п/п

Параметр

Среднее значение

(минуты)

1.

Время

моделирования: 10 ч

600.0

2.

Интервал прихода

пассажиров

1.0

3.

Интервал приезда

такси

10.0

Узлы 1 и 5 имитируют соответственно очереди пассажиров и такси. Ключ 6 в начале работы модели находится в открытом со­стоянии (по умолчанию), а ключ 2 закрывается при приходе в оче­редь 1 первого транзакта-пассажира. Это делается для того, чтобы в узел delet первым вошел транзакт-такси, а не пассажир (иначе пас­сажир станет «тележкой»).

clip_image002

Рисунок 1- Схема модели взаимного исключения и координации процессов типа «производитель-потребитель»

Как только в delet войдет первый транзакт-такси, ключ 6 закры­вается, а ключ 2 одновременно с ним открывается. Теперь выходя­щие из генератора 6 транзакты-такси стоят в очереди 5, а транзакты-пассажиры заходят в узел delet (идет заполнение такси). Когда в узле delet накопятся 10 транзактов-пассажиров, транзакт-такси перейдет в терминатор (заполненное такси уедет). После этого ключ 6 открыва­ется, чтобы в delet мог зайти следующий транзакт-такси, а ключ 2 в это же время закрывается, чтобы транзакты-пассажиры стояли в очереди 1 до прихода в delet транзакта-такси.

Таким образом, ключи 2 и 6 в модели всегда находятся в проти­воположных состояниях: если один открыт, то другой закрыт. Тем самым чередуется доступ к узлу delet разных типов транзактов-такси и пассажиров.

Рассмотренный принцип «тележки» позволил эффективно ре­шить задачу взаимного исключения и координации процессов «про­изводитель-потребитель».

Текст модели в комментариях не нуждается:

#include <Pilgrim.h> // Модель

char commtext [81] = “АВТОизвозчик и Ко “; // Фирма

char lefttext [81] = “Минуты”; // Время в минутах

float win01 = 600.0; // Моделируем 10 часов

float win02 = 1.0; // Приходы пассажиров

float win03 = 10.0 // Поступление такси

char rightext[81] = “Рабочий день” // Интервал

float win11 = 0.0; // Резерв (окно 11)

forward

{

Parametr; // Диалог настройки

modbeg ("Стоянка такси", 8,

win01, (long) time (NULL) , none, l, none, 4,2);

ag ( "Запросы такси", 7, none, expo, win02, zero, zero, 1) ;

ag (‘Приходы такси", 8, none, norm, win03,win03/3, zero, 5 );

network (dummy, dummy)

{

top(l) : t->ft=l;

queue ("Очередь ", none, 2) ;

place;

top(2): if(addr[3]->tn == 1} // Такси подано?

rels(2); // Да: посадка

else

hold(2); // Нет: ожидаем

key("Есть такси?", 3) ;

place;

top(3): delet("Вход в такси", 1,1, 0,10, 4);

rels(2);

hold(6);

place;

top(4).: term(“Taкси уехало");

hold(2);

rels(6);

place;

top(5): queue("Такси ждет",none,6);

place;

top(6): key("Стоянка своб.?", З);

place;

fault(123);

}

modend("Result_taxi.doc",!,12,page);

return 0;

}

Нетрудно заметить, что в модели нет ни одного узла обслужива­ния (узлов типа serv или ргос с ненулевым временем обслуживания), но в очередях могут возникать существенные задержки.

Контрольные вопросы:

1. В чём заключается задача взаимного исключения?

2. Объясните принцип работы узла delet в данной задаче.

3. Опишите логику моделирования задачи взаимного исключения.

4. С помощью каких сигнальных функций можно управлять

клапанами key?

К сдаче лабораторной работы №3 необходимо:

1. Смоделировать с помощью графического конструктора Pilgrim задачу взаимного исключения на примере модели «Стоянка маршрутного такси».

2. Подготовить отчёт о проделанной работе.

3. Ответить на контрольные вопросы.

Загрузка...