{ylaoP.}lh,Hk~v\6Z-[}d$rf^T(T ߦi!"L[̇YLڧ5kz2arqp.u;daLƁv_@/IkH+޼d|eH4n`~jQt y&ZNR{+}fs[_]M9rUM*B3cNaċ489|xtR'9qK?q{:G-;d' S|D48d9)T*be/F)^}8 'K4chTiEb'PC5ok"coۙ.G uhrx.4h['Ri,9D9ҰYSz-kp2Ҵ~z^$FWW.Q W LY/*E|>O-K(XE'* amily: courier, fixed, monospace; padding: 5px; border-width: 1px; }

Scheduler O(1)

Wymagania

Chcielibymy aby algorytm szeregujcy zapewnia nam:

Algorytm w Linuksie 2.4

Procesy dziel si na klasy:

Procesy czasu rzeczywistego (SCHED_RR i SCHED_FIFO)

Zwyke procesy (SHED_OTHER)

Wszystkie gotowe do wykonania procesy znajduj si w kolejce runqueue.

Algorytm

  1. Przeszukujemy ca kolejk runqueue obliczajc priorytety dynamiczne poszczeglnym procesom (funkcja goodness()) i wybierajamy spord nich ten o najwyszym priotytecie.
    Koszt: O(liczba procesw gotowych).

  2. Jeli skoczya si epoka dokonujemy przydzielenia wszystkim procesom nowych kwantw czasu wg wzoru:
    kwant = priorytet statyczny + (niewykorzystane jednostki czasu)/2.
  3. Koszt: O(liczba wszystkich procesw).

Funkcja goodness()

Zalety:

Wady:

Algorytm w Linuksie 2.6 (Ingo Molnar)

Nadal mamy do czynienia z priorytetami statycznymi i dynamicznymi, podziaem procesw na klasy oraz epokami. Ale...

Priorytety

Priorytety dla procesw czasu rzeczywistego s z przedziau 0..99, ale teraz im nisza warto tym wyszy priorytet.
Ponadto dla procesw czasu rzeczywistego priorytet statyczny = priorytet dynamiczny.

Zwyke procesy maj priorytety dynamiczne z zakresu 100..139, obliczane wg wzoru:
priorytet = 120 - nice.
Dodatkowo promuje si procesy interaktywne (interaktywno procesu mierzy si na bieco, jej wpyw na priorytet waha si w granicach -5..5).

Struktury danych

W systemie wieloprocesorowym procesy s przypisywane poszczeglnym procesorom, wic dla kadego procesora istniej osobne tablice active i expired.
Rwnowag utrzymujemy przenoszc w razie potrzeby procesy z bardziej obcionego procesora (25% wicej procesw) na inny procesor.

Wybr procesu

  1. Znajdujemy na podstawie mapy bitowej najmniejszy priorytet posiadany przez pewnien proces.
  2. Z tablicy list procesw wybieramy pierwszy o znalezionym priorytecie.
Na rysunku wyglda to tak:

mapa bitowa
tablica](rdo: http://rainbow.mimuw.edu.pl/SR/rok03-04/wierchola/linux-nowy-algorytmy2.html)


A w kodzie:
int idx;
struct list_head queue;
struct task_t next;
struct prio_array_t *array;

idx = sched_find_first_bit(array->bitmap); /* 1. */
queue = array->queue + idx;
next = list_entry(queue->next, task_t, run_list); /* 2. */
Wszystkie powysze operacje wykonywane s w czasie staym :)

Przeliczanie priorytetw dynamicznych

Priorytety dynamiczne przeliczane s w funkcji effective_prio() w nastpujcych sytuacjach:

Interaktywno procesu

W task_struct na zmiennej sleep_avg zliczamy sumaryczny czas spania procesu w oczekiwaniu na jakie zdarzenie pomniejszony o sumaryczny czas wykonywania procesu (przy czym sleep_avg oscyluje w granicach 0..MAX_SLEEP_AVG).
W ten sposb wychwytujemy procesy czsto pice.
Taki sposb ma t dodatkow zalet, e proces interakcyjny, ktry nagle rozpocznie dugie obliczenia szybko straci premi.

Interaktywno procesu ma wpyw na jego priorytet dynamiczny- moe go obniy lub zwikszy o 5.
Ponadto w funkcji scheduler_tick() czasem nie przerzucamy tych procesw na list expired, a wznawiamy:
runqueue_t *rq = this_rq();
task_t *p = current;

if (!--p->time_slice) { f2z췚b#L?cGIJUS ~`|C$8$s߯xƧx8' s㼛2:Vi[F!,cJOz%N^̞=6ǕxX^<# ?XF}8=}|`q\QfbO{6[0y?&qX=xS_}"O#C@3˚/zgFә>R`)6 d$cE5+m: 9pY{M̾tZVA0,ړade)\U[|Kf,w-  B'־dVcEޙt[n^v,mɏ+/$J5hfԍ񚅝RZ^R!jBZcI~GCΛ`@`,{ 0e l;9- o=U?R/.J}f^MYBEjb<73ew?1Ƀ @_2 Og3uz$gzVHAW}ov`4/շ܀A˸_)~ 8~[tRl~}8T#qOI .7߂z#H1 7u)=gmɻB\<*RNvZōa?z{獪Ys0?92Y/%,Hu]Mj?_KTFear6T7sAjH |NKCv xKc+~>sAu#S{!)+sq^[ FxܰoNCZ;YdX`T!iy'o.圑 9%e~MƯ+Czc>*u%s,;=^.jV#561 Tualy@ - U5R: bK W4\8ZÊr~N -Ot0}9)ԱϾAkJ j>+<7}6M}6 /̨j|'(zoSSGϼY09ĭ#{4#" JV5rRF:Gj'J餑wv| Fȥq|\nDӿ-pliHQ0%d&2}Ii%`3}Mk%7F$~G@G=ifU(* }`.`1mb:w=\2gdynv.\u"*\l>#aK [>%4Yҽ\=zXjLLCAg[@JLL&鉯}potakpHa,gdQz7 VP~l{us Kfؠ5D~o}ɒO3 *iBW&(RAHI/bЍ('+ʏGNjj1yEy!\e-~եf'Nk=,>Fdҁ|iⴺ)S!`Pg I\q^Wh# 5<2^ $3*GccG%V8σ_1Vu1᥈Yi)xH a݃>.T4MىK q~|Y9)wTLx~rҒTkDX)׿v;Y~WDw m*E'?(?Mg 6 _b/(b[vBhp霱?l@Y.w\Ga1#є-AүJ|'r-^5Q1~~iǕwvoub|wL1yGP劦Z&l3WW[)V$VVsܬTfE)QzE^YrhV-] KB 747E "?A@Zi#$H>: 5P8y-!x$kPRsu$18^VVHUt$k&+ B+ cT|vSpxbbhnb ,>D18p 8x9 (f:2#e! j9D@` DgTaߜfߋ/-yhmHl9.VTwH=< 3mu7@m'C~uCZ}r!;-M>ֵٜhn9W^67?߯ژOaL,-P)xܽn-}-_9a@  n] H~vw/z]Bu^"z2Ax!BaűtxnX¿~ry %cydz za D|s@jA ARHn:p6@K{|:K{c[o$Ed$ߘ`pqBAdc@p`X`a`aXgaL,)J31T>X, d,"qnAB0 `&c'L[!wHs"`'@_n:nds[ŭ}zu\/ӚF/#)\RU*'\1#0%J ( l.$ZMEΦB{ !1m!֒1hzl