CATEGORII DOCUMENTE |
Inoduri - UNIX
Definitie
Inodurile exista intr-o forma statica pe disc, iar pentru a le prelucra, nucleul le citeste intr-un inode in-core in memoria interna pentru a le manipula. Inodurile din memorie sunt numite in-core inoduri.
Inodurile disc contin urmatoarele campuri:
Identificatorul proprietarului fisierului. Proprietatea asupra unui fisier este impartita intre un proprietar individual si un 'grup' al proprietarului si defineste setul de utilizatori care au drepturi de acces la fisier. Superutilizatorul are drepturi de acces la toate fisierele din sistem.
Tipul fisierului. Fisierele pot fi de tip regulat, director, speciale (caracter sau bloc), sau pipe (FIFO).
Permisiunile de acces la fisier. Pentru protectie, sistemul imparte utilizatorii unui fisier in trei clase: proprietarul, grupul proprietarului fisierului si alti utilizatori. Fiecare clasa are drepturi de acces pentru citirea, scrierea si executia unui fisier, iar acestea pot fi setate individual. Intrucat un director nu poate fi executat, permisiunea de executie confera dreptul de a cauta in el un nume de fisier.
Timpii de acces la fisier. Contin timpul la care fisierul a fost modificat ultima data, timpul cand a fost accesat ultima oara, respectiv timpul cand inodul a fost modificat ultima oara.
Numarul de legaturi ale fisierului. Reprezinta numarul de nume pe care fisierul le are in cadrul ierarhiei de directoare. Capitolul 5 va prezenta detaliat legarea fisierelor.
Tabela de cuprins. Contine adresele disc unde pot fi regasite datele fisierului. Desi utilizatorii trateaza datele din fisier ca un sir logic de octeti, nucleul salveaza datele in blocuri disc discontinue. Inodul identifica blocurile de pe disc care contin datele fisierului.
Dimensiunea fisierului. Adresarea datelor dintr-un fisier se face prin precizarea deplasamentului fata de inceputul fisierului. Dimensiunea fisierului este cu o unitate mai mare decat cel mai mare deplasament de date din fisier. De exemplu, daca un utilizator creeaza un fisier si scrie numai un octet de date la deplasamentul 1000, atunci dimensiunea fisierului este de 1001 octeti.
Numele caii (cailor) prin care se acceseaza un fisier nu se afla in inodul fisierului, ci in directorul (directoarele) in care rezida fisierul.
Figura 4.2 prezinta inodul disc al unui fisier obisnuit, al carui proprietar este 'mjb' si care contine 6030 octeti. Sistemul ii permite lui 'mjb' sa citeasca, sa scrie sau sa execute fisierul. Membrii grupului 'os' si toti ceilalti utilizatori pot sa citeasca sau sa execute fisierul, dar nu pot sa scrie in el. Ultimul moment cand cineva a citit fisierul a fost 22 oct. 1994, la 10:30. Pe 23 oct 1984, la 1:30, inodul a fost modificat ultima oara, dar nu si datele din fisier. Informatiile de mai sus sunt pastrate codificat in inod.
Dupa cum se observa, se face distinctie intre scrierea continutului unui inod pe disc si scrierea continutului fisierului pe disc. Continutul unui fisier se schimba numai cand se scrie in el. Continutul unui inod se schimba cand se schimba continutul fisierului, sau cand se schimba proprietarul, permisiunile, legaturile. Schimbarea continutului unui fisier implica automat modificarea continutului inodului, dar modificarea inodului nu implica modificarea continutului fisierului.
proprietar mjb
grup os
fisier de tip obisnuit
permisiuni rwxr-xr-x
accesat oct 23 1994 1:45 PM
modificat oct 22 1994 10:30 AM
inod oct 23 1994 1:30 PM
dimensiune 6030 bytes
adrese disc
Figura 4.2 Exemplu de inod disc
Copia din memoria interna a unui INCORE inod contine campurile unui inod disc plus urmatoarele:
Starea inodului din memoria interna, indica daca:
inodul este blocat,
un proces asteapta deblocarea inodului,
reprezentarea din memoria interna a inodului difera de copia de pe disc ca rezultat al modificarii datelor din inod,
reprezentarea din memoria interna a fisierului difera de copia de pe disc ca urmare a modificarii datelor in fisier,
fisierul este un punct de montare (mount point),
Numarul de dispozitiv logic al sistemului de fisiere care contine fisierul.
Numarul inodului. Deoarece inodurile sunt stocate pe disc intr-un sir, nucleul identifica numarul inodului disc prin pozitia sa in lista. Inodul disc nu are nevoie de acest camp.
Pointeri catre alte inoduri din memoria interna. Nucleul inlantuieste inodurile din memorie in structuri de tip liste hash si o lista de inoduri libere, similare celor descrise pentru buffere in capitolul anterior. Inodurile se pot gasi simultan si intr-o lista hash si in lista de inoduri libere. O lista hash este identificata dupa numarul de dispozitiv logic al inodului si dupa numarul inodului. Nucleul poate contine in memoria interna cel mult o copie a unui inod disc.
Contorul de referinta, indica numarul de instante active ale fisierului (de cate ori a fost deschis).
Multe campuri ale inodului din memoria interna sunt analoage celor din antetele buffere-lor . Astfel gestiunea inodurilor este similara cu cea a buffere-lor. Blocarea inodului se realizeaza pentru a nu permite mai multor procese sa acceseze acelasi inod. Daca procesele vor sa acceseze un inod care este blocat, ii seteaza un semnalizator care indica faptul ca trebuie trezite cand inodul va fi deblocat. Nucleul seteaza alti semnalizatori, pentru a indica diferenta dintre inodul disc si copia sa din memoria interna. Actualizarea inodului sau a fisierului pe disc conform copiei din memorie se face dupa examinarea in prealabil a acestor semnalizatoare.
Cea mai mare diferenta dintre un inod din memoria interna si un antet de buffer o constituie contorul de referinta (prezent la inodul din memoria interna) care contorizeaza instantele active ale unui fisier. Un inod este activ cand un proces il aloca (la deschiderea unui fisier). Inodul este in lista inodurilor libere numai daca contorul sau de referinta este 0, ceea ce inseamna ca nucleul il poate realoca unui alt inod disc. Lista inodurilor libere se constituie astfel, ca un cache al inodurilor inactive. Daca un proces incearca sa acceseze un fisier al carui inod nu este prezent in memoria interna, nucleul realoca un inod din lista inodurilor libere pentru a fi utilizat. Spre deosebire de inoduri, un buffer nu are contor de referinta si este in lista buffere-lor libere daca si numai daca este deblocat.
Accesarea inodurilor
Nucleul identifica un anumit inod dupa sistemul de fisiere din care face parte si numarul inodului si aloca inoduri in memoria interna la cererea algoritmilor de nivel inalt.Algoritmul iget aloca o copie in memoria interna pentru un inod (vezi figura 4.3), si este similar cu algoritmul getblk pentru gasirea unui bloc disc in bufferul cache. Nucleul asociaza numarului dispozitivului si numarului inodului o lista hash in care se va face cautarea inodului. Daca nucleul nu gaseste inodul, el aloca unul din lista fisierelor libere si-l blocheaza. Apoi pregateste citirea copiei disc in inodul alocat.
algoritm iget
intrare: numar inod din sistemul de fisiere
iesire: inod blocat
/* executie speciala in cazul in care este punct de montare
(Capitolul 5) */
if (inodul este in lista inodurilor libere )
sterge inodul din lista inodurilor libere ;
incrementeaza contorul de referinta al inodului;
return (inod);
}
/* inodul nu este in cache-ul de inoduri (listele hash) */
if (nu este nici un inod in lista inodurilor libere )
return (eroare);
sterge noul inod din lista inodurilor libere ;
reseteaza numarul inodului si sistemul de fisiere;
sterge inodul din vechea lista hash, plaseaza-l in cea
nouå;
citeste inodul de pe disc (algoritm bread);
initializeaza inodul (de exemplu, contorul=1);
return (inod);
}
Figura 4.3. Algoritmul pentru alocarea inodurilor din memoria
interna
Pe baza numarului inodului si a numarului dispozitivului logic (cunoscute), nucleul calculeaza blocul logic de pe disc care contine inodul tinand seama de numarul de inoduri continute intr-un bloc disc.
Calculul se face dupa formula:
numar bloc=s(numar inod-1)/numar inoduri din bloct+blocul de start al listei de inoduri ;
unde operatia de impartire returneaza partea intreaga a rezultatului. De exemplu, presupunand ca blocul 2 este blocul de inceput al listei de inoduri si ca sunt 8 inoduri in bloc, atunci inodul numarul 8 este in blocul disc numarul 2, iar inodul 9 este in blocul disc numarul 3.
Cand nucleul cunoaste numarul dispozitivului si numarul blocului disc, el citeste blocul utilizand algoritmul bread, si utilizeaza urmatoarea formula pentru a calcula deplasamentul inodului in bloc:
deplasament=s(numar inod -1) modulo (numar de inoduri din bloc)t*dimensiunea inodului disc ;
De exemplu, daca fiecare inod disc ocupa 64 octeti si sunt 8 inoduri intr-un bloc disc, atunci inodul numarul 8 incepe de la deplasamentul 448 din blocul disc. Nucleul scoate inodul din lista inodurilor libere, il plaseaza in lista hash corespunzatoare si seteaza contorul de referinta pe 1. Apoi copiaza din inodul disc in cel din memorie tipul fisierului, campurile de proprietate, permisiunile de acces, numarul de legaturi, dimensiunea fisierului si tabela de cuprins, si returneaza inodul blocat.
Nucleul manipuleaza semnalizatorul de blocare si contorul de referinta independent. Blocarea se realizeaza in timpul executiei unui apel sistem pentru a impiedica accesarea inodului de catre alte procese pe durata cat este utilizat.
Nucleul deblocheaza inodul la incheierea apelurilor sistem, el nefiind niciodata blocat intre apelurile sistem. In acest fel se permite proceselor accesul simultan la fisiere. Nucleul incrementeaza contorul de referinta pentru fiecare referinta activa la fisier. El decrementeaza contorul de referinta numai daca referinta devine inactiva (cand un proces inchide fisierul). Contorul de referinta ramane setat intre apelurile sistem multiple, impiedicand nucleul sa realoce un inod activ. Astfel, nucleul poate bloca si debloca un inod alocat independent de valoarea contorului de referinta. Daca in cazul buffer-ului cache termenii deblocat si eliberat aveau aceeasi semnificatie, la inoduri ei au semnificatie aparte. Termenul eliberat (precum si cel ce desemneaza starea opusa, alocat) este asociat contorului de referinta, iar deblocat (cat si blocat) semnalizatorului de blocare.
Revenind la algoritmul iget, daca nucleul incearca sa obtina un inod din lista inodurilor libere , iar aceasta este goala, el raporteaza o eroare. Modalitatea de actiune a nucleului in cazul alocarii buffere-lor este diferita, procesele punandu-se in asteptare pana cand buffere-le devin libere.
Aceasta diferenta in abordarea problemei (de alocare a unei resurse) este datorata faptului ca procesele au control asupra alocarii inodurilor la nivel utilizator (prin intermediul apelurilor sistem open si close), nucleul neputand garanta cand un inod devine disponibil . Astfel, un proces care se pune in asteptare pana la eliberarea unui inod s-ar putea sa nu se mai trezeasca niciodata si de aceea nucleul intoarce eroare. In schimb, procesele nu au un astfel de control asupra buffere-lor. Deoarece un proces nu poate tine un buffer blocat intre apelurile sistem, nucleul poate garanta ca un buffer va deveni curand liber. Acesta constituie motivul pentru care procesele se pun in asteptare pana la eliberarea unui buffer.
Paragrafele precedente au tratat cazul in care nucleul a alocat un inod care nu a fost in cache (listele hash). Daca inodul este in cache, un proces (A) il gaseste in lista sa hash si verifica daca este blocat de un alt proces (B). Daca inodul este blocat, procesul A se pune in asteptare, setand un bit de semnalizare al inodului din memoria interna pentru a arata ca asteapta deblocarea inodului. Cand procesul B deblocheaza inodul, el trezeste toate procesele ce asteptau acest eveniment, (inclusiv A). Cand A reuseste sa acceseze inodul, il blocheaza pentru ca alte procese sa nu-l poata aloca.
Daca contorul de referinta a fost inainte 0, inodul apare de asemenea in lista inodurilor libere, si intrucat nu va mai fi liber, nucleul il scoate de acolo. Nucleul incrementeaza contorul referinta al inodului si returneaza inodul blocat.
Recapituland, algoritmul iget este utilizat de catre apelurile sistem, cand un proces acceseaza pentru prima data un fisier. Algoritmul returneaza o structura de inod blocat avand contorul de referinta incrementat cu o unitate. Inodul din memoria interna contine informatii actualizate despre starea fisierului. Nucleul deblocheaza inodul inainte de revenirea dintr-un apel sistem astfel incat si alte procese sa poata accesa inodul.
Eliberarea inodurilor
algoritm iput /* elibereaza un inod */
intrari: pointer la un inod din memorie
iesiri: niciuna
if (fisierul a fost accesat sau inodul modificat sau fisierul
modificat)
actualizeaza continutul inodului disc;
pune inodul in FLI;
}
deblocheaza inodul;
Figura 4.4. Algoritmul pentru eliberarea unui inod din memorie
Cand nucleul elibereaza un inod (algoritmul iput din figura 4.4), el ii decrementeaza contorul de referinta. Daca contorul ajunge la 0, nucleul scrie inodul pe disc daca copia din memorie difera de cea de pe disc. Ele difera in cazul in care au fost modificate datele din fisier, timpul de acces la fisier, proprietarul sau permisiunile de acces. Nucleul plaseaza inodul in lista inodurilor libere pentru a putea fi realocat unui alt fisier. In cazul in care numarul de legaturi ale fisierului devine 0 (fisierul este sters), nucleul va elibera toate blocurile disc asociate fisierului.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1489
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved