Skip to content
Snippets Groups Projects
schulczf's avatar
Schulcz Ferenc authored
8fcba5ce
History
Name Last commit Last update
src
README.md

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:

  1. kernel szint (prioritás = 0, magas) SRTF ütemező
  2. 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):

  1. 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!