//////////////////////////////////////////////////////////////////////////// // 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