Task Scheduler
(Opre hf I)
Ez a projekt az operációs rendszerekből kiadott első fakultatív házi egy megoldása. Egy ütemezőt valósítottam meg, ami a beérkező taszkokat ütemezi prioritás szerint. A kód a 2017/2018 tavaszi félévben íródott.
Az alkalmazás a HF portálon maximális pontot ért.
A feladat szövege
Készítsen egy programot, amely statikus többszintű ütemező működését szimulálja!
A globálisan preemptív, statikus prioritásos ütemező az alábbi ütemezési algoritmusokat futtatja az egyes szinteken az előadáson ismertetett módon:
- kernel szint (prioritás = 0, magas) SRTF ütemező
- felhasználói szint (prioritás = 1, alacsony) RR ütemező, időszelet: 2
Elvárt bemenet: (standard input)
Soronként egy (max. 10) taszk adatai. Egy sor felépítése (vesszővel elválasztva):
a taszk betűjele (A, B, C...) megfelel az érkezési sorrendnek a taszk prioritása (0 vagy 1) a taszk indítási ideje (egész szám >= 0), a következő időszeletben már futhat (0: az ütemező indításakor már létezik) a taszk CPU-löketideje (egész szám >= 1)
Példa:
A,1,0,5 B,1,1,4 C,0,5,3 D,0,6,1
A bemenet végét egy üres sor (utána EOF) jelzi.
Kimenet: (standard output)
A kimenet első sorában a taszkok futási sorrendje betűjeleikkel (csak betűk, szóközök nélkül). A második sorban a teljes várakozási idő taszkonként, érkezésük (nem feltétlenül abc-) sorrendjében, az alábbi formában (vesszővel elválasztva, szóközök nélkül):
- taszk betűjel:várakozási idő,2. betűjel:várakozási idő, ...
Példa (a fenti bemenetre adott válasz):
ABACDCBA A:8,B:6,C:1,D:0
Az egyes osztályok
A megoldás Java nyelven íródott, és a következő osztályokat tartalmazza:
- Main: A számítógépet szimulálja. Elvégzi a beolvasást és a kiírást, szimulálja a processzor órajelét és a beérkező taszkokat a megfelelő órajelben az ütemezőnek adja.
- Global: A globális ütemező. Kezeli a két prioritási szint ütemezőjét és naplózza, hogy mikor melyik taszk futott.
- SRTF: Egy SRTF (shortest remaining time first) ütemezőt valósít meg. Ez tartozik a magasabb prioritású (kernel) folyamatokhoz.
- RR: Egy round-robin ütemezőt valósít meg. Ez tartozik az alacsonyabb prioritású feladatokhoz, ezért leállítható és újraindítható.
- Task: Egy taszkot reprezentál.
Így használd
Jobb felül, a fájlok listája fölött látsz egy Download gombot (felhőcskéből lefelé mutató nyíl,) azzal le tudod tölteni a projektet tömörítve. VAGY
Ha már használtál gitet, akkor klónozd le a repót a git clone https://git.sch.bme.hu/schulczf/taskscheduler.git [célmappa]
paranccsal! (Ha még nem használtál, akkor itt van egy gyors tutorial. Próbáld ki, nagyon hasznos!)
Tanácsok
A házi írása közben belefutottam pár figyelmetlenségbe/nem triviális dologba, szóval összegyűjtöttem pár dolgot, ami neked is jól jöhet:
- Ez csak egy mintamegoldás, a te házid már tuti nem ugyanez. Ne próbáld meg ugyanezt a kódot használni vagy ezt átírni, inkább értsd meg hogy hogyan működik! Direkt a te kedvedért kommenteztem egész végig. :)
- A taszkokat általában az érkezésük sorrendjében tároljuk és dolgozzuk fel. De ha két taszk egyszerre érkezik, akkor az input sorrendjében érkeztek. A beadóportál nem engedte meg, hogy felcseréld őket. Két taszk érkezhet ugyanabban az órajelciklusban, de egyszerre sosem - legalábbis a HF portál szerint.
- Amikor az alacsony prioritású ütemezőtől elvesszük a futás jogát, akkor az esetleg éppen futó taszkja a várakozási sor végére kerül. Amikor visszakapja a futás jogát, mert nincs több magas prioritású taszk, nem az előbb éppen futó taszk folytatódik, hanem a sor legelején álló kap egy teljes időszeletet.
- Ha egy órajelben egyszerre érkezik egy magas és alacsony prioritású taszk is, akkor előbb a taszkok hozzáadódnak a megfelelő várakozási sorhoz és az alacsony prioritású ütemezőtől csak a következő órajel elején vesszük el az ütemezés jogát. Ez azt jelenti, hogy az éppen futó taszk az újak mögé kerül.
Sok sikert!