do spisu tresci tematu 7

7.2.2 Szeregowanie zadan


Spis tresci


Struktury danych

Kazde urzadzenie blokowe, a wlasciwie program jego obslugi, ktory moze obslugiwac kilka urzadzen, ma w opisujacej go strukturze blk_dev_struct wskaznik na posortowana liste zadan (nie mylic z zadaniami). Kazde zadanie opisane jest przez dluga strukture request zdefiniowana w pliku include/linux/blkdev.h.

struct request {
	volatile int rq_status;
	kdev_t rq_dev;
	int cmd;
	int errors;
	unsigned long sector;
	unsigned long nr_sectors;
	unsigned long current_nr_sectors;
	char * buffer;
	struct semaphore * sem;
	struct buffer_head * bh;
	struct buffer_head * bhtail;
	struct request * next;
}

rq_status
moze przyjmowac wartosc: RQ_ACTIVE - zwykle zadanie, RQ_INACTIVE - zadanie juz wykonane, RQ_SCSI_BUSY, RQ_SCSI_DONE, RQ_SCSI_DISCONNECTING - jak latwo sie domyslec dotycza urzadzen SCSI,
rq_dev
okresla urzadzenie (numer glowny i drugorzedny), do ktorego skierowane jest zadanie
cmd
rodzaj zadania, moze byc rowny READ albo WRITE;
errors
licznik bledow otrzymanych podczas realizowania zadania - jesli przekroczy pewna wartosc, okreslana przez program obslugi urzadzenia, to zadanie zostaje usuniete i nieobsluzone,
sector, nr_sectors
kazde zadanie dotyczy zwartego fragmentu urzadzenia, opisywanego przez poczatkowy sektor i dlugosc fragmentu,
current_nr_sectors
liczba sektorow, ktora pozostala do wczytania/zapisania,
buffer
wskaznik do danych zawartych w buforach
bh, bhtail
wskazniki na poczatek i koniec listy buforow odpowiadajacych fragmentowi urzadzenia
sem
semafor uzywany przez programy obslugi urzadzen SCSI i przy korzystaniu z pliku wymiany;

Zadania dla wszystkich urzadzen blokowych znajduja sie w tablicy all_requests o wielkosci 64 elementow, z czego 2/3 moze byc zajete przez zadania zapisu. Proces, ktory chce zlecic urzadzeniu operacje wejscia-wyjscia, a nie znajdzie wolnej pozycji w tablicy all_requests zawiesza sie na kolejce wait_for_request.
Po wstawieniu do tablicy, kazde nowe zadanie wstawiane jest na liste zadan dla konkretnego programu obslugi urzadzenia. Tak zwany Algorytm windy ( Elevator algorithm) wstawia zadanie na wlasciwe miejsce utrzymujac liste posortowana leksykograficznie po numerach drugorzednych urzadzenia, do ktorego zadanie jest skierowane (numery glowne urzadzen w obrebie kolejki sa takie same), i po pierwszym sektorze, ktorego zadanie dotyczy. W starszych wersjach Linuxa zadania czytania umieszczane byly przed zadaniami zapisu, stwierdzono jednak lepsze dzialanie systemu przy rownorzednym traktowaniu operacji.


Szeregowanie zadan

Funkcja ll_rw_block zdefiniowana w pliku
drivers/block/ll_rw_blk.c jest uzywana przez wszystkie urzadzenia blokowe, a sluzy do spelniania skierowanych do nich zadan. Zanim opisze ja dokladniej, przedstawie pomocnicze funkcje uzywane do utworzenia nowego zadania i wstawienia go do kolejki.

Funkcja add_request

wstawia zadanie umieszczone juz w tablicy all_requests na wlasciwe miejsce w kolejce zadan urzadzenia.

DEFINICJA:
void add_request( struct blk_dev_struct * dev,	
				/* wskaznik na strukture opisujaca urzadzenie */
		 struct request * req )
				/* wskaznik na strukture opisujaca zadanie  */
{
    wylacz przerwania (cli);
    zaznacz bufor zadania jako czysty (mark_buffer_clean);
    if( w kolejce urzadzenia nie ma zadan )
    {
        wstaw zadanie na poczatek kolejki;
        wywolaj procedure str|3l:!؛8)SƩe376B"38ZL	X-
Oa];'3@/+Z9[؅ڌFDŽX@x4ks0K|;7F)[E=\SD'lU#jϛ_mjtX
%7)jܦٽ9%q1ZBaDB2`ńǵD0\INQ9Gj.-C:z
\Бxx	RrndR39ڄ槪?nY,̊"qAG1ѼI\\G]
&zH*]'[U~~X4
/"$i6D=58lVo˱~2łk.SBGk60AP"WsĚԽe7^4LF5a?90)dW3"$.3Z
sXRLww:=OE?s&G& tB?GRɬsZH
XWھNl3kU+vsuuz7Ks%Z޿́p@KNܚI!烂!	Z,sx^DPdw\ռ7.>wGD8ĄN9Rhys,HVkZ3gkEIVM!E?c4+JHd8t*i@]fSVUa>ghCi`{>7cqO)I(cxHA>GW0Q3Zܾ\em+9K0Dm̠"pCg$Xkdgc"Sꘛ63dV5oB#sEF?PEZA1AV%t*۸vb%jN{[0DL]Q#" b{6++E|wh`U*c:c.ŠӖpKh$B:5Ǣ)|(AcJ$35%FA$5߂.C88o`nLLO ]q	6y;MZ2>[	v%$fWFB+:Lp-h(`;0pֆx&G4~e?pO?;'X@ճ膣W_Q(
Nrb;,D ^-!ӷϚ{6wKSIinqB#3(,%(.4O3'-/\Cxj IIZIP2
A7'9Y
I"?܂I&J*(d8|ߩB8NU!~l|	HnlCǠmn%]d0~z.T*
 o鲥r >%
F/GR%qʧ	(%aY-v=ng^+\D9WՁqd,wz@2>-T}}Ěi1c4Cc
ڏ{K'K>h}:ym
"Ǔ"5!MK%e&aYelDPg
gj\Avp0-luR?knzC3g]rx0i2ZŷHKEo2ܰPQ<:P3:Mh0;2?jY:ы;scevb<]Pft.*	C9u#+n@(=l`
V>ۗ.[R)@psyTsςAq;IiO'g?^B6132JImNz?&".7҄NywakwOXbTeEC13Y }Z#֘L͔5c5
i
j}5HZZLQОs(5>p>Z?F
!)GXN!`]};Iq-n||j$^I$PUPY?Ld1JVªEAET`DSKI`AQYPPQUW-4E,H*$Th($PD0b"1bEDQ
E*ۉEE~E
iJp0i`[
2O0)T84S	
QUdm(XbTD}%,0_4aE=IC8r*łJ|ƀ`
U౳~~#@`r(3,W#C?0A/N'8$8u@ br!Zv~kQ)RμVzOاAgH7H/UT_蹵!Ҟ'מCf#]jGTRfzkLliy+_" dP
ϴ[&M($"D˅~OmiÖV5ɪ9y_>;(hjM03k?%6x?D=Tk${v0kU߭h{3CAiW/T/S0A
-waQW&Law;Z_L2fBK~mTx	 t$%DK.{G(IJkO~NpCD4‘Sʟkꠤ,hwlU.zNMaIJex#|,6汅^Z\^|y<8K种}s5#]Ɨvb"(h9L%Gј?n.h66>Ggp:m6o;m&U/KH_v+MgVzIAq]'co983Yb!ќmafuw+e
G}\@<Iׅ8O[#	J-'aJ A![Koן:Wf^mc_#6s=Ϋt:zXHUf̖̱tPΟZXBťֽd%z
7t\c>bI{hwJl]K v:mCKB2(ǽFn>~ZwW\6/'-X{U9,y>#36ȡZEqᑟ;D;iVjoR	߳(4rewRj՞bkx}A3G.LM GΊFג!ֲA] =BG`qT&1=̀M\?!oqxor;05J4uI-q'*GCdt?ړ$1.npgN˯W9Qj=Iv|͌Ha@;mئ,ez_0՚jyK|L(P$G$=@<-} ޢnr?,4!*=ȝ1CEHl!T;s4G:tw,JפWߑz;I0ϯ,MVWI=@8mbӪD23Lgя@ƹ-jKjm/{Iz(~
ǡ$P&#ۭ~ ^{^mE2oB3cZ~䌹%~uY&\hc턞x8)Se'ytD~ |⟥x?v$H!Ms,`PRG寕xٸ2Й>L|uAlDQlPi.HqvËUKZ#lSsB#odDy|cÄQ5ބ]s)=2qc7#fnfu'4D&9n0%xJnKy雛!Fe1ʩ9"ʎ>HZJb|B6>-ʗ/҆=$(N*=K}'/ϻWhpv
Tbvx,7HԔ_+1Ŏ	uWE)ӆ},xKQ7p!(-)E e9y-5lqjҬB$+[e@y~+*+y#AvQ"2tq&OOU{ڴߝ@P6Ti+v(DR:JGz|IqUڒo/|
A+/%pg41#±nS
y”#3?Zb:"%1rue0Plqc3EjAmɆ]~m\N)aC=դ؛;Zv
h"v	^U]38ᐄ\ta.Atxw[-)Wr(q]bhy08DB^x#g7V~T\s!Wn0?"^V&w{0+C\ۼ`jtc#>h%)[l^"HQ$vlnѯڈRä2
:tJƒQyib4d*h̅;`o&\~?+X=tlٿk}u0C1-൮Wl}Yu:Ko_g4!ӽ|L