Osnovna skica upravljača kojeg se simulira je prikazana kodom:
ponavljaj { za svaki ulaz-i { provjeri treba li nešto napraviti i ako da napravi to } }
Upravljač simulirati jednom dretvom te svaki ulaz simulirati zasebnom dretvom koja mijenja stanje ulaza i čeka na odgovor upravljačke dretve.
upravljačka dretva | stanje-1 | dretva za simulaciju rada ulaza-1 |
stanje-2 | dretva za simulaciju rada ulaza-2 | |
... | ... | |
stanje-N | dretva za simulaciju rada ulaza-N |
Za svaki ulaz treba definirati:
- za simulator ulaza:
- trenutak
t0
prve pojave događaja na ovom ulazu (relativno u odnosu na pokretanje simulacije ulaza) - periodu
T
u kojoj se promjena događa
- trenutak
- za upravljača:
- trajanje obrade
C
.
- trajanje obrade
U simulaciji treba pratiti statistiku vremena potrebnog od promjene stanja do započinjanja obrade, ali samo za obrade koje su dovršene do kraja periode. Obrade koje su završile prekasno dodati u statistiku neobrađenih promjena ulaza.
Skica rješenja
Kraj simulacije zadati statički, npr. nekoliko najduljih perioda i/ili na signal (npr. na Ctrl+C postaviti oznaku kraja na koju će sve dretve završiti).
Na kraju simulacije ispisati statistiku (po zadacima te zajedničku). Npr.:
Tijekom rada također se može ispisivati događaje, npr.:
Pseudokod dretvi
dretva upravljač
{
dok nije označen kraj simulacije {
za i=0 do br_ulaza-1 {
ako je promjena na ulazu "i" {
zabilježi trenutak reakcije
simuliraj obradu ulaza "i" (sleep)
označi da je obrada gotova
}
}
}
}
dretva simulator_ulaza (i)
{
ako je ovaj ulaz popuna //samo za LAB2
završi ovu dretvu
t = t0 //trenutak prve pojave
dok nije označen kraj simulacije {
odgodi_do(t)
promijeni stanje na ulazu
zabilježi trenutak promjene stanja
//čekaj promjenu ili istek periode
dok obrada nije gotova I t + T > dohvati_sat()
spavaj(10 ms)
ako je obrada gotova {
ažuriraj statistiku vremenom reakcije
}
inače {
ažuriraj statistiku "bez odgovora"
}
t += T
}
//na kraju
ispiši statistiku
}
Primjer statički zadanih ulaza
Slijedeći primjer je uzet iz skripte, iz primjera 4.21.
Sva su vremena pomnožena s 1000 (1ms => 1s). Trajanje obrade je zadano, ali nije ispitana rasporedivost.
ulaz[] = { //{.T, .t0, .C, .x} x=1 stvarni ulaz, x=0 popuna (LAB2)
//ovaj redak svake sekunde
{ 1000, 0, 30, 1}, {1000, 400, 30, 1}, {1000, 700, 30, 1}, //a1-a3
//samo jedan od ovih pet redaka svake sekunde
{ 5000, 100, 50, 1}, {5000, 500, 50, 1}, {5000, 800, 50, 1}, //b1-b3
{ 5000, 1100, 50, 1}, {5000, 1500, 50, 1}, {5000, 1800, 50, 1}, //b4-b6
{ 5000, 2100, 50, 1}, {5000, 2500, 50, 1}, {5000, 2800, 50, 1}, //b7-b9
{ 5000, 3100, 50, 1}, {5000, 3500, 50, 1}, {5000, 3800, 50, 1}, //b9-b12
{ 5000, 4100, 50, 1}, {5000, 4500, 50, 1}, {5000, 4800, 50, 1}, //b13-b15
//samo jedan od ovih 20 redaka svake sekunde
{20000, 900, 50, 1}, //c1
{20000, 1900, 150, 1}, //c2
{20000, 2900, 50, 1}, //c3
{20000, 3900, 150, 1}, //c4
{20000, 4900, 50, 1}, //c5
{20000, 5900, 150, 1}, //c6
{20000, 6900, 50, 1}, //c7
{20000, 7900, 150, 1}, //c8
{20000, 8900, 50, 1}, //c9
{20000, 9900, 150, 1}, //c10
{20000, 10900, 50, 1}, //c11
{20000, 11900, 150, 1}, //c12
{20000, 12900, 50, 1}, //c13
{20000, 13900, 150, 1}, //c14
{20000, 14900, 50, 1}, //c15
{20000, 15900, 150, 1}, //c16
{20000, 16900, 50, 1}, //c17
{20000, 17900, 150, 0}, //c18-samo popunjavanje tablice
{20000, 18900, 150, 0}, //c19-samo popunjavanje tablice
{20000, 19900, 150, 0} //c20-samo popunjavanje tablice
}
Trajanja obrada (.C
) prilagoditi tako da ne bude previše problema s odgovorima, ali opet da ih bude po nekoliko (da se vidi gdje je granica).
Simulacija prekinuta na signal SIGINT
U intervalu [0-37.012] statistika po ulazima:
Ulaz-1: broj promjena stanja: 38
Ulaz-1: prosječno vrijeme reakcije na promjenu stanja: 5 ms
Ulaz-1: maksimalno vrijeme reakcije na promjenu stanja: 150 ms
Ulaz-1: broj neobrađenih događaja: 0
...
Ulaz-11: broj promjena stanja: 7
Ulaz-11: prosječno vrijeme reakcije na promjenu stanja: 15 ms
Ulaz-11: maksimalno vrijeme reakcije na promjenu stanja: 250 ms
Ulaz-11: broj neobrađenih događaja: 1
...
Zajednička statistika:
Broj promjena stanja: 341
Prosječno vrijeme reakcije na promjenu stanja: 15 ms
Maksimalno vrijeme reakcije na promjenu stanja: 450 ms
Broj neobrađenih događaja: 8
t događaj
----------------
0 Ulaz-1: promjena ulaza
1 Upr: započinjem obradu ulaza-1
31 Upr: gotova obrada ulaza-1
40 Ulaz-1: gotova obrada: reakcija: 1 ms
100 Ulaz-4: promjena ulaza
101 Upr: započinjem obradu ulaza-4
151 Upr: gotova obrada ulaza-4
160 Ulaz-4: gotova obrada: reakcija: 1 ms
...