LAB1. Upravljačka petlja


Uvod

Mnogi sustavi za rad u stvarnom vremenu svoje upravljanje ostvaruju jednostavnom petljom u kojoj provjeravaju sve komponente sustava. Zadatak ove vježbe je napraviti simulaciju takva sustava, ali korištenjem operacijska sustava opće namjene. Zbog simulacije koriste se milisekunde i sekunde za trajanje obrade i duljine periode. U stvarnim sustavima bi bile manje jedinice (mikrosekunde). Problem s manjim vremenima jest u rezoluciji sata OS-a. Npr. nanosleep u Linuxu radi u rezoluciji 1 ms.

Upravljač simulirati jednom dretvom u jednom procesu (programu), a ulaze simulirati drugim programom.

Predložak koji se može (ali i ne mora) koristiti za izradu vježbe dan je u repozitoriju.

Tablica 1. Skica simulatora
simulator upravljača ulaz-1:
← zahtjev ←
→ odgovor →
simulator ulaza
ulaz-2:
← zahtjev ←
→ odgovor →
...
ulaz-N:
← zahtjev ←
→ odgovor →

Za svaki ulaz treba definirati:

  1. trenutak t0 prve pojave događaja na ovom ulazu (relativno u odnosu na pokretanje simulacije ulaza)
  2. trajanje obrade C.
  3. rok završetka D.
  4. periodu T u kojoj se promjena događa (očekivano: C < D < T)
Definiciju ulaza napraviti kroz datoteku. Format je prikazan u primjeru u repozitoriju. Programi simulatora ulaza i simulatora kontrolera moraju biti odvojeni programi koji međusobno komuniciraju (npr. preko zajedničke memorije, kao u predlošku).

U simulaciji treba pratiti statistiku vremena potrebnog od promjene stanja do započinjanja obrade, te do kraja obrade. Obrade koje su završile prekasno dodati u statistiku neobrađenih promjena ulaza (ali ih obračunati u statistici). Razlikovati kašnjenja nakon roka (D) i veća kašnjenja nakon periode (T).


Skica rješenja

Pseudokod simulatora

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

simulator ulaza
{
	dok nije označen kraj simulacije {
		za i = 1 do N { //za svaki ulaz
			ako je (ulaz "i" nije još aktivan) {
				ako je (je li došlo vrijeme aktivacije?) {
					postavi zahtjev na ulaz
					zabilježi trenutak zahtjeva
					označi si da je ulaz sad aktivan
				}
			}
			inače {
				//znači da je ulaz aktivan, čekam odgovor
				ako je dobiven odgovor {
					//je li dobiven na vrijeme (prije D)?
					//ažuriraj statistiku
					//pripremi ulaz za iduću pojavu
				}
				inače {
					ako je (odgovor kasni za više od T) {
						povećaj "nema odgovora" u statistici
						//možda još nešto, npr. .iduća_pojava += T
						//ipak čekaj taj odgovor, ne slati novi zahtjev
					}
				}
			}
		}

		odspavaj 1 ms (u simulaciji)
	}

	//na kraju
	izračunaj i ispiši statistiku po svakom ulazu te sumarno za sve
}

Koraci u rješavanju

Ispitni primjeri

Prije same izrade programskog rješenja vježbe, potrebno je napraviti i nekoliko primjera ulaza i očekivanog ponašanja sustava za svaki. Oni se trebaju koristiti pri izradi programa za provjeru ispravnosti.

Minimalno treba napraviti šest primjera ulaza (tj. načina događaja na njima):

  1. samo jedan periodički ulaz
    1. normalan: C < D < T
    2. loš: D < C < T (D se prekoračuje, ali ipak obavlja prije T)
    3. jako loš: D < T < C (bar svaki drugi neće stići)
  2. nekoliko zadataka (npr. tri/četiri)
    1. normalni sustav - sve se stigne prije D
    2. neki ne stignu do D, ali svi prije T
    3. neki ne stignu do T
Za svaki primjer skicirati očekivano ponašanje sustava kroz vrijeme. Npr. ako imamo ulaze:
#id	prio	first	T	C	D
inp-1	5	20	100	10	50
inp-2	6	30	300	20	100
inp-3	1	80	200	30	100
inp-23	4	70	500	50	50
inp-11	7	50	900	15	100
onda bi početak rada sustava trebao izgledati:
t	što procesor radi
0	-
5	-
10	-
15	-
20	PROMJENA inp-1
20	inp-1 počinje obrada
25	inp-1 (u obradi)
30	inp-1 gotov
30	-			(ovo se može i ne mora dogoditi)
30	PROMJENA inp-2 		(može i prije, vidi t=50)
30	inp-2 počinje obrada
35	inp-2 (u obradi)
40	inp-2 (u obradi)
45	inp-2 (u obradi)
50	PROMJENA inp-11
50	inp-2 gotov
50	inp-11 počinje obrada
55	inp-11 (u obradi)
60	inp-11 (u obradi)
65	inp-2 gotov
65	-
70	PROMJENA inp-23
70	inp-23 počinje obrada
75	inp-23 (u obradi)
80	PROMJENA inp-3
80	inp-23 (u obradi)
85	inp-23 (u obradi)
90	inp-23 (u obradi)
95	inp-23 (u obradi)
100	inp-23 (u obradi)
105	inp-23 (u obradi)
110	inp-23 (u obradi)
115	inp-23 (u obradi)
120	PROMJENA inp-1
120	inp-23 (u obradi)
125	inp-23 (u obradi)
130	inp-23 gotov
130	inp-1 počinje obrada	(*zašto inp-1 a ne inp-3? komentar ispod)
[...]
U t=130 dva ulaza čekaju obradu, inp-3 koji se javio u t=80 i inp-1 koji se javio u t=120. Bolje bi bilo da se ulazi obrađuju po redu prispijeća ili da se koriste prioriteti. Ali ovdje se ne koristi ni jedno ni drugo - upravljač redom pregledava ulaze nakon što obradi prethodni - on nema informaciju što se prije dogodilo. Zato u ovom primjeru, prema gornjem pseudokodu upravljača, nakon inp-23 idući u nizu je inp-11, pa onda opet ispočetka, inp-1, inp-2, inp-3...

Simulacije napraviti do trenutka kad konačno dođe do izražaja željeno svojstvo sustava (npr. da svi obave prvi puta sve, ili neki zadatak prekorači rok D ili T).

Simulacije postaviti u repozitorij, u datoteke test-x.txt, gdje x zamijeniti rednim brojem. Na početku postaviti opis sustava. Npr. za prikazani primjer, datoteka bi mogla biti test-5.txt:

#id	prio	first	T	C	D
inp-1	5	20	100	10	50
inp-2	6	30	300	20	100
inp-3	1	80	200	30	100
inp-23	4	70	500	50	50
inp-11	7	50	900	15	100

t	što procesor radi
0	-
5	-
10	-
15	-
20	PROMJENA inp-1
20	inp-1 počinje obrada
[...]

Programi

Drugi dio vježbe je, naravno, izrada programa simulatora upravljača i programa simulatora ulaza, prema opisanome. Može se, ali i ne mora koristiti predložak.

Provjeriti da programi rade ispravno, prema prethodnim simulacijama.

U repozitorij postaviti samo izvorne kodove i tražene datoteke sa ispitnim primjerima - ne i međurezultate prevođenja, ne izvršne verzije programa. Ukoliko koristite neki IDE koji stvara dodatne datoteke, njih ne postavljati u repozitorij!