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