CATEGORII DOCUMENTE |
Apelul sistem link - UNIX
Apelul sistem link permite accesarea unui fisier printr-un nume nou, creandu-se in structura de directoare a sistemului de fisiere o noua intrare director pentru un inod existent. Sintaxa apelului este:
link (numeIfisier sursa, numeIfisier nou);
unde numeIfisier sursa este numele unui fisier existent iar numeIfisier nou este noul nume (aditional) pe care fisierul il va avea dupa incheierea apelului. Sistemul de fisiere contine un nume de cale pentru fiecare legatura a fisierului, iar procesele pot accesa fisierul folosind oricare dintre cai. Nucleul nu cunoaste numele initial al fisierului, asa ca toate numele fisierului sunt tratate la fel. De exemplu, dupa executia apelurilor sistem
link ('/usr/src/uts/sys','/usr/include/sys');
link('/usr/include/realfile.h','/usr/src/uts/sys/testfile.h');
urmatoarele trei nume vor referi acelasi fisier '/usr/src/uts/sys/testfile.h', "/usr/include/sys/testfile.h', "/usr/include/realfile.h' (vezi figura 5.28).
Figura 5.28 Exemplu de fisiere legate intr-un sistem de fisiere
Pentru simplitatea codului programelor ce traverseaza arborele sistemului de fisiere, nucleul acorda numai superutilizatorului dreptul de a lega directoare. Daca orice utilizator ar avea acest drept, programele concepute sa traverseze ierarhia de fisiere ar trebui sa testeze intr-un ciclu infinit daca utilizatorul urmeaza sa lege directorul la un nume de nod aflat sub el in ierarhie. Se considera ca superutilizatorii sunt mai atenti cand executa astfel de legaturi. Facilitatea de legare a directoarelor trebuia sa fie prezenta la versiunile initiale ale sistemului, deoarece statea la baza implementarii comenzii mkdir, de creare a unui nou director.
algoritmul link
intrari: nume fisier existent
noul nume asociat fisierului
iesire: niciuna
incrementeaza contorul de legaturi al inodului;
actualizeaza copia disc a inodului;
deblocheaza inodul;
determina inodul pentru directorul parinte care va contine noul nume de fisier
(algoritmul namei);
if (noul nume de fisier deja exista sau fisierul existent si cel nou se afla in
sisteme de fisiere diferite)
creeaza o noua intrare in directorul parinte pentru noul nume al fisierului cu:
numele noului fisier, numarul inodului corespunzator numelui fisierului existent;
elibereaza inodul directorului parinte (algoritm iput);
elibereaza inodul fisierului existent (algoritm iput);
Figura 5.29 Algoritm de creare a legaturilor pentru fisiere
In algoritmul link (vezi figura 5.29), nucleul aloca mai intai un inod pentru fisierul sursa (folosind algoritmul namei), incrementeaza contorul sau cu numarul de legaturi, actualizeaza copia disc a inodului (pentru consistenta) si deblocheaza inodul. Apoi cauta noul fisier. In caz ca este gasit, nucleul decrementeaza contorul incrementat anterior, iar apelul se incheie cu eroare. Altfel, determina o intrare libera in directorul parinte al noului fisier, pe care o completeaza cu numele noului fisier si numarul inodului fisierului sursa, dupa care elibereaza inodul directorului parinte. Deoarece noul fisier nu exista la inceputul apelului, nu vor elibera alte inoduri. In final, nucleul elibereaza inodul fisierului sursa. In urma apelului link contorul de legaturi (numarul de intrari director care refera fisierul si care este diferit de contorul de referinta al inodului) este incrementat. Daca nici un alt proces nu mai acceseaza fisierul la incheierea apelului link, contorul de referinta al inodului este 0, iar contorul de legaturi este cel putin 2.
De exemplu, la executia apelului
link ('source','dir/target');
nucleul gaseste inodul pentru 'source', incrementreaza numarul sau de legaturi, ii memoreaza numarul inodului - sa zicem 74 , si deblocheaza inodul. Localizeaza inodul directorului 'dir', parintele fisierului "target", gaseste o intrare libera in "dir" in care scrie numele lui 'target' si numarul de inod 74. In final este eliberat inodul lui 'source' folosind algoritmul iput. Daca contorul de legaturi a fost 1, acum el este 2.
Prezentam in continuare doua posibilitati de blocare a sistemului care arata motivul pentru care trebuia deblocat inodul fisierului sursa dupa incrementarea contorului de legaturi. Daca nucleul nu ar debloca inodul, doua procese s-ar putea bloca reciproc prin executarea simultana a urmatoarelor apeluri:
procesul A: link('a/b/c/d','e/f/g');
procesul B: link('e/f','a/b/c/d/ee');
Presupunem ca sistemul se afla in starea in care fiecare proces a alocat inodul corespunzator; procesul A inodul pentru fisierul 'a/b/c/d', iar procesul B inodul pentru fisierul 'e/f'. Figura 5.30 prezinta un scenariu de executie. Cand procesul A va incerca sa gaseasca inodul pentru directorul 'e/f', el se va pune in asteptare pana cand inodul lui 'f' devine liber. La fel, procesul B incearca sa gaseasca inodul pentru directorul 'a/b/c/d', punandu-se in asteptare pana cand inodul lui 'd' devine liber.
Se ajunge astfel la o situatie clasica de blocare in care doua procese ocupa fiecare cate o resursa si se blocheaza asteptand eliberarea resursei ocupata de celalalt proces. Aceasta situatie este evitata prin deblocarea inodului fisierului sursa dupa incrementarea contorului de legaturi. Deoarece prima resursa (inod) este libera in momentul accesarii urmatoarei resurse, nu va avea loc o blocare.
procesul A procesul B
. incearca sa obtina inodul pentru
. SE PUNE IN ASTEPTARE - inodul este
. blocat
. .
obtine inodul pentru .
elibereaza inodul lui .
obtine inodul pentru .
elibereaza inodul lui .
obtine inodul pentru .
elibereaza inodul lui .
obtine inodul pentru .
. .
incearca sa obtina inodul pentru .
SE PUNE IN ASTEPTARE - inodul este blocat .
. .
.
TREZIRE PROCESE- inodul lui este deblocat
. .
. obtine inodul pentru
. elibereaza inodul lui
. obtine inodul pentru
. obtine inodul pentru
. elibereaza inodul lui
. .
. incearca sa obtina inodul pentru
. SE PUNE IN ASTEPTARE -
. procesul A a blocat inodul
. .
. .
obtine inodul pentru .
elibereaza inodul lui .
incearca sa obtina inodul pentru .
SE PUNE IN ASTEPTARE - procesul B a blocat inodul .
BLOCARE RECIPROCA
Timp
Figura 5.30 Situatie de blocare reciproca pentru apelul link
Exemplu anterior a prezentat cazul in care doua procese se pot bloca reciproc in cazul in care inodul nu este deblocat. Exista posibilitatea ca un proces sa se autoblocheze. Daca executa
link('a/b/c',a/b/c/d');
nucleul va aloca in prima parte a algoritmului un inod pentru fisierul "c". Daca nu ar fi deblocat, se va ajunge la o situatie de blocare in cazul in care trebuie sa se acceseze inodul lui "c" pentru a cauta fisierul "d". Daca doua procese, sau chiar unul nu si-ar putea continua executia datorita unei blocari, sistemul nu o va putea inlatura fara o noua initializare. Aceasta deoarece inodurile sunt resurse alocabile in numar finit, iar receptionarea unui semnal nu poate trezi un proces aflat in asteptare(detalii in capitolul 8).
Se mentioneaza ca blocarea unui director poate afecta si alte procese.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 957
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved