5. naloga

Pekarna

Pekarna Križkraž se je odločila avtomatizirati svoj sistem za peko kruha. Ker gre za kritičen sistem, so se odločili, da bodo namesto enega računalnika uporabili tri. Celoten sistem enkrat na leto ugasnejo, da spihajo moko iz napajalnikov, v vmesnem času morajo računalniki neprekinjeno delovati.

Ker ima vsaka programska oprema napake, so računalnike povezali tako, da vsak nadzoruje druga dva. Če se začne eden od računalnikov napačno obnašati, ga druga dva lahko ugasneta. Vzdrževalec sistema bo potem našel razlog za napako ter računalnik prižgal nazaj.

Vsak računalnik ima dva napajalnika, vsakega od njiju pa nadzoruje po eden od preostalih dveh računalnikov. Računalnika 2 in 3 kontrolirata vsak po en napajalnik računalnika 1; računalnika 1 in 3 kontrolirata vsak po en napajalnik računalnika 2; računalnika 1 in 2 pa kontrolirata vsak po en napajalnik računalnika 3. Na naslednji sliki beli krogi predstavljajo računalnike, sivi pa napajalnike:


Vsak računalnik deluje, če ima vključen vsaj en napajalnik, in je ugasnjen, če sta ugasnjena oba.

Računalniki so povezani z zanesljivim komunikacijskim omrežjem. Na vsakem je pognan program Vahtar, ki predstavlja jedro nadzornega sistema. Program sprejema sporočila (izzive), iz vsakega sporočila po neki funkciji izračuna odgovor in ga vrne računalniku, ki je poslal izziv.

Nadzorni sistem deluje tako, da vsak računalnik enkrat na sekundo pošlje izziv drugima dvema, sprejema odgovore, ki jih vrača program Vahtar, preverja odgovore in po potrebi ugasne napajalnik. No, vsaj delal naj bi tako. Celoten sistem izziv-odgovor (challenge-response) je zasnoval pogodbeni programer, ki je zatem odšel boljšim poslom nasproti in ni dokončal svojega dela. Manjka program, ki bo pošiljal izzive, preverjal odgovore in ugašal napajalnike.

Napiši program, ki bo tekel v vsakem računalniku in ugašal napajalnike računalnikov, ki se ne odzivajo ali se odzivajo z veliko zamudo.

Na razpolago imaš funkcije:

  • Pocakaj() — počaka, da nastopi naslednja sekunda, in nato vrne čas od zagona programa v sekundah (kot celo število);
  • KdoSem() — vrne številko računalnika, na katerem teče program (1, 2 ali 3);
  • Vprasanje(X, msg) — pošlje sporočilo (izziv) msg računalniku X. X je lahko 1, 2 ali 3. Sporočilo je poljubno celo število. Sporočila ne moreš poslati sam sebi — tako na primer klic Vprasanje(KdoSem(), msg) velja za napako.
  • Odgovor(X) vrne odgovor računalnika X. X je lahko 1, 2 ali 3. Rezultat funkcije je 0, če sistem X ni poslal nobenega sporočila, oziroma najstarejše sporočilo (celo število), ki čaka na obdelavo. Odgovora od samega sebe ne moreš dobiti ( Odgovor(KdoSem()) vedno vrne 0).
  • UgasniNapajalnik(X) — ugasne napajalnik računalnika X, ki mora biti eden od tistih dveh, ki ju nadzoruje računalnik, na katerem je pognan program. Če ugasnemo že ugasnjen napajalnik, ne bo nobene škode.

Program Vahtar vsak izziv pomnoži z 2 in vrne dobljeni zmnožek. Če naš program na primer pokliče Vprasanje(3, 21), bo funkcija Odgovor(3) prej ali slej vrnila 42. Dokler računalnik deluje pravilno, seveda ...

Izkazalo se je, da lahko pride do dveh vrst napak.

  • Program Vahtar začne včasih delovati izredno počasi. Včasih se situacija popravi sama od sebe, ob daljšem počasnem delovanju pa želimo računalnik izklopiti. Kadar Vahtar deluje počasi, tudi ne odgovarja pravočasno na izzive. Zato se lahko zgodi, da od računalnika nekaj sekund ne dobimo nobenega odgovora (funkcija Odgovor vztrajno vrača 0), nato pa v eni sekundi dobimo več odgovorov.
  • Vahtar lahko včasih obvisi in odtlej na vsa nadaljnja vprašanja vrača enak odgovor kot na zadnje vprašanje, ki ga je dobil, preden je obvisel.

Drugačnih napak Vahtar ne dela. Na vsak izziv vedno odgovori pravilno, odgovor pa — kadar deluje normalno hitro — vrne praktično takoj. Čas obdelave izziva lahko zanemariš.

Tudi s komunikacijskim kanalom ni težav. Celo, če računalnik pošlje več deset sporočil v hitrem zaporedju in jih ciljni računalnik ne obdela dovolj hitro, bodo sporočila počakala na obdelavo. Prav tako ni pri komunikaciji nobenih napak — sporočila se pri prenosu ne izgubljajo in ne kvarijo. Sporočila vedno dobimo v enakem vrstnem redu, kot so bila poslana.

Tvoj program naj enkrat na sekundo obema drugima računalnikoma pošlje izziv. Sprejema naj odgovore (tudi če jih v eni sekundi dobi veliko) in ugasne napajalnik oddaljenega računalnika v dveh primerih:

  • kadar od računalnika več kot 10 sekund ne dobi nobenega odgovora;
  • kadar od računalnika dobi odgovor na izziv, ki je bil poslan pred več kot 10 sekundami.

Če tvoj postopek pripelje do stanja, v katerem se ugasnejo vsi trije računalniki, naj te to ne moti. S tem se bo ukvarjal naslednji pogodbeni programer.