Proletarskaya_VA (954164), страница 7
Текст из файла (страница 7)
В схеме используются следующие обозначения
- обслуживающий аппарат, имитирующий дообработку на i-той рабочей станции сети запроса от этой станции к серверу после обработки запроса на сервере
- обслуживающий аппарат, имитирующий формирование запроса от i-той рабочей станции к серверу; (
);
- буфер, имитирующий очередь запросов к каналу;
— обслуживающий аппарат, имитирующий задержку при передаче данных через канал;
- буфер, имитирующий очередь запросов к процессорам;
- обслуживающие аппараты, имитирующие работу процессоров.
- буфер, имитирующий очередь запросов к i-му диску;
- обслуживающий аппарат, имитирующий работу i-го диска.
Р - вероятность обращения запроса к ЦП после обработки на диске. Обслуживание заявок во всех ОА подчиняется экспоненциальному закону.
Исходными данными аналитической модели являются:
Обозначение | Описание |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Выходными характеристиками аналитической модели являются:
Обозначение | Описание |
|
|
|
|
|
|
|
|
Введём следующие обозначения:
lф1 – среднее значение суммарной интенсивности фонового потока запросов, выходящих из ОА, имитирующих работу рабочих станций, в канал
lф1b – среднее значение интенсивности фонового потока запросов, проходящих через ОА, имитирующих работу сервера и дисков, где b=1/(1–р) ;
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.
-
Определяем выходные результаты аналитической модели.
Определяем средние времена пребывания запроса в узлах системы: канале, процессоре и дисках.
Определяем загрузку основных узлов системы: рабочей станции, пользователя, канала передачи данных, процессора и дисков сервера.
Листинг программы
unit Unit11;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Math, ExtCtrls, Unit1, Unit3;
type
TForm2 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit5: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit11: TEdit;
Label3: TLabel;
Edit13: TEdit;
Button3: TButton;
Button4: TButton;
Label4: TLabel;
Label5: TLabel;
Label8: TLabel;
Button1: TButton;
Edit4: TEdit;
Label9: TLabel;
Edit8: TEdit;
Label10: TLabel;
Edit9: TEdit;
Edit10: TEdit;
Label11: TLabel;
Label12: TLabel;
Edit12: TEdit;
Edit14: TEdit;
Label13: TLabel;
Label14: TLabel;
Edit16: TEdit;
Label15: TLabel;
Edit15: TEdit;
Label16: TLabel;
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
// procedure Button1Click(Sender: TObject);
// procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
// Form1: TForm1;
NPC,NServ:Integer;
QueryPC ,
FormQueryPC ,
TChannelDirect ,
TChannelRevers ,
QueryServer ,
// Nproc,
t_pryam,
t_obr,
kolproc,
t_proc,
n_disk,
tzap_disk,
beta,
p,
pi,
tk,tpr,td,
Precision : real;
implementation
{$R *.DFM}
function Step( f:real;st:real) :real;
var i:Integer;
begin
if st=0 then result:= 1;
i:= 0;
while i < st
do
begin
f := f*f;
i:= i+1;
end;
result:= f;
end;
function Vich():bool;
var tcs,T0,Tp,K1,K2,delta1,
Tc,Lf,Lf1,Ppc,
Pc,Tcicle,L,Treaction,Delta:real;
N,C,IterationNumber,Nproc :Integer;
begin
NPC := StrToInt(Form2.Edit1.Text);
NProc:= StrToInt(Form2.Edit10.Text);
QueryPC := StrToInt(Form2.Edit2.Text);
FormQueryPC:= StrToInt(Form2.Edit3.Text);
// QueryServer := StrToInt(Form2.Edit7.Text);
Precision := StrToFloat(Form2.Edit5.Text);
t_pryam:= StrToFloat(Form2.Edit4.Text);
t_obr:= StrToFloat(Form2.Edit8.Text);
kolproc:= StrToFloat(Form2.Edit10.Text);
t_proc:= StrToFloat(Form2.Edit9.Text);
n_disk:= StrToFloat(Form2.Edit12.Text);
tzap_disk:= StrToFloat(Form2.Edit14.Text);
p:= StrToFloat(Form2.Edit16.Text);
pi:= StrToFloat(Form2.Edit15.Text);
beta:= 1/(1- 0);
IterationNumber :=0;
tcs := QueryServer;
C := Nproc;
N := NPC;
T0 := QueryPC;
Tp := FormQueryPC;
K1 :=StrToFloat(Form2.Edit11.Text); // 0,995...0,99995
K2 := StrToInt(Form2.Edit13.Text); //10...1000
//Nproc:= StrToInt(Form2.Edit6.Text);
delta1 := 0;
Tc := 0;
Lf := 0;
Lf1:=K1* min(1/(2*t_obr),min(kolproc/(beta*t_proc),1/(beta*pi*tzap_disk)));
Ppc := 0;
Pc := 0;
Tcicle := 0;
L := 0;
Treaction := 0;
// 1
while true do
begin
// 2
Tc := tcs / (1 - Step((Lf1 * tcs / C), C));
Tk:= (2*t_obr)/(1-2*Lf1);
Tpr:= t_proc / (1 - Step((Lf1 * t_proc / C), C));
Td:= (beta*tzap_disk)/(1-beta*pi*Lf1*tzap_disk);
// 3
Lf := (N - 1) / (T0 + Tp + Tk+Tpr+Td);
// 4
Delta := (Abs(Lf1 - Lf) / Lf);
if ( Delta < Precision) then Break;
// 5
delta1 := (Lf1 - Lf) / K2;
Lf1 := Lf1 - delta1;
end;
// 6
Tc := tcs / (1 - Step((Lf1 * tcs / C), C));
Tk:= (2*t_obr)/(1-2*Lf1);
Tpr:= t_proc / (1 - Step((Lf1 * t_proc / C), C));
Td:= (beta*tzap_disk)/(1-beta*pi*Lf1*tzap_disk);
Tcicle := T0+Tp+Tk+Tpr+Td;
Ppc := (T0 + Tp) / Tcicle;
L := N / Tcicle;
Pc := L * tcs/C;
Treaction := Tcicle - Tp;
Form1.Edit12.Text := FloatToStr(roundto(Ppc,-2));
Form1.Edit14.Text := FloatToStr(roundto((T0 / Tcicle),-2));
Form1.Edit18.Text := FloatToStr(roundto(Tcicle,-2));
Form1.Edit15.Text := FloatToStr(roundto((NPC * Ppc),0));
Form1.Edit19.Text := FloatToStr(roundto(NPC * (Tp / Tcicle),0));
Form1.Edit16.Text := FloatToStr(roundto(Treaction,-2));
//Form1.Edit18.Text := FloatToStr(roundto((Pc/C),-2));
Form1.Edit1.Text := FloatToStr(roundto((2*L*Tk),-2));
Form1.Edit2.Text := FloatToStr(roundto((beta*L*Tpr),-2));
Form1.Edit3.Text := FloatToStr(roundto((beta*L*pi*Tk),-2));
if( StrToInt(Form2.Edit12.Text)=2) then
Form1.Edit4.Text := FloatToStr(roundto((beta*L*pi*Tk),-2))
else
Form1.Edit4.Text := IntToStr(0);
result:= true;
end;