////////////////////////////////////////////////////////////////////////////
// Model POCSIT.CPP SIMLIB/C++
//
// Příklad simulačního programu - počítačová síť v obchodním domu
//
// čas simulace:
// 113 s na 386/40 bez koprocesoru
// 31 s na 386/40 s koprocesorem
// 10 s na P90/Win95/DosPrompt
//
/////////////////////////////////////////////////////////////////////////////
// //
// Zadání: //
// ------- //
// Obchodní dům je vybaven počítačovou sítí, která spojuje jednotlivá //
// oddělení a sklady a řídí se pomocí ní distribuce zboží. Každé prodejní //
// oddělení obchodního domu je vybaveno mikropočítačem, ke kterému jsou //
// připojeny pokladny daného oddělení a terminál vedoucího oddělení, //
// který umožňuje získávat přehled o zboží a tržbě. Mikropočítač je //
// spojen s hlavním počítačem, který v určitých intervalech přebírá //
// informace o prodaném zboží. //
// //
// Bloková struktura mikropočítače na oddělení : //
// //
// +----------------------------------------------------------------------//
// | |//
// | mikro- |//
// | procesor |//
// | |//
// | |//
// | RAM DMA PPI USART USART .. USART |//
// | |//
// | |//
// | |//
// | USART |//
// | |//
// -----------------------------------------------------------------//
// //
// hlavní počítač < //
// terminál ... //
// //
// POKLADNY //
// //
// Pomocí modelu prověřte, zda vyhovuje následující konfigurace //
// mikropočítače na jednom oddělení obchodního domu : //
// //
// - počet pokladen : 3 //
// - doba mezi příchody požadavků na zaplacení 1 ks zboží je náhodná //
// veličina s exponenciálním rozložením pravděpodobnosti se střední //
// hodnotou 10 s //
// - přenosová rychlost mezi pokladnou a mikropočítačem je 1200 b/s //
// - velikost přenášeného bloku informací příslušejícího 1 ks zboží je //
// 100 bytů //
// - doba mezi otázkami zadávanými na terminál je náhodná veličina s expo- //
// nenciálním rozložením pravděpodobnosti se střední hodnotou 10 minut //
// - přenosová rychlost mezi terminálem a mikropočítačem je 1 byte/100 Šs //
// - velikost bloku příslušejícího otázce i odpovědi je 100 až 1000 bytů //
// (rovnoměrné rozložení) //
// - doba, než hlavní počítač převezme otázku : 0 až 10 s (rovnoměrné //
// rozložení) //
// - doba vypracování odpovědi : 0.5 až 15 s (rovnoměrné rozložení) //
// - interval mezi přenosy dat do hlavního počítače je náhodná veličina //
// s exponenciálním rozložením pravděpodobnosti se střední hodnotou 5 //
// minut //
// - přenosová rychlost mezi hlavním počítačem a mikropočítačem je 19200 //
// bitů za sekundu //
// - kapacita paměti mikropočítače je 24 kB //
// //
/////////////////////////////////////////////////////////////////////////////
#include "simlib.h"
// deklarace konstant
#define T_POC 0.0 // doba simulace počáteční (v sek)
#define T_KON 10.0*3.6e3 // konečná
#define P_POKL 3 // počet pokladen
#define T_POKL 10.0 // střední doba mezi příchody požadavků na pokladnu
#define V_POKLMIKR 1.2e3 // přenosová rychlost pokladna - mikropočítač (b/s)
#define V_TERMMIKR 8.0e4 // přenosová rychlost terminál - mikropočítač (b/s)
#define V_HLPOCMIKR 1.92e4 // přenosová rychlost hl.počítač - mikropočítač (b/s)
#define S_BLOKZBOZI 100 // velikost bloku příslušejícího 1 ks zboží
#define Smin_DOTAZODPOV 100 // velikost bloku (minim.) pro otázku a odpověď
#define Smax_DOTAZODPOV 1000 // - || - (maxim.) - || -
#define T_TERM 6e2 // doba mezi zadáním nové úlohy na terminál
#define Tmin_PREVDOTAZU 0.0 // doba převzetí dotazu hl. počítačem (minim.)
#define Tmax_PREVDOTAZU 10.0 // - || - (maxim.)
#define Tmin_ODPOVEDI 0.5 // doba vypracování odpovědi (minim.)
#define Tmax_ODPOVEDI 15.0 // - || - (maxim.)
#define T_HLPOC 1.8e2 // střední doba mezi přenosy dat do hl. počítače
#define KAP_PAMETI 24576 // bytů
// deklarace globálních objektů
Store Pamet("Paměť",KAP_PAMETI);
Facility Procesor("Procesor"),
Sbernice("Sběrnice"),
DMA("DMA");
Histogram TPokladna ("Doba obsluhy požadavků z pokladny",0,1,10);
Histogram TTerminal ("Doba obsluhy požadavků z terminálu",0,5,10);
unsigned ObsazKap = 0; // kapacita paměti, určené pro přenos do hl. počítače
class Pokladna : public Process { // třída úloh zpracovávaných pokladnou
double Prichod;
void Behavior() {
Prichod = Time; // doba příchodu požadavku na některou z pokladen
Seize(Procesor); //,1); // vyšší priorita, aby pokladna dlouho nečekala
Seize(Sbernice);
Enter(Pamet,S_BLOKZBOZI);
ObsazKap+=S_BLOKZBOZI;
Wait(S_BLOKZBOZI*8/V_POKLMIKR); // přenos bloku do mikropočítače
Release(Sbernice);
Release(Procesor);
TPokladna(Time - Prichod); // záznam doby zpracování do tabulky
}
public: Pokladna() { Activate(); }
};
class GenerPokladna : public Event { // třída generátorů úloh pro pokladny
void Behavior() { // popis chování generátoru
new Pokladna;
Activate(Time+Exponential(T_POKL));
}
public: GenerPokladna() { Activate(); }
};
class Terminal : public Process { // třída úloh zpracovávaných terminálem
double Prichod; // čas vzniku úlohy zpracovávané terminálem
int Otazka, Odpoved; // velikost otázky a odpovědi v bytech
void Behavior() {
Prichod = Time;
Seize(Procesor);
Seize(Sbernice);
Otazka = int(Uniform(Smin_DOTAZODPOV,Smax_DOTAZODPOV));
Enter(Pamet,Otazka);
Wait(Otazka*8/V_TERMMIKR); // přenos otázky do mikropočítače
Release(Sbernice);
Release(Procesor);
Wait(Uniform(Tmin_PREVDOTAZU,Tmax_PREVDOTAZU));
// převzetí otázky hl. počítačem
Seize(DMA);
Seize(Sbernice,1);
Wait(Otazka*8/V_HLPOCMIKR); // přenos otázky do hl. počítače
Leave(Pamet,Otazka);
Release(Sbernice);
Release(DMA);
Wait(Uniform(Tmin_ODPOVEDI,Tmax_ODPOVEDI)); // vypracování odpovědi
Odpoved = int(Uniform(Smin_DOTAZODPOV,Smax_DOTAZODPOV));
Seize(DMA);
Seize(Sbernice,1);
Enter(Pamet,Odpoved);
Wait(Odpoved*8/V_HLPOCMIKR); // přenos odpovědi do mikropočítače
Release(Sbernice);
Release(DMA);
Seize(Procesor);
Seize(Sbernice);
Wait(Odpoved*8/V_TERMMIKR); // přenos odpovědi na terminál
Leave(Pamet,Odpoved);
Release(Sbernice);
Release(Procesor);
TTerminal(Time - Prichod); // záznam doby zpracování do tabulky
}
public: Terminal() { Activate(); }
};
class GenerTerminal : public Event { // generátor úloh pro terminál
void Behavior() { // popis chování generátoru
new Terminal;
Activate(Time+Exponential(T_TERM));
}
public: GenerTerminal() { Activate(); }
};
class HlPocitac : public Process { // úlohy zpracovávané hlavním počítačem
void Behavior() {
Seize(DMA);
Seize(Sbernice); //,1);
Wait(ObsazKap*8/V_HLPOCMIKR); // přenos dat do hlavního počítače
Leave(Pamet,ObsazKap);
ObsazKap = 0;
Release(Sbernice);
Release(DMA);
}
public: HlPocitac() { Activate(); }
};
class GenerHlPoc : public Event { // generátor úloh pro hlavní počítač
void Behavior() { // popis chování generátoru
new HlPocitac;
Activate(Time+Exponential(T_HLPOC));
}
public: GenerHlPoc() { Activate(); }
};
int main() {
SetOutput("pocsit.out"); // nastavení výstupního souboru
Init(T_POC,T_KON); // inicializace experimentu
for (int k=0; k<P_POKL; k++)
new GenerPokladna; // inicializace generátorů úloh pro pokladny
new GenerTerminal; // inicializace generátoru úloh pro terminál
new GenerHlPoc; // inicializace generátoru úloh pro hl. poč.
_Print(" POCSIT - model počítačové sítě\n");
Run(); // simulace
Procesor.Output(); // tisk výsledků
Sbernice.Output();
DMA.Output();
Pamet.Output();
TPokladna.Output();
TTerminal.Output();
return 0;
}
// konec
syntax highlighted by Code2HTML, v. 0.9.1