80 likes | 224 Views
Front. Dynamické dátové štruktúry. Príklad Mysliaci operátor. V rámci modernizovania zastaralých technických a technologických prostriedkov priviezli do Výpočtového strediska ústavu pre správu a spracúvanie nových technológií 315 nových strojov a prístrojov.
E N D
Front Dynamické dátové štruktúry
PríkladMysliaci operátor V rámci modernizovania zastaralých technických a technologických prostriedkov priviezli do Výpočtového strediska ústavu pre správu a spracúvanie nových technológií 315 nových strojov a prístrojov. Ako býva dobrým zvykom, tretina sa rozkradla, druhá sa odložila do skladu a posledná sa porozdeľovala všade, len nie do VS. Vedúci si však nakoniec vydupal aspoň jednu farebnú laserovú tlačiareň. Tá sa pripojila do siete, takže ju teoreticky mohli využívať všetci zamestnanci. Teoreticky... Prax bola taká, že ak niekto chcel vytlačiť správu a tlačiareň bola zaneprázdnená (t. j. tlačila už niečo iné), celý kolos (rozumej systém) padol. Vedúci sa teda rozhodol prerobiť systém tak, aby vždy ďalšia zásielka na tlačiareň čakala, kým sa vybaví posledná. Pokiaľ by úloh bolo viac, zoradila by ich za sebou – do radu. Kým bude úloha, ktorá je na prvom mieste v rade spracúvaná, ostatné nebudú zmrazúvať sieť, ale len tich a pokojne čakať...
Rad, do ktorého sa budú úlohy stavať, sa v informatickej teórii nazýva FRONT, alebo FIFO (first in, first out – prvý dnu, prvý von). Znamená to, že úloha, ktorá sa do radu dostane ako prvá, bude aj ako prvá vyriešená. Tlačiareň 1. 2. 3.
Úloha: Napíšte program, ktorý bude simulovať činnosť tlačiarne a jej frontu (t. j. príchod úlohy, vyriešenie úlohy z radu, odoslanie správy o jej ukončení. 1. pridaj úlohu na koniec radu 2. rieš úlohu – tlač 3. koniec pracovnej doby.) Riešenie: Pri fronte, podobne ako pri zásobníku máme prístup len k prvku, ktorý je na začiatku a vieme pridávať na koniec. Front opäť môžme implementovať pomocou poľa a pamätať si (pokiaľ nechceme v každom kroku posúvať celé pole) index políčka (úlohy), ktoré spracúvame a koniec frontu. 2 3 1 9 4 0 0 0 prvý posledný
O práci s frontom pomocou poľa by sa dali vymyslieť a aj boli vymyslené mnohé teórie, no faktom ostáva, že pri poli sme opäť pamäťovo obmedzení jeho rozsahom. Najideálnejšou možnosťou je zasa použitie dynamických štruktúr. Jedna položka frontu môže vyzerať asi takto: Type Ppolozka = ^ Polozka; Polozka = record; Udaj : string; {Údaj zaradený do frontu} Dalsi : Ppolozka; end; Pridávanie potom môže vyzerať nasledovne: Procedure Pridaj; var Pomoc : Ppolozka; begin if Zaciatok_frontu = NIL then begin New (Zaciatok_frontu); Nacitaj (Zaciatok_frontu ^.Udaj); Zaciatok_frontu ^.Dalsi := NIL; Koniec_frontu := Zaciatok_frontu; end else begin
New (Pomoc); Nacitaj (Pomoc ^. Udaj); Pomoc ^.Dalsi := NIL; Koniec_frontu ^.Dalsi := Pomoc; Koniec_frontu := Pomoc; end; end; A odstránenie položky po vykonaní úlohy: Procedure Zrus; var Pomoc : Ppolozka; begin if Zaciatok_frontu > NIL then begin Pomoc := Zaciatok_frontu ^; Zaciatok_frontu := Zaciatok_frontu ^.Dalsi; Dispose (Pomoc); end else Vypis (‘Niet co vyhodit’); end; Zdanlivo nezmyselnú prácu s premennou Pomoc využívame na uvoľnenie pamäte.
Vráťme sa ale späť do VS. Operačný systém, ktorý spracúval úlohy usporiadané vo fronte chvíľu vyhovoval. Ale po čase, keď vedúci potreboval v špičke vytlačiť prospekty pre zahraničných spolupracovníkov čakajúcich v kancelárii a musel čakať vyše troch hodín, zmenil mienku. „To je neúnosné“ – búchal päsťou do stola a nadával operátorovi. „To sa musí zmeniť!!! Ja som šéf a keď niečo chcem, ostatní musia čakať!“ Vyriešte tento problém: Treba spraviť fronty dva. Jeden šéfov – prioritný, kým v ňom budú nejaké úlohy, budú sa tlačiť a všetky ostatné budú čakať. Bude ho obhospodarovať sám veľký šéf. Druhý, bežný front sa bude spracúvať len v prípade, že prvý bude prázdny. Ak medzitým príde zase nejaká úloha do prvého, príde na rad hneď, nebude čakať na vyprázdnenie druhého frontu. 1. 2. - šéfov nečakací front Tlačiareň 1. 2. 3. - bežný front
Napíšte ďalej procedúru, ktorá bude simulovať činnosť vylepšeného operačného systému tlačiarne (fronty nebudú dva, ale tri – aj operátor chce svoje priority). 1. úloha od šéfa 2. úloha od operátora 3. úloha od plebsu 4. spracovanie úlohy 5. koniec