На основании структурной схемы построим алгоритмическую модель вычислительной системы, она показана на рисунке 2 Рисунок.
Рисунок 2
Работа программы
После запуска программы производится генерация массивов значений, которые будут использованы далее в программе. После заполнения массивов, пользователь может запустить процесс моделирования, по завершении которого будут выведены результаты, в том же окне программы. В ходе моделирования будут созданы два файла, для оценки ГСЧ 1 и ГСЧ 2. Программой будут сгенерированы файлы логов, по которым можно будет наблюдать процесс работы всей системы, а также результаты моделирования запишутся в файл «*.csv», по которому можно будет построить гистограмму или график.
После завершения процесса моделирования в окне отобразятся статистические параметры работы модели: количество поступивших сообщений, количество обработанных системой сообщений и коэффициент загрузки ЭВМ после смоделированного времени работы. Коэффициент загрузки ЭВМ определяется по следующей формуле:
.
Временная диаграмма работы системы показана на рисунке 3.
Рисунок 3
Исследование эффективности разработанной модели
Расчет показателя эффективности осуществляется путем нахождения отношения количества обработанных сообщений к общему числу сообщений (берутся средние значения):
.
Программа считает количество поступивших сообщений и количество сообщений, покинувших систему, поэтому:
Расчёт эффективности (загрузки ЭВМ) производится нахождением среднего значения коэффициента загрузки ЭВМ по выданным программой значениям:
Кз = ((299/304) + (293/310) + (298/305) + (291/312) + (285/318) + (295/308) + (290/313) + (296/307) + (284/300) + (280/303)) / 10 = (0.947982 + 0.94848 + 948314 + 0.95141 + 0.953455 + 0.974264 + 0.95141 + 0.94953 + 0.948646 + 0.951133) / 10 = 0,9524624
Заключение
В ходе выполнения данной курсовой работы была разработана система массового обслуживания, которая представляет собой два генератора псевдослучайных величин и ЭВМ, обрабатывающая поступающие заявки. Проверено качество их работы по гистограмме распределения и по критерию Пирсона. Оба генератора показали хорошие результаты. Погрешность распределения для первого генератора оказалась равной 0,553%, критерий Пирсона χ2 для второго генератора равен 6,0245, при табличном значении (для выбранного числа интервалов разбиения) 14,6837.
Разработана структурная схема моделируемой системы. После чего с использованием генераторов была построена алгоритмическая модель системы. На основе алгоритмической модели разработана программа, позволяющая имитировать работу системы. С помощью данной программы были получены статистические параметры работы модели. Коэффициент загрузки ЭВМ равен 0,9524, что означает что ресурсы ЭВМ используются не полностью.
Приложение
Исходный код программы.
// console.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include "object.h"
#include <fstream>
#include <math.h>
#include <ctime>
#include <stdlib.h>
#include <iostream>
#include <locale.h>namespace std;mtime = 30;speed = 10;term_time = 30;nleft=250, nright=350;model_time=3600*5;ExpGen(int sredn)
{-sredn*log((static_cast<double>(rand()) / RAND_MAX) *1);
}GaussGen(double x, double y)
{(double)rand() / (RAND_MAX + x) * (y - x) + x;
}gist(const char name[11], const char name_2[11], const double *mass, int num_elements, bool inf_show);main_buf=0;evm;term1=true, term2=true, term3=true;_tmain(int argc, _TCHAR* argv[])
{(LC_ALL, "rus");sec_count=0;(time(0));WorkTime=0;tbuf1=0, tbuf2=0, tbuf3=0;lbuf1=0, lbuf2=0, lbuf3=0;{(sec_count>=tbuf1)
{=floor(ExpGen(mtime));=floor(GaussGen(nleft, nright));=false;
}(sec_count>=tbuf2)
{=floor(ExpGen(mtime));=GaussGen(nleft,nright);=false;
}(sec_count>=tbuf3)
{=floor(ExpGen(mtime));=GaussGen(nleft,nright);=false;
}(term1==false)
{_buf=evm.SetWtime(lbuf1, speed, term_time);(main_buf!=0)
{.modifyline(main_buf);
}_count=sec_count+term_time;=true;
}
{_buf=evm.GetFromLine(speed);(main_buf!=0)
{_count=sec_count+floor(main_buf);
}
}(term2==false)
{_buf=evm.SetWtime(lbuf2, speed, term_time);(main_buf!=0)
{.modifyline(main_buf);
}_count=sec_count+term_time;=true;
}
{_buf=evm.GetFromLine(speed);(main_buf!=0)
{_count=sec_count+floor(main_buf);
}
}(term3==false)
{_buf=evm.SetWtime(lbuf3, speed, term_time);(main_buf!=0)
{.modifyline(main_buf);
}_count=sec_count+term_time;=true;
}
{_buf=evm.GetFromLine(speed);(main_buf!=0)
{_count=sec_count+floor(main_buf);
}
}
}while(sec_count<=model_time);