|
STRUCTURA SOFT A SISTEMELOR DE INTRARE/IESIRE
Pe suportul hard prezentat, sistemul de operare furnizeaza si controleaza programe care sa citeasca si sa scrie date si comenzi in registrele controllerului si sincronizeaza aceste operatii. Sincronizarea se efectueaza, de obicei, cu ajutorul intreruperilor de intrare iesire.
Pentru a realiza aceste sarcini, softul sistemului de intrare/iesire are patru componente:
-rutinele de tratare a intreruperilor;
-driverele, asociate dispozitivelor periferice;
-programe independente de dispozitivele periferice;
-primitivele utilizator.
1.-Rutine de tratare a intreruperilor
Un proces, care are incorporata o operatie intrare/iesire, este blocat in urma unei operatii de wait la semafor. Se initiaza operatia de intrare/iesire iar cand operatia este terminata, procesul este trezit printr-o operatie signal, cu ajutorul rutinei de tratare a intreruperilor. In acest fel, procesul va fi deblocat si va trece in starea ready.
Fig.6.2. Rutina de tratare a intreruperilor.
Fig.6.3. Reprezentarea rutinei de intrerupere.
Se observa ca sarcinile principale ale rutinei de tratare a intreruperilor sunt:
- rutina identifica dispozitivul periferic care a generat o intrerupere;
- rutina reinitializeaza linia de intrerupere pe care a utilizat-o perifericul;
- memoreaza intr-o stiva starea dispozitivului periferic;
- are rolul de a "trezi" procesul care a initiat operatia de I/E printr-o operatie signal.
In acest mod procesul va fi deblocat si trecut in starea ready.
In realitate lucrurile nu sunt asa de simple, SO avand o mare cantitate de lucru in acest scop. Etapele parcurse in acest proces in care intervin intreruperile sunt:
- salvarea tuturor registrelor (si PSW);
- pornirea procedurii de intreruperi;
- initializarea stivei;
- pornirea controlorului de intreruperi;
- copierea din registrele unde au fost salvate intreruperile in tabelul procesului;
- rularea procedurii de intrerupere care va citi informatia din registre;
- alegerea procesului care urmeaza; daca intreruperea a fost cauzata de un proces de inalta prioritate, acesta va trebui sa ruleze din nou;
-incarcarea registrelor noului proces (inclusiv PSW);
-pornirea rularii noului proces.
2. Drivere
Driverul este partea componenta a SO care depinde de dispozitivul periferic caruia ii este asociat. Rolul sau este de a transpune in comenzi la nivelul registrelor controllerului ceea ce primeste de la nivelul soft superior. Din punct de vedere structural, driverul este un fisier care contine diferite comenzi specifice unui dispozitiv periferic.
O prima problema care se pune este: unde ar trebui instalate aceste drivere, in nucleu (kernel) sau in spatiul utilizator (user) ? Prezenta driverelor in user ar avea avantajul unei degrevari a kernelului de anumite solicitari si al unei mai bune izolari a driverelor intre ele. De asemenea, la o eroare necontrolata provenita din driver, nu ar mai ceda sistemul de operare asa usor.
Totusi, majoritatea sistemelor de operare incarca driverele in kernel si asta pentru o mai mare flexibilitate si o mai buna comunicare, in special pentru driverele nou instalate.
Operatiile efectuate de un driver, a carui schema este data in fig. 6.4, sunt:
- verificarea parametrilor de intrare daca sunt valizi, in caz contrar semnalarea erorii;
- translatia de la termeni abstracti la termeni concreti, aceasta insemnand, de exemplu, la un hard disc:
numar bloc → adresa
- verificarea starii dispozitivului ( ready sau nu);
- lansarea operatiei efective pentru dispozitivul periferic, de exemplu, o citire a unui sector al hard discului;
- blocarea driverului pana cand operatia lansata s-aterminat (printr-un wait la semafor);
- "trezirea" driverului (prin operatia signal
- semnalarea catre nivelul soft superior a disponibilitatii datelor (in cazul unei operatii de citire de la periferice) sau a posibilitatii de reutilizare a zonei de memorie implicate in transferul de date (pentru o operatie de scriere intr-un periferic);
- preluarea unei noi cereri aflate in coada de asteptare.
Coada de asteptare pentru driverul respectiv
DANU
NUDA
Dispozitiv
periferic
operatie terminata
Dispozitiv
periferic
citire scriere
Fig. Schema de functionare a unui driver.
Schema de functionare a unui driver, pentru o comanda de citire a unui bloc logic de pe hard discul C, este data in figura 6.5.
dispozitiv periferic
dispozitiv periferic
citire date de pe sector 2 si 3
cap 2, cilindru 40
memorie
Fig. 6.5. Schema functionarii unui driver pentru o comanda de citire a unui bloc logic.
3. Programe-sistem independente
de dispozitive
Sarcinile ce revin acestui nivel soft sunt:
- asigurarea unei interfete uniforme pentru toate driverele;
- realizarea corespondentei dintre numele simbolice
ale perifericelor si driverele respective; in UNIX, de exemplu, un fisier este asociat unui dispozitiv periferic;
- utilizarea unor tampoane sistem, puse la dispozitie de SO, pentru a preintampina vitezele diferite ale dispozitivelor periferice;
- raportarea erorilor de intrare/iesire in conjunctie cu aceste operatii de intrare/iesire; de obicei erorile sunt reperate si generate de drivere, rolul acestui nivel soft fiind acela de a raporta o eroare ce nu a fost raportata.
4. Primitive de nivel utilizator
Cea mai mare parte a sistemului de intrare/iesire este inglobata in sistemul de operare dar mai exista niste proceduri, numite primitive de nivel utilizator, ce sunt incluse in anumite biblioteci. Aceste proceduri au rolul de a transfera parametrii apelurilor sistem pe care le initiaza. Aceste primitive pot lucra in doua moduri: sincron si asincron.
O primitiva sincrona returneaza parametrii numai dupa ce operatia de intrare/iesire a fost realizata efectiv. Se utilizeaza pentru operatii de intrare/iesire cu o durata ce trebuie estimata sau cu o durata foarte mica.
O primitiva asincrona are rolul numai de initiere a operatiei de intrare/iesire, procesul putand continua in paralel cu operatia. Procesul poate testa mereu evolutia operatiei iar momentul terminarii ei este marcat de o procedura, definita de utilizator, numita notificare. Problemele primitivelor asincrone sunt legate de utilizarea bufferului de date. Procesul intiator trebuie sa evite citirea/scrierea in buffer atat timp cat operatia nu este terminata, sarcina aceasta revenindu-i programatorului. Primitivele asincrone sunt utilizate in cazul operatiilor cu o durata mare sau greu de estimat.