CATEGORII DOCUMENTE |
Citirea si scrierea blocurilor disc - UNIX
Dupa prezentarea algoritmului de alocare a buffere-lor, procedurile pentru citirea si scrierea blocurilor disc vor fi mai usor de inteles. Pentru a citi un bloc disc (figura 3.13), un proces foloseste algoritmul getblk pentru a-l cauta in buffer-ul cache. Daca este in buffer-ul cache nucleul il poate returna imediat fara citirea fizica a blocului de pe disc. Daca nu este in buffer-ul cache nucleul apeleaza driverul de disc pentru a 'planifica' o cerere de citire si se pune in asteptare pana la terminarea operatiilor de I/O. Driverul de disc specifica controlerului de disc ca doreste sa citeasca date, iar acesta transmite apoi datele la buffer. In final, controlerul de disc intrerupe procesorul cand s-au terminat operatiile de I/O si rutina de tratare a intreruperii de disc trezeste procesele care asteapta, continutul blocului disc fiind acum in buffer. Modulele care solicitau blocul respectiv au acum datele; cand nu mai au nevoie de buffer, acesta este eliberat, pentru a putea fi accesat si de alte procese.
algoritm bread /* citire bloc */
intrare: numarul blocului din sistemul de fisiere;
iesire: buffer continand date;
Figura 3.13. Algoritmul pentru citirea unui bloc disc
Capitolul 5 prezinta modul in care modulele de nivel inalt ale nucleului (cum ar fi subsistemul de fisiere) pot anticipa necesitatea unui al doilea bloc disc cand un proces citeste secvential un fisier. Modulele solicita a doua operatie asincrona de I/O in speranta ca datele vor fi in memorie cand va fi nevoie de ele, sporind astfel performantele sistemului. Pentru a realiza aceasta, nucleul executa algoritmul de citire in avans a unui bloc, breada (figura 3.14): nucleul verifica daca primul bloc este in buffer-ul cache si, daca nu este, invoca driver-ul de disc pentru a citi acel bloc. Daca al doilea bloc nu este in buffer-ul cache, nucleul comanda driver-ului de disc sa-l citeasca asincron. Apoi procesul se pune in asteptare pana cand operatiile de I/O pentru primul bloc s-au terminat.
Cand este trezit, procesul intoarce buffer-ul pentru primul bloc si nu-l intereseaza cand se termina operatiile de I/O pentru al doilea bloc. Cand operatiile de I/O pentru al doilea bloc s-au terminat, controlerul de disc intrerupe sistemul; rutina de tratare a intreruperii recunoaste ca operatiile de I/O au fost asincrone si elibereaza buffer-ul (algoritmul brelse).
algoritm breada /* citire bloc si citire in avans */
intrari: (1) numarul blocului din sistemul de fisiere pentru citire
imediata;
(2) numarul blocului din sistemul de fisiere pentru citire
asincrona;
iesire: buffer cu date din citirea imediata;
if (blocul (2) nu este in buffer-ul cache)
if (blocul (1) era initial in buffer-ul cache)
sleep (pana cand primul buffer alocat contine date valide);
return buffer; }
Figura 3.14. Algoritmul pentru citirea blocului in avans
Daca nu ar elibera buffer-ul, acesta ar ramane blocat, si deci, inaccesibil tuturor proceselor. Este imposibil ca buffer-ul sa se deblocheze inaintea incheierii operatiei de I/O deoarece continutul sau este invalid. Mai tarziu, daca procesul doreste sa citeasca al doilea bloc, ar trebui sa-l gaseasca in buffer-ul cache, operatiile de I/O terminandu-se intre timp.
Daca la inceputul algoritmului breada primul bloc era in buffer-ul cache, nucleul verifica imediat daca al doilea bloc este in cache, procedand asa cum am aratat mai sus.
Algoritmul pentru scrierea continutului unui buffer intr-un bloc disc este similar (figura 3.15). Nucleul informeaza driverul de disc ca are un buffer al carui cuntinut ar trebui scris, iar driverul planifica blocul pentru operatii de I/O. Daca scrierea este sincrona, procesul apelant se pune in asteptare pana la terminarea operatiilor de I/O, iar la trezire elibereaza buffer-ul. Daca scrierea este asincrona, nucleul incepe scrierea pe disc dar nu asteapta terminarea acesteia. Nucleul va elibera buffer-ul la terminarea operatiilor de I/O.
Exista situatii descrise in urmatoarele doua capitole, cand nucleul nu scrie imediat datele pe disc. Daca executa o scriere cu intarziere, el marcheaza buffer-ul in mod corespunzator, elibereaza buffer-ul utilizand algoritmul brelse si continua fara a planifica operatii de I/O. Nucleul scrie blocul pe disc inainte ca alt proces sa poata realoca buffer-ul altui bloc asa cum s-a prezentat in scenariul al treilea din getblk. Daca un proces acceseaza buffer-ul inainte de a trebui sa fie scris, se elimina o operatie cu discul, ceea ce duce la cresterea performantelor sistemului. Practic, se amana cat se poate de mult scrierea unui buffer pe disc in speranta ca el va fi modificat de acelasi proces sau de altele.
algoritm bwrite /* scriere bloc */
intrare: buffer;
iesire: nimic;
else if (bufferul este marcat pentru scriere intarziata)
marcheaza buffer-ul sa fie pus in capul
listei buffere-lor libere;
Figura 3.15. Algoritmul pentru scrierea blocurilor disc
O scriere intarziata este diferita de o scriere asincrona. Cand are loc o scriere asincrona, nucleul incepe imediat operatia cu discul, dar nu asteapta ca ea sa se termine.
La o scriere intarziata, nucleul amana scrierea pe disc cat se poate de mult, iar apoi, urmand al treilea scenariu din algoritmul getblk, marcheaza bufferul ca 'vechi' si scrie asincron blocul pe disc. La incheierea operatiei, controlerul de disc intrerupe sistemul si elibereaza buffer-ul (folosind algoritmul brelse) punand-ul in capul listei buffere-lor libere, deoarece era marcat 'vechi'. Din cauza celor doua operatii de I/O asincrone, citirea blocului in avans si scrierea intarziata, nucleul poate invoca algoritmul brelse dintr-o rutina de tratare de intrerupere. Din aceasta cauza, el trebuie sa blocheze intreruperile in orice procedura care manipuleaza buffere-le din lista buffere-lor libere deoarece brelse plaseaza buffere-le in aceasta lista.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1021
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved