7 Результаты моделирования
Заявок обсужено |
Заявок потеряно |
Загрузка процессора |
P отказа |
Заявок 1 линии |
Заявок 2 линии |
1334 |
0 |
93,38 |
0 |
670 |
663 |
1335 |
0 |
93,45 |
0 |
659 |
675 |
1324 |
0 |
92,68 |
0 |
656 |
667 |
1327 |
0 |
92,89 |
0 |
657 |
669 |
1340 |
0 |
93,8 |
0 |
673 |
666 |
1343 |
0 |
94,01 |
0 |
667 |
675 |
1337 |
0 |
93,59 |
0 |
662 |
674 |
1328 |
0 |
92,96 |
0 |
672 |
655 |
1321 |
0 |
92,47 |
0 |
662 |
658 |
1329 |
0 |
93,03 |
0 |
663 |
665 |
Средние значения | |||||
1331,8 |
0 |
93,226 |
0 |
664,1 |
666,7 |
Заключение
Анализ работы системы коммутации данных позволяет сделать вывод об эффективном ее устройстве. Так для заданных условий необслуженных заявок нет, а вероятность отказа равна 0; Процессор загружается примерно на 90%. Уменьшение же интервала поступления заявок даже на 1 приведет к появлению необслуженных заявок. Увеличение контроля потоков незначительно снижает вероятность отказов, засчет буферизации необслуженных заявок, однако не влияет на производительность системы в целом.
Список литературы
Советов Б. Я., Яковлев С. А. Моделирование систем: Учеб. Для вузов 3-е издание, перераб. И доп. – М: Высш. Школа, 2001 г. – 343 с.
Советов Б. Я., Яковлев С. А. Моделирование систем: Курсовое проектирование: Учеб. Пособие по специальности АСУ. – М: Высш. Школа, 1988г. – 135 с.
Приложение А (обязательное) Псевдокод моделирующего алгоритма
структура generator
начало
скаляр ntime - целый
скаляр type - целый
конец
структура proc
начало
скаляр ntime - целый
скаляр type - целый
конец
структура line
начало
скаляр ntime - целый
конец
скаляр line_control - целый
скаляр gen_time - целый
скаляр lng_time - целый
скаляр line_time - целый
скаляр line_lng - целый
скаляр CPU_speed - целый
скаляр end_time - целый
скаляр count_err - целый
скаляр count_task - целый
скаляр count_line1 - целый
скаляр count_line2 - целый
скаляр t - целый
Алгоритм BeginParam(*bfr,*bfr1,*bfr2,*sr,*CPU,*ln)
начало
gen_time = StrToСкаляр(Edit1->Text)
lng_time = StrToСкаляр(Edit2->Text)
CPU_speed = StrToСкаляр(Edit3->Text)
line_time = StrToСкаляр(Edit4->Text)
line_lng = StrToСкаляр(Edit5->Text)
count_err = 0
count_task = 0
count_line1= 0
count_line2= 0
t=0
end_time=StrToСкаляр(Edit7->Text)
sr[0].type=1
sr[1].type=2
для(i=0,i<2,i++)
начало
sr[i].ntime=0
ln[i].ntime=0
конец
CPU->ntime=0
CPU->type=0
для(i=0,i<line_control,i++)
начало
bfr1[i]=0 bfr2[i]=0
конец
для(скаляр i=0,i<2*line_control,i++) bfr[i]=0
конец
скаляр Алгоритм GenTime(a,b)
начало
возврат(t+a+random(b+1))
конец
void Алгоритм GetTask(*sr)
начало
если(sr[0].ntime <=t) sr[0].ntime = GenTime(gen_time,lng_time)
если(sr[1].ntime <=t) sr[1].ntime = GenTime(gen_time,lng_time)
конец
скаляр Алгоритм Bufering(*sr,k,*bfr)
начало
скаляр fl = 0
для(скаляр i=0 i<2*line_control&&fl==0 i++)
начало
если(bfr[i]==0)
начало
bfr[i] = sr[k].type
fl=1
конец
конец
возврат(fl)
конец
void Алгоритм sdvig(*bfr,N)
начало
для(скаляр i=0 i<N-1 i++)
bfr[i]=bfr[i+1]
bfr[N-1]=0
конец
void Алгоритм Processing(*bfr, *CPU, *bfr1, *bfr2)
начало
если(bfr[0]!=0 && CPU->ntime<=t)
начало
если(CPU->type==1) начало Bufer_line(CPU,bfr1) count_line1++ конец
если(CPU->type==2) начало Bufer_line(CPU,bfr2) count_line2++ конец
CPU->ntime=t+CPU_speed
CPU->type=bfr[0]
sdvig(bfr,2*line_control)
count_task++
конец
конец
void Алгоритм Bufer_line(proc *CPU,скаляр *bfr)
начало
для(скаляр i=0 i<line_control i++)
если(bfr[i]==0) bfr[i] = CPU->type
конец
Алгоритм Line_proc(*bfr,*ln,k)
начало
если(bfr[0]!=0 && ln[k].ntime<=t)
начало
ln[k].ntime=GenTime(line_time,line_lng)
sdvig(bfr,line_control)
конец
конец
скаляр Алгоритм Load_buf(bfr,N)
начало
скаляр c=0
для(скаляр i=0 i<N i++)
если(bfr[i]!=0) c++
возврат (c)
конец
Алгоритм Out_param(*bfr, *bfr1,*bfr2,*sr, *CPU,*ln)
начало
Edit8->Text=count_task
Edit9->Text=count_err
float temp=CPU_speed*count_task
float temp2=count_err+count_task
Edit10->Text=(temp/end_time)*100
Edit11->Text=count_err/temp2
Edit12->Text=count_line1
Edit13->Text=count_line2
конец
Алгоритм Моделирования
начало
line_control=StrToСкаляр(Edit6->Text)
generator *source = new generator [2]
line *ln = new line[2]
массив *bufer = new скаляр[2*line_control]
массив *bufer1 = new скаляр[line_control]
массив *bufer2 = new скаляр[line_control]
proc *CPU = new proc
BeginParam(bufer,bufer1,bufer2,source,CPU,ln)
GetTask(source)
для(t=0 t<end_time t++)
начало
для(скаляр l=0 l<2 l++)
начало
если(source[l].ntime==t)
начало
если(Bufering(source,l,bufer)==0) count_err++
конец
конец
GetTask(source)
Processing(bufer,CPU,bufer1,bufer2)
Line_proc(bufer1,ln,0)
Line_proc(bufer2,ln,1)
конец
Out_param(bufer,bufer1,bufer2,source,CPU,ln)
конец
Приложение Б (обязательное) Листинг программы
Unit1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Chart.hpp>
#include <ExtCtrls.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
#include "CGAUGES.h"
#include <Menus.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TGroupBox *GroupBox1;
TLabel *Label1;
TEdit *Edit1;
TEdit *Edit2;
TLabel *Label2;
TEdit *Edit3;
TLabel *Label3;
TEdit *Edit4;
TEdit *Edit5;
TLabel *Label4;
TEdit *Edit6;
TLabel *Label5;
TEdit *Edit7;
TGroupBox *GroupBox2;
TLabel *Label6;
TEdit *Edit8;
TLabel *Label7;
TEdit *Edit9;
TLabel *Label8;
TEdit *Edit10;
TLabel *Label9;
TEdit *Edit11;
TLabel *Label10;
TEdit *Edit12;
TLabel *Label11;
TEdit *Edit13;
TChart *Chart1;
TLineSeries *Series1;
TChart *Chart2;
TLineSeries *Series2;
TCGauge *CGauge1;
TButton *Button2;
TMainMenu *MainMenu1;
TMenuItem *N1;
TMenuItem *N2;
TMenuItem *Q1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall N2Click(TObject *Sender);
void __fastcall Q1Click(TObject *Sender);
private: // User declarations
struct generator {
int ntime;
int type;
};
struct proc {
int ntime;
int type;
};
struct line {
int ntime;
};
int line_control;
int gen_time;
int lng_time;
int line_time;
int line_lng;
int CPU_speed;
int end_time;
int count_err;
int count_task;
int count_line1;
int count_line2;
int t;
void BeginParam(int *,int *,int *,generator *,proc *,line *);
int GenTime(int a,int b);
void GetTask(generator *);
int Bufering(generator *,int,int*);
void Processing(int*, proc*,int*,int*);
void sdvig(int*, int);
void Bufer_line(proc*,int*);
void Line_proc(int*, line*, int);
int Load_buf(int*, int);
void Out_param(int*,int*,int*,generator*,proc*,line*);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CGAUGES"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void TForm1::BeginParam(int *bfr,int *bfr1,int *bfr2,generator *sr,proc *CPU,line *ln)
{
Series1->Clear();
Series2->Clear();
gen_time = StrToInt(Edit1->Text);
lng_time = StrToInt(Edit2->Text);
CPU_speed = StrToInt(Edit3->Text);
line_time = StrToInt(Edit4->Text);
line_lng = StrToInt(Edit5->Text);
count_err = 0;
count_task = 0;
count_line1= 0;
count_line2= 0;
t=0;
end_time=StrToInt(Edit7->Text);
sr[0].type=1;
sr[1].type=2;
for(int i=0;i<2;i++)
{
sr[i].ntime=0;
ln[i].ntime=0;
}
CPU->ntime=0;
CPU->type=0;
for(int i=0; i<line_control;i++)
{
bfr1[i]=0; bfr2[i]=0;
}
for(int i=0; i<2*line_control;i++) bfr[i]=0;
}
int TForm1:: GenTime(int a,int b)
{
return(t+a+random(b+1));
}
void TForm1:: GetTask(generator *sr)
{
if(sr[0].ntime <=t) sr[0].ntime = GenTime(gen_time,lng_time);
if(sr[1].ntime <=t) sr[1].ntime = GenTime(gen_time,lng_time);
}
int TForm1:: Bufering(generator *sr,int k,int *bfr)
{
int fl = 0;
for(int i=0;i<2*line_control&&fl==0;i++) {
if(bfr[i]==0) {
bfr[i] = sr[k].type;
fl=1;
}
}
return(fl);
}
void TForm1:: sdvig(int *bfr,int N)
{
for(int i=0; i<N-1;i++)
bfr[i]=bfr[i+1];
bfr[N-1]=0;
}
void TForm1::Processing(int *bfr, proc *CPU,int *bfr1, int *bfr2)
{
if(bfr[0]!=0 && CPU->ntime<=t)
{
if(CPU->type==1) {Bufer_line(CPU,bfr1); count_line1++;}
if(CPU->type==2) {Bufer_line(CPU,bfr2); count_line2++;}
CPU->ntime=t+CPU_speed;
CPU->type=bfr[0];
sdvig(bfr,2*line_control);
count_task++;
}
}
void TForm1:: Bufer_line(proc *CPU,int *bfr)
{
for(int i=0;i<line_control;i++)
if(bfr[i]==0) bfr[i] = CPU->type;
}
void TForm1:: Line_proc(int *bfr, line *ln, int k)
{
if(bfr[0]!=0 && ln[k].ntime<=t)
{
ln[k].ntime=GenTime(line_time,line_lng);
sdvig(bfr,line_control);
}
}
int TForm1::Load_buf(int* bfr, int N)
{
int c=0;
for(int i=0;i<N;i++)
if(bfr[i]!=0) c++;
return (c);
}
void TForm1:: Out_param(int *bfr,int *bfr1,int *bfr2,generator *sr,proc *CPU,line *ln)
{
Edit8->Text=count_task;
Edit9->Text=count_err;
float temp=CPU_speed*count_task;
float temp2=count_err+count_task;
Edit10->Text=(temp/end_time)*100;
Edit11->Text=count_err/temp2;
Edit12->Text=count_line1;
Edit13->Text=count_line2;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
line_control=StrToInt(Edit6->Text);
generator *source = new generator [2];
line *ln = new line[2];
int *bufer = new int[2*line_control];
int *bufer1 = new int[line_control];
int *bufer2 = new int[line_control];
proc *CPU = new proc;
BeginParam(bufer,bufer1,bufer2,source,CPU,ln);
GetTask(source);
for(t=0; t<end_time; t++)
{
CGauge1->Progress = t;
for(int l=0;l<2;l++){
if(source[l].ntime==t)
{
if(Bufering(source,l,bufer)==0) count_err++;
}
}
GetTask(source);
Processing(bufer,CPU,bufer1,bufer2);
Series1->AddXY(t,Load_buf(bufer1,line_control));
Series2->AddXY(t,Load_buf(bufer2,line_control));
Line_proc(bufer1,ln,0);
Line_proc(bufer2,ln,1);
}
Out_param(bufer,bufer1,bufer2,source,CPU,ln);
delete bufer;
delete bufer1;
delete bufer2;
delete CPU;
delete source;
delete ln;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
Form2->ShowModal();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Q1Click(TObject *Sender)
{
Form3->ShowModal();
}
//---------------------------------------------------------------------------