Završni ispit iz predmeta: Sustavi za rad u stvarnom vremenu 27. 6. 2019. Odgovarati kratko, jasno i čitko nečitki odgovori su krivi. 1. [1 bod] Koji postupak raspore divanja nazivamo optimalnim? Navesti primjer. onaj kojim možemo rasporediti sve sustave zadataka koje mogu rasporediti i svi drugi postupci u istoj klasi raspore divača primjeri: - RMPA u klasi jednoprocesorskih raspore divača sa statičnom pridjelom prioriteta - EDF u klasi jednoprocesorskih raspore divača 2. [1 bod] Skicirati oblik koda dretve koja se raspore duje prema krajnjim trenucima završetka. Osim postavljanja parametara raspore divanja, koje pozive dretva mora pozvati a da bi raspore divač radio? edf-dretva postavi_raspore divanje ( EDF, period ) ponavljaj odradi_periodički_posao odgodi()/prepusti_procesor() 3. [1 bod] Navesti moguće probleme u korištenju mehanizma signala (npr. kada bi se Linux koristio u nekom SRSV-u, što treba paziti pri korištenju signala, što se može, što ne,...). - kad blokirana dretva dobije signal, ovisno o razlogu blokiranja različito reagira (prihvaća signal i vraća u blokirano stanje ili vraća grešku) - "pamćenje" samo jednog signala istog tipa na čekanju (osim ako nisu "prošireni" signali) - "puno" ostvarenje je na razini procesa, ne dretvi * nema pravu podršku za SRSV - puno neodre denosti kad se koriste raspore divanja SCHED_FIFO/RR - koji je prioritet signala/obrade - što kad RT dretva dobije signal? 4. [1 bod] Navesti nekoliko problema na koje treba paziti kada sustav koristi višeprocesorski sustav ili procesor s više jezgri. - kad se koristi višedretvenost mora se koristiti sinkronizacija (npr. zabrana prekida više nije dostatna kao na jednoproc.) - paralelnim radom dretva manjeg prioriteta utječe na dretvu višeg prioriteta jer koristi zajedničku sabirnicu, priručni spremnik procesora, UI naprave, pozive jezgri 5. [1 bod] Navesti osnovna svojstva operacijskih sustava za SRSV kojima se oni izdvajaju od ostalih tipova operacijskih sustava. - vrlo brza reakcija na doga daj (prihvat prekida, predvidljiva maksimalna odgoda) - raspore divanje (prema prioritetu barem) - priritetno korištenje UI naprava - determinističko ponašanje svih elemenata sustava
6. [2 boda] Zadan je sustav zadataka koji se raspore duje prema krajnjim trenucima završetaka (engl. earliest deadline first EDF): T 1 : T 1 = 10 ms, C 1 = 2 ms T 2 : T 2 = 15 ms, C 2 = 9 ms T 3 : T 3 = 20 ms, C 3 = 12 ms T 4 : T 4 = 30 ms, C 4 = 15 ms Simulirati izvo denje sustava na dvoprocesorskom sustavu do t = 30 ms ili do trenutka kad se neko ograničenje bilo kojeg zadatka prekorači. Dodatni kriterij, kada EDF nije jednoznačan, neka bude manja labavost. 4 4 3 3 2 2 2 1 1 1 1 t: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 P1: 2 2 2 2 2 2 2 2 2 4 1 1 4 4 4 4 4 4 4 4 4 4 4 4 4 4 ------- P2: 1 1 3 3 3 3 3 3 3 3 3 3 3 3-2 2 2 2 2 2 2 2 1 2 1 3 3 3 3 (ili P2: 1 2 1 2 3 3 3 3) 7. [2 boda] Neki zadatak treba izvoditi svakih 50 ms, sa što manjim kašnjenjem (idealno baš svakih 50 ms). Za to je napravljena dretva sa sljedećim kodom. void *z5 ( void *x ) { struct timespec t = {.tv_sec = 0,.tv_nsec = 5000000 }; while (1) { periodicki_posao (x); //funkcija postoji clock_nanosleep ( CLOCK_REALTIME, 0, &t, NULL ); } } Navesti sve moguće probleme navedena koda i kako ih (pokušati) otkloniti. * tv_nsec = 50000000 (treba dodati nulu, inače je 5 ms!) * clock_nanosleep: - granulacija sata može biti premala + postaviti veću u OS-u - ažuriranje sata u me duvremenu zbog CLOCK_REALTIME + koristiti CLOCK_MONOTONIC - prekid signalom dok je dretva odgo dena (clock_nanosleep) + odspavati neprospavani dio - uvijek provjeriti povratnu vrijednost! * periodički posao može trajati (pre)dugo + ispitati trajanje prije, pa umanjiti spavanje + koristiti odgodu "do" trenutka, a ne relativnu * dretve većeg prioriteta istiskuju ovu + povećati prioritet * dodati "return NULL" na kraju funkcije (z5 je tipa void *) 8. [2 boda] Petrijevom mrežom modelirati polaganje predmeta SRSV kroz kontinuiranu nastavu. Podsjetnik: da bi se predmet položilo treba prvo odraditi vježbe 0, 1, 3 i 5, uz opcionalne 2, 4 i 6 te skupiti barem pet bodova ukupno iz njih. Nadalje, treba skupiti barem 10 bodova na pismenom dijelu završnog ispita, na usmenom biti pozitivno ocijenjen i dobiti
neke bodove (zanemarimo mogućnost negativnih bodova na usmenom) te ukupno skupiti 50 bodova (uključujući i me duispit koji nosi do 30 bodova). Za svaku aktivnost koju je student prošao (zadovoljio, npr. skupio dovoljno bodova) neka se koristi "doga daj" (ulazna tranzicija), npr. L0, L1,... Da bi student prošao, sve potrebne aktivnosti se trebaju dogoditi i odgovarajući bodovi moraju se prikupiti (po aktivnostima, ukupno). Broj bodova za neku aktivnost (koja se dogodila) računati s bod(aktivnost) (npr. kao broj tokena iz istog prijelaza koji označava doga daj). Neka mreža ima konačno stanje S P koje označava prolaz predmeta samo kada token do de u ovo stanje. Dok neka od aktivnosti nije ostvarena, ili neki broj bodova nije jednak traženom pragu, sustav ne smije doći u konačno stanje. Doga daji (ulazni prijelazi): L0-L6, MI, ZIP, ZIU Stanja: S-prolaz - skuplja tokene za prolaz labosa (4+1) S-bod-lab - bodovi iz labosa S-bod - ukupni bodovi S-P - konačno stanje Nije provjeravan prag na ZIP jer kaže u tekstu "Za svaku aktivnost koju je student prošao" (znači ako je doga daj, onda je student prošao tu aktivnost). (broj obaveznih vježbi i njihovih bodova + ZIP, ZIU) 1 --------> (S-prolaz) L0 --------> (S-bod-lab) bod(l0) slično za: L1, L3, L5, ZIP i ZIU (broj bodova za neobavezne vježbe) L2 --------> (S-bod-lab) bod(l2) slično za L2, L4 MI --------> (S-bod) bod(l2) (provjera minimalnih bodova za labose) 5 1 (S-bod-lab) ---------> ---> (S-prolaz) /--> ---> (S-bod) (računam i tih 5 u zbroju) (pomoćno stanje / 5 s jednim tokenom)\ \--O (uzimam sve ostale bodove (S-bod-lab) ---------> ---> (S-bod) iz labosa) (konačno) 7 (S-prolaz) ---> ---> (S_P) (S-bod) ---> 50 9. [3 boda] U nekom jednoprocesorskom sustavu se nalaze 4 dretve, svaka zadana s prioritetima i sredstvima (semaforima) koje koristi u svom izvo denju, prema priloženoj tablici.
Dretva Prioritet Sredstva D 1 20 S 1, S 4 D 2 15 S 1, S 2 D 3 10 S 3, S 4 D 4 5 S 1, S 3, S 4 Dretve se (ponovno) javljaju u trenucima: D 3 u 1., D 2 u 3., D 1 u 7. te D 4 u 8. jedinici vremena. Svaki zadatak D i kad dobije procesorsko vrijeme odmah pokuša zauzeti semavor S i. Ako/kada ga zauzme treba 3 jedinice procesorskog vremena, otpušta semafor te završava s radom. Pokazati što će se zbivati u sustavu dok sve dretve ne završe s radom, ako se koristi prioritetno raspore divanje te izvorni protokol stropnog prioriteta. (jednoprocesorski sustav) P1: D3+S3 D2+S2 D3S D1+S1 D4+S4 0 1 2 3 4 5 6 7 8 9 0 1 2 3 D3 D2 D1 D4 -D2 -D3 -D1 -D4 (višeprocesorski sustav) P1: D3+S3 ------------------------------------- P2: ------- D2+S2 --- D1+S1 D4+S4 0 1 2 3 4 5 6 7 8 9 0 1 2 3 D3 D2 D1 D4 -D3 -D2 -D1 -D4 10. [3 boda] U nekom raspodijeljenom sustavu nalaze se tri čvora: A, B i C. Čvor A upravlja sustavom, tj. šalje upravljačke naredbe čvorovima B i C. Me dutim, da bi to mogao potrebno je poznavati razlike u satovima te kašnjenja pri slanju poruka me du čvorovima. Stoga čvor A povremeno šalje poruku čvoru B koji ju nakon nadopunjavanja šalje čvoru C koji pak nakon nadopunjavanja šalje poruku natrag do B-a koji opet nakon drugog nadopunjavanja šalje poruku čvoru A. Svaki čvor pri primitku poruke, nju proširuje vrijednošću lokalnog sata i odmah proslije duje dalje (vrijeme zadržavanja u čvoru se može zanemariti). Poznato je da su veze me du čvorovima simetrične jednako traje slanje poruke u jedno i drugom smjeru. Tako der, satovi u čvorovima B i C su znatno manje precizni, odnosno idu 1% brže od sata u čvoru A. Prilikom jednog slanja sadržaj jedne poruke na kraju puta (u čvoru A) je: poruka = {t A,1 = 10000, t B,1 = 12345, t C,1 = 13579, t B,2 = 12446, t A,2 = 10300}. Izračunati vrijeme u čvorovima B i C u trenutku primitka navedene poruke (u lokalnim satovima tih čvorova). A B C 10000 -> 12345 -> 13579 10300 <- 12446 <- A-B-C-B-A: 10300-10000 = 300 po satu čvora A B-C-B: 12446-12345 = 101 po satu čvora B, 100 po satu čvora A B-C = 100/2 = 50 (simetrična veza, po satu od A) A-B-A = 300-100 = 200 (simetrična veza, po satu od A) A-B = 200/2 = 100 A-C = 300/2 = 150 U trenutku kad A primi poruku natrag: ta = ta2 = 10300 tb = tb2 + tba * 1,01 = 12446 + 100*1,01 = 12446 + 101 = 12547 tc = tc1 + tca * 1,01 = 13579 + 150*1,01 = 13579 + 151,5 = 13730,5
11. [3 boda] Neko električno vozilo (npr. el. bicikl) je upravljano mikroračunalom. Radi optimalnog rada i očuvanja svojstava posebne baterije treba poštivati odre dena ograničenja. Sve vrijednosti su izražene u postocima maksimalnih vrijednosti (od 0-100). a) Provjere zahtjeva vozača raditi svakih 200 ms, a odluke upravljanja donositi svakih 50 ms (odluke upravljanja trebaju imati prednost). b) Zahtjev vozača za snagom treba očitavati funkcijom req_power(). c) Postavljanje snage prema elektromotorima raditi funkcijom set_power(power). d) Zahtjev vozača za kočenjem pratiti preko sučelja req_breaks(). e) Kada je zahtijevana snaga kočenja veća od nule koristiti sustav za iskorištenje kinetičke energije za punjenje baterije, funkcijom kers(power) uz jednaku snagu kočenja pritom postaviti na snagu pokretanja na nulu (i obratno). f) Kada je zahtjevana snaga kočenja veća od 50% brzinu gibanja je potrebno pratiti s get_speed() te po potrebi (uz kers(power)) uključiti i mehaničke kočnice preko set_breaks(power) tako da zaustavljanje prati postavljenu snagu kočenja brzina mora opadati barem za zadani postotak svakih 10 sekundi (ali to prilago davati svakih 50 ms), ako već dostatno opada onda ne koristiti mehaničke kočnice!). g) Stanje baterije očitavati funkcijom capacity(). Kada je baterija napunjena preko 90% kapaciteta, tada se ne smije koristiti više od 70% od maksimalne snage; za stanje ispod 30% snagu treba ograničiti na 50%, a za stanje manje od 5% snagu pokretanja treba postaviti na nulu. Uz pretpostavku da sve navedene funkcije postoje, napisati upravljački program. Pretpostaviti postojanje operacijska sustava za SRSV sa svim potrebnim sučeljima. //iako u postocima, sve vrijednosti su realne! power = break = 0 //ulazi speed = 0 //zadnja brzina break_force = 0 //zadnje stanje kočnica - mehaničkih program t_ctrl = 0 // ili time_ms() t_io = 0 // ili time_ms() repeat t = time_ms() if t_ctrl <= t + 50 t_ctrl += 50 update_ctrl() if t_io <= t + 200 t_io += 200 update_io() delay_until (t+50) //i nije bitno/potrebno update_io() power = req_power() break = req_breaks()
update_ctrl() battery = capacity() if battery > 90 new_power = 70 else if battery < 5 new_power = 0 else if battery < 30 new_power = 50 else new_power = 100 power = min(power, new_power) new_speed = get_speed() if break == 0 && power > 0 new_power = power new_kers = 0 break_force = 0 else if break > 0 new_power = 0 new_kers = break if break > 50 && speed > 0 //promjena brzine u postocima dec = speed - new_speed / speed * 100 //skalirano na 10 sekundi dec = dec * 10/0.05 if dec < break break_force = min ( break_force+5, 100 ) else break_force = max ( break_force-5, 0 ) else break_force = 0 set_power(new_power) kers(new_kers) set_breaks(break_force) speed = new_speed