Рефераты - Афоризмы - Словари
Русские, белорусские и английские сочинения
Русские и белорусские изложения

Моделирование работы узла коммутации сообщений

Работа из раздела: «Программирование, компьютеры и кибернетика»

/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

федеральное государственное автономное образовательное учреждение

высшего профессионального образования

Национальный исследовательский ядерный университет «МИФИ»

Факультет Кибернетики

Кафедра «Информатика и процессы управления» (№ 17)

ОТЧЕТ по лабораторным работам

по курсу 'Математическое моделирование'

Выполнил студент группы К8-172 Кузин А.А.

Москва 2012

Задание

Узел коммутации сообщений (УКС) состоит из входного буфера, процессора и двух выходных линий с двумя буферами, по одному на входе каждой линии. В УКС через интервалы времени 15±7 мс поступают сообщения двух типов. Все сообщения сначала помещаются во входной буфер УКС, а затем поочередно обрабатываются процессором, независимо от их типа. Время обработки одного сообщения в процессоре равно 7 мс. После обработки процессором сообщения первого типа передаются по первой выходной линии, а сообщения второго типа - по второй выходной линии. Время передачи сообщения по любой выходной линии равно 15±5 мс. Поскольку по каждой выходной линии не может одновременно передаваться более одного сообщения, то сообщения первого типа предварительно поступают в буфер перед первой выходной линией, а второго типа - в буфер перед второй выходной линией. Применяемый метод контроля потоков сообщений требует одновременного присутствия в каждом буфере выходных линий не более трех сообщений. При полном заполнении буфера поступающее в УКС сообщение соответствующего типа получает отказ.

Смоделировать работу УКС в течение 10 секунд. Определить параметры загрузки устройств и вероятность отказа в обслуживании сообщений из-за возможности переполнения буферов выходных линий.

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

События:

P13 - новое сообщение

P1 - сгенерировано сообщение 1го типа

P2 - сгенерировано сообщение 2го типа

P3 - ожидание в буфере сообщений

P4 - обработка сообщений (CPU)

P5 - наличие места в буфере передачи 2

P6 - требование типа сообщения 2

P7 - наличие места в буфере передачи 1

P8 - требование типа сообщения 1

P9 - ожидание в буфере передачи 1

P10 - ожидание в буфере передачи 2

P11 - передано сообщения 1го типа

P12 - передано сообщения 2го типа

Переходы:

T10 - начало обработки сообщения

t1 - определение типа сообщения 1

t2 - определение типа сообщения 2

t3 - поступление на обработку в CPU

t4 - конец обработки и поступление в буфер передачи 1 сообщения 1

t5 - конец обработки и поступление в буфер передачи 2 сообщения 2

t6 - начало передачи сообщения 1

t7 - начало передачи сообщения 2

t8 - конец передачи сообщения 1

t9 - конец передачи сообщения 2

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

CDC = < D,X,{Sa},Y,{Ia},{Fa}, , >

Переменные

Входные переменные

X - тип сообщений, X ? {1, 2} ? {?};

Переменные состояния

g1 - состояние CPU, g1 ? {0, 1}, где 0 - не занят, 1 - занят

g2 - количество сообщений во входном буфере

g3i - количество сообщений в i-м буфере передачи

g4 - тип последнего сообщения, g4 ? {1, 2}

g5i - сумма времен ожидания сообщений i-го типа в i-й очереди на передачу

g6i - количество переданных сообщений по i-й линии

g7 - количество обработанных сообщений

g8 - количество поступивших сообщений

Выходные переменные

y1 - среднее время ожидания сообщений в очереди на обработку

y2i - среднее время ожидания сообщений i-го типа в очереди на передачу

y3 - количество поступивших сообщений

y4 - количество обработанных сообщений

y5 - вероятность отказа

y6 - загрузка всего оборудования

y7i - загрузка i-й линии

Процессы

P1 - генерация сообщений 1 и 2 типов

P2 - обработка сообщений

P3 - отправка сообщения 1го типа

P4 - отправка сообщения 2го типа

P5 - обработка информации

События

C1 - поступление сообщения

C2 - начало обработки сообщения

C3i - окончание обработки сообщения i-го типа

C4i - начало передачи сообщения i-го типа

C5i - завершение передачи сообщения i-го типа

C6 - формирование результатов моделирования

Описание D и Sa

D = {P1, P2, P3, P4, P5 }

Sp1 = {x}

Sp2 = {g1, g2, g31, g32, g4, g7}

Sp3 = {g31, g51, g61}

Sp4 = {g32, g52, g62}

Sp5 = {g51, g52, g61, g62, g7, g8, y1, y21, y22, y3, y4, y5, y6, y71, y72}

Отчет о моделировании

Время моделирования - 10 секунд

Поступило: 669 сообщений

Обработано: 34 (5.08%)

Вероятность отказа: 94.8%

Среднее время ожидания во входном буфере: 0.00с

Среднее время ожидания в очереди на передачу 1: 38.86мс

Среднее время ожидания в очереди на передачу 2: 40.43мс

Загрузка CPU: 2.38%

Загрузка линии передачи 1: 1.07%

Загрузка линии передачи 1: 2.91%

Листинг

unit userdef;

interface

uses SysUtils;

// -----------------------Изменяемая часть-----------------------------------

procedure Message1;

procedure Obrab;

procedure Send1;

procedure Send2;

procedure UserInit;

procedure UserStat;

function UserCheck: boolean;

procedure start;

implementation

uses prog,main;

type MsgSpec =

record

Kind: integer;

inTime: integer;

end;

var

LBase: BaseQueue;

SQueue1, SQueue2: BaseQueue;

X: integer;

Msg: MsgSpec;

узел коммутация сообщение буфер

Tobrab,Obrabot, Otkaz, Vsego,Twait,Twork, TSend1, TSend2, TwaitSend1, TwaitSend2,TobrabSend1, TobrabSend2, TworkSend1, TworkSend2, ObrabotSend1, ObrabotSend2, inq1, inq2: integer;

{$F+}

procedure Message1;

begin

form1. RichEdit1. Lines. Clear;

X: =Random (2) +1;

form1. richedit1. Lines. add (' Поступило сообщение типа '+inttostr (x) +'. ');

Shedull (Time+RangeRnd (15,7),P1);

Msg. Kind: =X;

Msg. inTime: =Time;

AddQueue (LBase,@Msg);

Vsego: =Vsego+1;

form1. richedit1. Lines. add (' Длина очереди: '+inttostr (LBase. Length));

Shedull (Time,P2);

end;

procedure Obrab;

var

MsgPtr: ^MsgSpec;

t: integer;

begin

form1. RichEdit1. Lines. Clear;

form1. richedit1. Lines. add (' Длина очереди: '+inttostr (LBase. Length));

if Tobrab<=Time then { т. е свободен }

if LBase. Length>0 then { очередь не пуста }

begin

form1. richedit1. Lines. add ('CPU взял 1 сообщение и начал обработку. ');

MsgPtr: = OutQueue (LBase);

Twait: =Twait+Time-MsgPtr^. inTime;

t: =7; // RangeRnd (7,1);

if MsgPtr^. Kind=1 then

begin

if SQueue1. Length<3 then

begin

Tobrab: =Time+t;

Twork: =Twork+t;

MsgPtr^. inTime: = TObrab;

AddQueue (SQueue1,MsgPtr);

Shedull (Tobrab,P3);

form1. richedit1. Lines. add (' Сообщение 1 типа отправлено в буфер передачи. ');

Obrabot: =Obrabot+1;

end

else

begin

Shedull (Tobrab,P2);

form1. richedit1. Lines. add (' Сообщение 1 типа получило отказ. ');

inc (Otkaz);

end;

end

else

begin

if SQueue2. Length<3 then

begin

Tobrab: =Time+t;

Twork: =Twork+t;

MsgPtr^. inTime: = TObrab;

AddQueue (SQueue2,MsgPtr);

Shedull (Tobrab,P4);

form1. richedit1. Lines. add (' Сообщение 2 типа отправлено в буфер передачи. ');

Obrabot: =Obrabot+1;

end

else

begin

Shedull (Tobrab,P2);

form1. richedit1. Lines. add (' Сообщение 2 типа получило отказ. ');

inc (Otkaz);

end;

end;

{FreeMem (MsgPtr,LBase. Size); }

{Shedull (Tobrab,P3); }

end

else form1. richedit1. Lines. add ('CPU простаивает. ')

else form1. richedit1. Lines. add ('CPU занят. ')

end;

procedure Send1;

var

MsgPtr: ^MsgSpec;

t: integer;

begin

form1. RichEdit1. Lines. Clear;

form1. richedit1. Lines. add (' Длина очереди передачи 1: '+inttostr (SQueue1. Length));

if TObrabSend1<=Time then

if SQueue1. Length>0 then { очередь не пуста }

begin

form1. richedit1. Lines. add ('Началась передача сообщения по линии 1. ');

MsgPtr: = OutQueue (SQueue1);

TwaitSend1: =TwaitSend1+Time-MsgPtr^. inTime;

t: =RangeRnd (15,5);

TworkSend1: =TworkSend1+t;

TobrabSend1: =Time+t;

FreeMem (MsgPtr,SQueue1. Size);

Shedull (TobrabSend1,P2);

inc (ObrabotSend1);

end;

end;

procedure Send2;

var

MsgPtr: ^MsgSpec;

t: integer;

begin

form1. RichEdit1. Lines. Clear;

form1. richedit1. Lines. add (' Длина очереди передачи 2: '+inttostr (SQueue2. Length));

if TObrabSend2<=Time then

if SQueue2. Length>0 then { очередь не пуста }

begin

form1. richedit1. Lines. add ('Началась передача сообщения по линии 2. ');

MsgPtr: = OutQueue (SQueue2);

TwaitSend2: =TwaitSend2+Time-MsgPtr^. inTime;

t: =RangeRnd (15,5);

TworkSend2: =TworkSend2+t;

TobrabSend2: =Time+t;

FreeMem (MsgPtr,SQueue2. Size);

Shedull (TobrabSend2,P2);

inc (ObrabotSend2);

end;

end;

procedure UserInit; { процедура инициализации переменных }

begin

Tobrab: =0;

TObrabSend1: = 0;

TObrabSend2: =0;

Twait: =0;

Obrabot: =0;

Otkaz: =0;

Vsego: =0;

Twork: =0;

Tworksend1: =0;

Tworksend2: =0;

TwaitSend1: =0;

TwaitSend2: =0;

ObrabotSend1: =0;

ObrabotSend2: =0;

X: =0;

InitQueue (LBase,Sizeof (MsgSpec)); { инициализация очереди }

InitQueue (SQueue1,Sizeof (MsgSpec));

InitQueue (SQueue2,Sizeof (MsgSpec));

Shedull (0,P1); { инициализация календаря }

end;

procedure UserStat; { процедура выдачи статистики }

begin

form1. RichEdit4. Lines. clear;

form1. richedit4. Lines. add ('Поступило: '+inttostr (Vsego) +' сообщений. ');

form1. richedit4. Lines. add ('Обработано: '+inttostr (Obrabot) +', т. е: '+floattostrf ( (Obrabot/Vsego) *100,ffGeneral,3,2) +'% сообщений. ');

form1. richedit4. Lines. add ('Вероятность отказа: '+floattostrf ( (Otkaz/Vsego) *100,ffGeneral,3,2) +'%. ');

form1. richedit4. Lines. add ('Среднее время ожидания в очереди: '+floattostrf ( (Twait/Vsego),ffFixed,8,5));

if obrabotSend1>0 then

form1. richedit4. Lines. add ('Среднее время ожидания в очереди на передачу 1: '+floattostrf ( (TwaitSend1/ObrabotSend1),ffFixed,8,5));

if obrabotSend2>0 then

form1. richedit4. Lines. add ('Среднее время ожидания в очереди на передачу 2: '+floattostrf ( (TwaitSend2/ObrabotSend2),ffFixed,8,5));

form1. richedit4. Lines. add ('Загрузка оборудования: '+floattostrf ( (Twork/Time) *100,ffFixed,3,2) +' % ');

form1. richedit4. Lines. add ('Загрузка линии передачи 1: '+floattostrf ( (TworkSend1/Time) *100,ffFixed,3,2) +'% ');

form1. richedit4. Lines. add ('Загрузка линии передачи 2: '+floattostrf ( (TworkSend2/Time) *100,ffFixed,3,2) +'% ');

end;

function UserCheck: boolean; {Функция проверки окончания моделирования}

begin

UserCheck: =false;

if Time>10000 then UserCheck: =true; { Время работы 10 секунд }

end;

procedure start;

{F-}

begin { программа }

ActMatr [P1]. ActPtr: =@Message1; { настройка адресов блоков }

ActMatr [P2]. ActPtr: =@Obrab;

ActMatr [P3]. ActPtr: =@Send1;

ActMatr [P4]. ActPtr: =@Send2;

ActMatr [P1]. Name: ='Сообщ1';

ActMatr [P2]. Name: ='Обработ. ';

ActMatr [P3]. Name: ='Перед1';

ActMatr [P4]. Name: ='Перед2';

UInitPtr: =@UserInit; { настройка адреса процедуры инициализации}

UStatPtr: =@UserStat; { настройка адреса процедуры статистики }

UCheckEnd: =UserCheck; { задание имени функции проверки условия }

SIMULATE; { вызов имитатора }

end;

end.

ref.by 2006—2025
contextus@mail.ru