РПЗ (954379), страница 11
Текст из файла (страница 11)
b - среднее количество проходов запроса по тракту процессор-диски за время одного цикла его обработки в системе.
tк – среднее значение времени обработки запроса в канале передачи данных;
tк=0.5(tк1+ tк2 ).
Где tк1 и tк2 соответственно среднее время передачи запроса по каналу в прямом и обратном направлениях.
n – количество серверов, обслуживающих рабочие станции;
количество дисков в сервере, при условии, что все они одинаковые
- вероятность обращения к i-му диску сервера
-
Порядок расчета рассматриваемой системы методом фонового потока
При расчете используется приближённый итерационный алгоритм нахождения значения выходных характеристик рассматриваемой системы
-
Определяем начальное значение для lф1
К1 принимает значения в диапазоне 0.995…0.99995.
-
Определяем средние времена пребывания запроса в узлах системы: канале, процессоре, дисках:
-
Определяем интенсивность фонового потока после очередной итерации:
К2 принимает значения в диапазоне 10…1000, .
Переход на пункт 2.
-
Определяем выходные результаты аналитической модели.
Определяем средние времена пребывания запроса в узлах системы: канале, процессоре и дисках.
Определяем загрузку основных узлов системы: рабочей станции, пользователя, канала передачи данных, процессора и дисков сервера.
-
Листинг
private void button1_Click(object sender, EventArgs e)
{
dataGridView_result.Rows.Clear(); // очистка DataGried
int N = System.Convert.ToInt16(textBox_numberWS.Text);
double K1 = System.Convert.ToDouble(textBox_coefficientIntensity.Text);
int countCPU = System.Convert.ToInt16(textBox_numberCPU.Text);
double Δ = System.Convert.ToDouble(textBox_precision.Text);
double lambdaF;
int K2 = 0;
double Pd_cpu = System.Convert.ToDouble(textBox_probabilityCirculationDiskAfterCPU.Text);
double Pcpu_d = System.Convert.ToDouble(textBox_probabilityCirculationCPUAfterDisk.Text);
double beta = 1 / (1 - Pcpu_d);
int tk1 = System.Convert.ToInt16(textBox_channelForward.Text);
int tk2 = System.Convert.ToInt16(textBox_channelBackwards.Text);
double tk = 0.5 * ( tk1 + tk2 );
int tcpu = System.Convert.ToInt16(comboBox_processingCPU.SelectedItem);
int td = System.Convert.ToInt16(comboBox_processingDisk.SelectedItem);
int T0 = System.Convert.ToInt16(comboBox_finalization.SelectedItem.ToString().Substring(0, 2)) * N;
int Tf = System.Convert.ToInt16(comboBox_formation.SelectedItem.ToString().Substring(0,2)) * N;
double Tk,
Tcpu,
Td;
// Первый шаг
// значения из которых выбирается минимальное для расчета интенсивности
double calculationChannel = 1 / (2 * tk);
double calculationCPU = countCPU / (beta * tcpu);
double calculationDisk = 1 / (beta * Pd_cpu);
double calculationMin = new double[]
{
calculationChannel,
calculationCPU,
calculationDisk
}.Min();
double lambdaF1 = K1 * calculationMin * (N - 1) / N;
while(true)
{
// Второй шаг
Tk = 2 * tk / (1 - 2 * lambdaF1 * tk);
Tcpu = beta * tcpu / (1 - Math.Pow(beta * lambdaF1 * tcpu / countCPU, countCPU));
Td = beta * td / (1 - beta * Pd_cpu * lambdaF1 * td);
// Третий шаг
lambdaF = (N - 1) / (T0 + Tf + Tk + Tcpu + Td);
// Четвертый шаг
if(Math.Abs(lambdaF1 - lambdaF) / lambdaF < Δ || K2 > 10000)
break;
// Пятый шаг
K2 = K2 + 10;
double delta = (lambdaF1 - lambdaF) / K2;
lambdaF1 = lambdaF1 - delta;
}
// Шестой шаг - Выходные данные
double cycleTime = T0 + Tf + Tk + Tcpu + Td;
double L = N / cycleTime;
double burdenWS = Math.Round( (T0 + Tf) / cycleTime, 2);
double burdenUser = Math.Round( Tf / (T0 + Tf + Tk + Tcpu + Td), 2);
double burdenChanel = Math.Round( 2 * L * tk, 2);
double burdenCPU = Math.Round( beta * L * tcpu / countCPU, 2);
double burdenDisk = Math.Round( beta * L * Pd_cpu * td, 2);
// отображение на форме
// Увеличение формы
this.Width = 660;
tabControl1.Width = 617;
int n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Загрузка рабочей станции";
dataGridView_result.Rows[n].Cells[1].Value = burdenWS;
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Загрузка пользователя рабочей станции";
dataGridView_result.Rows[n].Cells[1].Value = burdenUser;
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Среднее количество работающих РС";
dataGridView_result.Rows[n].Cells[1].Value = Math.Round(N * burdenWS, 2);
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Среднее количество РС формирующих запрос";
dataGridView_result.Rows[n].Cells[1].Value = Math.Round( (N * burdenWS) / 2, 2);
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Загрузка канала";
dataGridView_result.Rows[n].Cells[1].Value = burdenChanel;
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Загрузка процессора";
dataGridView_result.Rows[n].Cells[1].Value = burdenCPU;
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Загрузка диска";
dataGridView_result.Rows[n].Cells[1].Value = burdenDisk;
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Среднее время цикла системы";
dataGridView_result.Rows[n].Cells[1].Value = Math.Round(cycleTime);
n = dataGridView_result.Rows.Add();
dataGridView_result.Rows[n].Cells[0].Value = "Среднее время реакции системы";
dataGridView_result.Rows[n].Cells[1].Value = Math.Round(cycleTime - T0);
}
-
Результаты аналитического моделирования
Номер эксперимента | 1 | 2 | 3 | 4 | 5 |
Исходные данные | |||||
Количество рабочих станций | 31 | 31 | 31 | 31 | 31 |
Среднее время дообработки запроса на РС | 310 | 620 | 930 | 310 | 310 |
Среднее время формирования запроса на РС | 310 | 620 | 930 | 310 | 310 |
Среднее время передачи через канал в прямом направлении | 5 | 5 | 10 | 5 | 5 |
Среднее время передачи через канал в обратном направлении | 5 | 5 | 10 | 5 | 5 |
Количество процессоров | 2 | 2 | 2 | 2 | 2 |
Среднее время обработки запроса на процессоре | 10 | 10 | 20 | 20 | 10 |
Количество дисков | 2 | 2 | 2 | 2 | 2 |
Среднее время обработки запроса на диске | 10 | 10 | 10 | 20 | 20 |
Вероятность обращения запроса к диску сервера после обработки запроса в процессоре | 0,5 | 0,5 | 0,5 | 0,5 | 0,5 |
Вероятность обращения запроса к ЦП после обработки на диске | 0 | 0 | 0 | 0 | 0 |
Результаты моделирования. | |||||
Загрузка рабочей станции | 0,89 | 0,96 | 0,96 | 0,81 | 0,84 |
Загрузка пользователя рабочей станции | 0,45 | 0,48 | 0,48 | 0,41 | 0,42 |
Среднее количество работающих РС | 27,59 | 29,76 | 29,76 | 25,11 | 26,04 |
Среднее количество РС формирующих запрос | 13,8 | 14,88 | 14,88 | 12,56 | 13,02 |
Загрузка канала | 0,45 | 0,24 | 0,32 | 0,41 | 0,42 |
Загрузка процессора | 0,22 | 0,12 | 0,16 | 0,41 | 0,21 |
Загрузка диска 1 | 0,22 | 0,12 | 0,08 | 0,41 | 0,42 |
Загрузка диска 2 | 0,22 | 0,12 | 0,08 | 0,41 | 0,42 |
Среднее время цикла системы | 693 | 1288 | 1945 | 763 | 742 |
Среднее время реакции системы | 383 | 668 | 1015 | 453 | 432 |
Табл. 8.1 Результаты аналитического моделирования |
-
Имитационное моделирование сети
Формализованная схема моделируемой PCОД приведена на рис.9.1
-
Структура программы имеет следующий вид
Блоки и метки | Пояснение |
INITIAL | Задание количественных и временных параметров исходных данных моделируемой системы |
STORAGE | Задание многоканальных узлов системы |
FUNCTION | Задание функции распределения запросов по узлам и времени выполнения запросов в узлах |
GENERATE | Генерация количества задач, циркулирующих в системе |
Метка WOSF | Объединяет набор блоков, описывающих формирование запроса на рабочей станции |
Метка CAN | Объединяет набор блоков, описывающих обработку эапроса в канале |
Метка SVR | Объединяет набор блоков, описывающих обработку эапроса в процессоре |
Метка REP | Объединяет набор блоков, описывающих правило перехода запроса после обработки на диске в канал |
Метка WOSD | Объединяет набор блоков, описывающих дообработку запроса на рабочей станции |
Табл. 9.1 Переменные, используемые для имитационного моделирования |
-
Текст программы на языке GPSS
INITIAL X$STATION_N,31