Разработка модели теории массового обслуживания
26 Министерство информационных технологий и связи РФ Сибирский государственный университет телекоммуникаций и информатики Факультет информатики и вычислительной техники Кафедра вычислительных систем Курсовая работапо курсу МоделированиеВыполнили: Степанов Е.Е.Гордеев С.А.Гомзяков А.В.студенты гр.ВМ-37Проверил: Рудых Я.И.Новосибирск 2005Содержание1. Постановка задачи2. Описание модели в терминах PDEVS формализма3. Атомарные компоненты4. Полученные результаты5. Основные фрагменты кодаВывод1. Постановка задачиМодель состоит из трех обслуживающих серверов. Каждый сервер имеет очередь, в которой заявки могут ожидать своей очереди. Также есть генератор сообщений. Первая очередь бесконечная, остальные конечные. Обработки заявок всех серверов распределены экспоненциально. В начальный момент времени очереди. Необходимо построить модель в терминах PDEVS-формализма и произвести эксперименты над моделью с помощью пакета DEJaView.Необходимо ответить на следующие вопросы:1) Выдать статистику по всем очередям.2) Максимальную длину первой очереди.3) Сколько процентов сообщений прошло через очередь без задержек - «сквозняки».Рис. 1. Схематическое изображение модели2. Описание модели в терминах PDEVS формализмаВ PDEVS-модели существует 7 компонент:Queue1, Queue2 и Queue3 - это три очереди.Server1, Server2 и Server3 - это три прибора (сервера). Время обслуживания распределено экспоненциально.MessageGenerator - генератор сообщений.Рассмотрим более подробно логику работы компонент.1. Генератор подает сообщение в очередь Queue1.2. В начальный момент времени все серверы находятся в состоянии free (свободен). Cерверы Server1, Server2 посылают сообщение на очереди Queue2 и Queue3 соответственно, это говорит о готовности серверов принимать сообщения.3. Приняв сообщение каждая очередь подаёт сообщение на выход toNext и он приходит на вход fromPrev соответствующего каждой очереди сервера.4. Сервет меняет своё состояние с free (свободен) на busy (занят) и через некоторое время подаёт сообщение на выход toNext и после этого ждёт от следующей очереди подтверждения что в данной очереди ещё есть хотя бы одно место. 5. После того как сервер отправил сообщение слёдующей очереди, он переходит в состояние free (свободен) и посылает предыдущей очереди сообщение, которое говорит о готовности сервера принимать следующее сообщение.6. Также существует возможность перехода сообщения с Серверов в очередь Queue1 с вероятностями P1, P2, P3.3.Атомарные компоненты|
Класс атомарной компоненты | Объекты класса атомарной компоненты | Возможные состояния компоненты | Входные порты | Выходные порты | | Server1 | Server1 | Free, Busy | FromPrev,FromNext | ToPrev,toNext,Vozvrat | | Server2 | Server2 | Free, Busy | FromPrev,FromNext | ToPrev,toNext,Vozvrat | | Server3 | Server3 | Free, Busy | FromPrev,FromNext | ToPrev,Vozvrat | | Queue1 | Queue1 | Free, Full | FromPrev,FromNext,Vozvrat | ToPrev,toNext | | Queue2 | Queue2 | N=={1,2,3,4,5} | FromPrev,FromNext | ToPrev,toNext | | Queue3 | Queue3 | N=={1,2,3,4,5} | FromPrev,FromNext | ToPrev,toNext | | | Алгоритмы функционирования компонент:Компоненты классов Server1 и Server2:Delta_int:Остаемся в текущем состоянииDelta_expЕсли (пришел новый пакет от очереди) {переходим в состояние “busy”}LambdaЕсли(Сообщение от предыдущей очереди){Если пакет обработан, то пытаемся отправить его следующей очереди.Случайно определяем куда пойдёт сообщение - или в начало цепи, или в следующую очередь.Отсылаем предыдущей очереди уведомление о том что сервер освободился.}Компоненты класса Queue2,Queue3:Delta_int:остаемся в текущем состоянииDelta_expЕсли (пришёл новый пакет){ Если (Флаг ожидания, ожидания освобождения сервера) {Увеличиваем счётчик поступивших пакетов на 1Так же выполняем действия необходимые для вычисления средней длины очереди}ИначеЕсли (Очередь не ждёт освобождения сервера ){«Сквозняк»Выполняем действия по вычислению доли сквозняков}ИначеЕсли (пришло сообщение от сервера){Флаг готовности сервера ставим в значение истина}LambdaЕсли (пришёл новый пакет){Если (Сервер свободен){Отсылаем сообщение серверу«Сквозняк»Выполняем операции по вычислению доли сквозняков}Если (Ожидаем сервер){Если очередь переполнилась посылаем сообщение серверу}}Если (пришло сообщение от сервера){Если(Очередь не пуста){Посылаем пакет на порт toNext очередиУменьшаем длину очереди на 1}}Компоненты классов Server3:Delta_int:Остаемся в текущем состоянииDelta_expЕсли (пришел новый пакет от очереди) {переходим в состояние “busy”}LambdaЕсли (сообщение от предыдущей очереди){Если пакет обработан, то пытаемся отправить его следующей очереди.Случайно определяем куда пойдёт сообщение - или в начало цепи, или на выход из цепи.Отсылаем уведомление предыдущей очереди о том, что сервер освободился.}Компонент класса Queue1:Delta_int:остаемся в текущем состоянииDelta_expЕсли (пришёл новый пакет(или из цепи, или из генератора сообщений)){ Если (Флаг ожидания, ожидания освобождения сервера){Увеличиваем счётчик поступивших пакетов на 1Выполняем действия по нахождению макс максимальной длины очереди}ИначеЕсли (Сервер свободен ){«Сквозняк»Выполняем действия по вычислению доли сквозняков}ИначеЕсли (пришло сообщение от сервера){Флаг готовности сервера ставим в значение истина}LambdaЕсли( пришёл новый пакет(из генератора или из цепи) ){Если (Сервер свободен){Отсылаем сообщение серверу«Сквозняк»Выполняем операции по вычислению доли сквозняков}Если (Ожидаем сервер){}}Если (пришло сообщение от сервера){Если(Очередь не пуста){Посылаем пакет на порт toNext очередиУменьшаем длину очереди на 1Выполняем действия по вычислению максимальной длины очереди}}Компонент класса: MessageGenerator.Если(пришло системное сообщение){Отправляем сообщение первой очередиУвеличиваем число сгенерированных сообщений на 1}4. Полученные результатыРис. 3. Результаты работы модели5. Основные фрагменты кода1.QueueModel.javapackage DEJaView.modelLibs.a;import DEJaView.modelLibs.a.MessageGenerator;import DEJaView.modelLibs.a.Queue1;import DEJaView.modelLibs.a.Server1;import DEJaView.modelLibs.a.Queue2;import DEJaView.modelLibs.a.Server2;import DEJaView.modelLibs.a.Queue3;import DEJaView.modelLibs.a.Server3;import DEJaView.core.*;import java.util.*;public class QueueModel extends MULC { public static void main(String args[]) { MULC queuemodel = new MULC("queuemodel"); MessageGenerator MessageGenerator1 = new MessageGenerator("MessageGenerator1"); Queue1 Queue1 = new Queue1("Queue1"); Queue2 Queue2= new Queue2("Queue2"); Queue3 Queue3= new Queue3("Queue3"); Server1 Server1 = new Server1("Server1"); Server2 Server2=new Server2("Server2"); Server3 Server3=new Server3("Server3"); queuemodel.AddComponent(MessageGenerator1); queuemodel.AddComponent(Queue1); queuemodel.AddComponent(Queue2); queuemodel.AddComponent(Queue3); queuemodel.AddComponent(Server1); queuemodel.AddComponent(Server2); queuemodel.AddComponent(Server3); MessageGenerator1.addOutPort("toQueue","toQueue"); Queue1.addInPort("fromMessageGenerator","fromMessageGenerator"); Queue1.addInPort("fromNext","fromNext"); Queue1.addInPort("Vozvrat","Vozvrat"); Queue1.addOutPort("toNext","toNext"); Queue2.addInPort("fromPrev","fromPrev"); Queue2.addInPort("fromNext","fromNext"); Queue2.addOutPort("toPrev","Prev"); Queue2.addOutPort("toNext","toNext"); Queue3.addInPort("fromPrev","fromPrev"); Queue3.addInPort("fromNext","fromNext"); Queue3.addOutPort("toPrev","toPrev"); Queue3.addOutPort("toNext","toNext"); Server1.addInPort("fromPrev","fromPrev"); Server1.addOutPort("toPrev","toPrev"); Server1.addOutPort("toNext","toNext"); Server1.addOutPort("Vozvrat","Vozvrat"); Server1.addInPort("fromNext","fromNext"); Server2.addInPort("fromPrev","fromPrev"); Server2.addOutPort("toPrev","toPrev"); Server2.addOutPort("toNext","toNext"); Server2.addOutPort("Vozvrat","Vozvrat"); Server2.addInPort("fromNext","fromNext"); Server3.addInPort("fromPrev","fromPrev"); Server3.addOutPort("toPrev","toPrev"); Server3.addOutPort("Vozvrat","Vozvrat"); queuemodel.getIC().addCouple("MessageGenerator1","toQueue","Queue1","fromMessageGenerator"); queuemodel.getIC().addCouple("Queue1","toNext","Server1","fromPrev"); queuemodel.getIC().addCouple("Server1","toNext","Queue2","fromPrev"); queuemodel.getIC().addCouple("Server1","Vozvrat","Queue1","Vozvrat"); queuemodel.getIC().addCouple("Server1","toPrev","Queue1","fromNext"); queuemodel.getIC().addCouple("Queue2","toPrev","Server1","fromNext"); queuemodel.getIC().addCouple("Queue2","toNext","Server2","fromPrev"); queuemodel.getIC().addCouple("Server2","toNext","Queue3","fromPrev"); queuemodel.getIC().addCouple("Server2","Vozvrat","Queue1","Vozvrat"); queuemodel.getIC().addCouple("Server2","toPrev","Queue2","fromNext"); queuemodel.getIC().addCouple("Queue3","toPrev","Server2","fromNext"); queuemodel.getIC().addCouple("Queue3","toNext","Server3","fromPrev"); queuemodel.getIC().addCouple("Server3","Vozvrat","Queue1","Vozvrat"); queuemodel.getIC().addCouple("Server3","toPrev","Queue3","fromNext"); queuemodel.init(); Date d1 = new Date(); double time =10000.0; while ( !(queuemodel.getLocalTime()>time)) { queuemodel.getProcessor().Simulate(); } System.out.println("Пакетов отправлено: " +MessageGenerator1.num); System.out.println("Число отказов во 2 ой очереди: " +Queue2.numOfRej); System.out.println("Число отказов в 3 ей очереди: " +Queue3.numOfRej); /*System.out.println("Осталось в первой очереди " +Queue1.numOfMessages);*/ System.out.println("Число возвратов с первого сервера " +Server1.vozvrat); System.out.println("Число возвратов со второго сервера " +Server2.vozvrat); System.out.println("Число возвратов с третьего сервера " +Server3.vozvrat); System.out.println("Число возвратов в первую очередь " +Queue1.vozvrat); System.out.println("Средняя длина 2 ой очереди " +(double)Queue2.Dlina/(double)Queue2.Chislo); System.out.println("Средняя длина 3 ей очереди " +(double)Queue3.Dlina/(double)Queue3.Chislo); System.out.println("Максимальная длина 1 ой очереди " +Queue1.max); System.out.println("Процент сквозняков в первой очереди "+(double)Queue1.skvoz*100/(double)Queue1.num +"%"); System.out.println("Процент сквозняков во второй очереди "+(double)Queue2.skvoz*100/(double)Queue2.num +"%"); System.out.println("Процент сквозняков в третей очереди "+(double)Queue3.skvoz*100/(double)Queue3.num +"%"); Date d2=new Date(); long d = d2.getTime()-d1.getTime(); System.out.println("Время моделирования:" +d); } } 2.Queue1.java. package DEJaView.modelLibs.a; import DEJaView.core.*; import java.util.*; /** Класс, реализующий работу очереди сообщений (требований) */
Страницы: 1, 2
|