Úrovňový algoritmus slouží k sestavení rozvrhu pro preemptivních úkolů na identických zdrojích při zohlednění relace následnosti (precedence). Algoritmus je aproximační – tj. je optimální pro dva zdroje (procesory). Úrovňový algoritmus byl popsán v roce 1970 R.R. Muntzem a E.G. Coffmanem.
Princip
Sestavení grafu
Algoritmus nejprve zkonstruuje graf závislostí, v němž jsou úkoly vyjádřené pomocí uzlů a relace následností pomocí orientovaných hran (hrana vede vždy z předka do následníka). Dále algoritmus ohodnotí všechny uzly dle následujícího schématu ( značí všechny následníky uzlu ):
Úroveň uzlu je rovna součtu úrovně nejdražšího následníka (0, pokud uzel nemá žádné následníky) a výpočetní době příslušného úkolu. Tímto způsobem dojde k postupnému ocenění úkolů od nejvíce závislých až po iniciální.
Pokud se nyní podíváme na jednotlivé úkoly, tak si všimneme, že jejich úroveň odpovídá délce nejdelší cesty skrz rozvrh – značí množství práce, které musí zdroje vykonat, než bude rozvrh splněn. Algoritmus proto při rozvrhování preferuje ty úkoly, které mají splněné všechny předky a mají nejvyšší úroveň – délka rozvrhu na nich nejvíce závisí.
Rozvrhování
Samotné rozvrhování probíhá v časových kvantech. Na každý zdroj je umístěn úkol s nejvyšší úrovní. Po obsazení všech zdrojů je spuštěno zpracování úkolů na zdrojích na časové kvantum , které odpovídá času do zpracování nejkratšího z úkolů. Po vykonání tohoto kvanta je zpracovaný úkol odstraněn a u částečně zpracovaných úkolů je snížena jejich úroveň o (úroveň se skládá také z délky úkolu a ta je nyní kratší). Na zdroje jsou znovu umístěny úkoly s nejvyšší úrovní (jejichž všichni předci již byli zpracováni), což ale nemusí být nutně ty, které byly částečně zpracovány v minulé iteraci. Algoritmus terminuje v okamžiku zpracování všech úkolů.
Speciální případy
Při přiřazování úkolů na zdroje může dojít k několika dosud nepopsaným situacím. Pokud existuje méně volných úkolů, než je zdrojů, tak tyto zdroje poběží naprázdno.
Pokud naopak existuje více úkolů se stejnou úrovní, než je počet zdrojů, tak jsou na daný zdroj přiřazeny všechny tyto úkoly a jsou vykonávány paralelně – pokud přiřadíme úkolů na zdrojů, tak se časy nutné pro vykonání jednotlivých úkolů znásobí koeficientem . Po terminaci úrovňového algoritmu je nutné tyto části rozvrhu přerozvrhnout pomocí McNaughtonova algoritmu.
Příklad
Rozvrhněte za použití preempce následujích 13 úkolů na 2 identické procesory. Doby zpracování úkolů jsou stanoveny jako , relace následnosti: , , , , , , , , , .
Řešení
Nejprve zkonstruujeme graf a přiřadíme úkolům úrovně.
Nyní provedeme samotné rozvrhování.
Čas | Zdroj 1 | Zdroj 2 | T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | T11 | T12 | T13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | T3 | T2 | 3/12 | 2/18 | 4/21 | 1/9 | 5/16 | 6/17 | 2/6 | 4/8 | 3/11 | 5/8 | 4/4 | 3/3 | 3/3 |
2 | T3 | T1 | 3/12 | 2/19 | 1/9 | 5/16 | 6/17 | 2/6 | 4/8 | 3/11 | 5/8 | 4/4 | 3/3 | 3/3 | |
4 | T6 | T5 | 1/10 | 1/9 | 5/16 | 6/17 | 2/6 | 4/8 | 3/11 | 5/8 | 4/4 | 3/3 | 3/3 | ||
9 | T6 | T1 | 1/10 | 1/9 | 1/12 | 2/6 | 4/8 | 3/11 | 5/8 | 4/4 | 3/3 | 3/3 | |||
10 | T9 | T4 | 1/9 | 2/6 | 4/8 | 3/11 | 5/8 | 4/4 | 3/3 | 3/3 | |||||
11 | T9 | T10 | 2/6 | 4/8 | 2/10 | 5/8 | 4/4 | 3/3 | 3/3 | ||||||
13 | T8 | T7, T10 | 2/6 | 4/8 | 3/6 | 4/4 | 3/3 | 3/3 | |||||||
17 | T10 | T11 | 1/4 | 4/4 | 3/3 | 3/3 | |||||||||
18 | T11, T12, T13 | 3/3 | 3/3 | 3/3 | |||||||||||
22,5 |
Nakonec přerozvrhneme pomocí McNaughtonova algoritmu ty části rozvrhu, ve kterých je více úkolů než zdrojů. Na druhém zdroji proto v čase necháme vykonat úkol , v čase pak úkol . Úkol bude vykonáván na prvním zdroji v čase , úkol bude vykonáván na prvním zdroji v čase a na druhém zdroji v čase a konečně úkol bude vykonáván na druhém zdroji v čase .
Literatura
- HANZÁLEK, Zdeněk. Kombinatorická optimalice - slides k přednáškám.