Sunteți pe pagina 1din 26

6

Sisteme de fiiere
Toate aplicaiile de pe un calculator trebuie s salveze i s recupereze informaii. n timp ce un proces
este n execuie, acesta poate reine o cantitate limitat de informaii n spaiul propriu de adrese i
oricum, capacitatea de stocare este limitat la dimensiunea spaiului de adrese virtual. Pentru anumite
aplicaii aceast dimensiune este potrivit, dar pentru altele, cum ar fi rezervrile companiilor aeriene,
industria bancar, sau a corporaiilor de stocare a nregistrrilor, este mult prea mic.
O a doua problem n meninerea informaiei n cadrul spaiului de adrese al procesului este c atunci
cnd procesul se termin, informaia este pierdut. Pentru multe aplicaii, (spre exemplu bazele de
date), informaia trebuie reinut timp de sptmni, luni, sau chiar pentru totdeauna. Este
inacceptabil s dispar dup ce procesul care o folosete se termin. n plus, nu trebuie s se piard
atunci cnd o cdere a sistemului distruge procesul.
O a treia problem este c se ntlnete frecvent situaia ca mai multe procese s acceseze informaia
(pri ale informaiei) n acelai timp. Dac avem un catalog virtual de telefonie stocat n cadrul
spaiului de adrese al unui singur proces, numai acel proces l poate accesa. Soluia acestei probleme
este s se fac informaia independent de orice proces.
Deci, avem nevoie de trei componente eseniale pentru stocarea pe termen lung a informaiei:
1. Trebuie s fie posibil s se stocheze o cantitate mare de informaie.
2. Informaia trebuie s persiste dup terminarea procesului care o folosete.
3. Mai multe procese trebuie s poat accesa informaia n mod concurent.
Soluia uzual a acestor probleme este stocarea informaiilor pe discuri sau pe alte medii externe, n
uniti numite fiiere (files). Procesele pot mai apoi s le citeasc i s scrie altele noi dac este
nevoie. Informaia stocat n fiiere trebuie s fie persistent, adic, s nu fie afectat de crearea sau
terminarea proceselor. Un fiier trebuie s dispar numai atunci cnd proprietarul l terge explicit.
Fiierele sunt administrate de sistemul de operare acesta ocupndu-se de structurarea, numirea,
accesarea, folosirea, protejarea i implementarea acestora. Ca ntreg, acea parte a sistemului de
operare care se ocup cu fiiere este cunoscut sub numele de sistem de fiiere (file system).

6.1 Fiiere
6.1.1 Numirea fiierelor
Fiierele reprezint un mecanism de abstractizare. Ele asigur o modalitate de a stoca informaie pe
un suport extern, de exemplu disc, i de a o citi napoi mai trziu. Acest lucru trebuie fcut ntr-un
asemenea mod astfel nct s se ascund de utilizator detaliile despre cum i unde este stocat
informaia i cum funcioneaz discul n realitate.
Probabil cea mai important caracteristic a unui mecanism de abstractizare este modul n care
obiectele administrate sunt denumite. Cnd un proces creeaz un fiier, i d acestuia un nume. Cnd
procesul se termin, fiierul continu s existe i poate fi accesat de alte procese folosindu-se de
numele su.

Regulile exacte de numire a fiierelor difer ntructva de la sistem la sistem, dar toate sistemele de
operare curente permit ca iruri valide, iruri de unu pn la opt caractere. Deci, referat, carte i
agenda, sunt nume posibile de fiiere. De obicei cifrele i caracterele speciale sunt de asemenea
permise, deci nume ca 2, sau urgent! sunt valide. Multe dintre sistemele de fiiere permit nume de
pn la 255 de caractere.
Unele sisteme de fiiere fac distincie ntre literele mici i cele mari (case sensitive), n timp ce altele
nu. UNIX face parte din prima categorie, n timp de MS-DOS face parte din a doua. Deci un sistem de
operare UNIX poate avea urmtoarele trei fiiere distincte: carte, Carte i CARTE. In MS-DOS toate
aceste nume se refer la acelai fiier.
O parantez la sistemele de fiiere este potrivit aici. Att Windows 95 ct i Windows 98 folosesc
sistemul de fiiere MS-DOS (FAT16) i deci motenesc multe din proprietile sale, cum ar fi
construcia fiierelor. n plus, Windows NT i Windows 2000 suport sistemul de fiiere MS-DOS (i
extensia acestuia FAT32) i deci i motenesc de asemenea proprietile. Oricum aceste ultime dou
sisteme au de asemenea un sistem nativ de fiiere (NTFS) care are proprieti diferite (cum ar fi nume
de fiiere n Unicode).
Multe sisteme de operare suport nume de fiiere formate din dou pri, cele dou pri fiind
separate de un punct, cum ar fi prog.c. Partea care urmeaz dup punct se numete tipul sau
extensia fiierului i de obicei indic ceva despre fiier. n MS-DOS, de exemplu, numele de fiiere au
1 pn la 8 caractere, plus opional o extensie de 1 pn la 3 caractere. n UNIX, dimensiunea
extensiei, dac exist, este la latitudinea utilizatorului i un fiier poate avea dou sau mai multe
extensii, ca la prog.c.Z , unde .Z este cel mai adesea folosit pentru a indica faptul c fiierul (prog.c)
a fost comprimat folosind algoritmul de compresie Ziv-Lempel.
n anumite sisteme (de exemplu UNIX), extensiile fiierelor sunt doar convenii i nu sunt impuse de
sistemul de operare. Un fiier numit file.txt poate fi un fiier ce conine text, dar numele are mai
mult rolul de a aminti proprietarului dect de a transmite vreo informaie calculatorului. Pe de alt
parte, un compilator de C poate insista ca fiierele pe care le compileaz s se termine cu .c i altfel,
este posibil s refuze s le compileze.
Convenii ca acestea sunt folositoare ndeosebi atunci cnd acelai program poate manevra mai multe
tipuri diferite de fiiere. Compilatorului de C, de exemplu, i poate fi dat o list de fiiere pe care s le
compileze i s le lege mpreun, unele dintre ele fiiere C i unele dintre ele fiiere n limbaj de
asamblare. n acest caz extensia devine esenial pentru a spune compilatorului care este fiier C,
care este fiier n limbaj de asamblare i care sunt fiiere de alt tip.
Prin comparaie, Windows, este contient de extensii i le atribuie semnificaii. Utilizatorii (sau
procesele) pot nregistra extensii cu sistemul de operare i pot specifica pentru fiecare ce program
deine" acea extensie. Cnd un utilizator face dublu click pe numele unui fiier, programul asociat
extensiei sale este pornit cu fiierul ca parametru. De exemplu, fcnd dublu clic pe file.doc se
pornete Microsoft Word cu file.doc ca fiier iniial de editat.

6.1.2

Structura fiierelor

Fiierele pot fi structurate n mai multe moduri. Trei posibiliti uzuale sunt prezentate n figura
urmtoare. Fiierul din figura urmtoare (a) este o secven nestructurat de octei. Prin urmare
sistemul de operare nu tie i nu e interesat de ceea ce se afl n fiier. Tot ceea ce vede sunt octei.
Eventualul sens trebuie s fie impus de programe de la nivelul utilizator. Att UNIX ct i Windows
folosesc aceast abordare. La un sistem de operare care privete fiierele ca o secven de octei se
asigur o flexibilitate maxim. Programele utilizator pot pune ceea ce doresc n cmpurile lor i le pot
numi ntr-un mod convenabil. Sistemul de operare nu ne ajut, dar nici nu ne st n cale.
Primul pas spre structurare este artat n (b). n acest model, un fiier este o secven de nregistrri
de lungime fix, fiecare cu o structur intern proprie. Ceea ce st la baza ideii de fiier privit ca o

secven de nregistrri este faptul c operaia de citire ntoarce o nregistrare i operaia de scriere
suprascrie sau adaug o nregistrare.

Al treilea tip de structur de fiier este artat n (c). n aceast organizare, un fiier este alctuit dintrun arbore de nregistrri, nu neaprat toate de aceeai lungime, fiecare coninnd un cmp cheie la o
poziie fix din nregistrare. Arborele este sortat dup cmpul cheie, pentru a permite cutare rapid a
unei chei. Operaia de baz n acest caz, nu este s obinem urmtoarea" nregistrare, dei acest
lucru este de asemenea posibil, ci s obinem nregistrarea cu o anumit cheie. Pentru fiierul zoo din
(c) cineva poate cere nregistrarea care are cheia ponei, de exemplu, fr s tie poziia exact n
fiier. Mai mult, nregistrrile noi pot fi adugate la fiier, sistemul de operare hotrnd unde s le
plaseze, i nu utilizatorul.

6.1.3 Tipuri de fiiere


Multe din sistemele de fiiere suport mai multe tipuri de fiiere. UNIX i Windows de exemplu au
fiiere normale i cataloage. UNIX are de asemenea fiiere speciale de tip bloc sau caracter. Fiierele
normale sunt cele care conin informaia utilizatorului. Toate fiierele din figura de mai sus sunt fiiere
normale. Cataloagele sunt fiiere de sistem folosite pentru meninerea structurii sistemului de fiiere.
Fiierele speciale de tip caracter sunt legate de intrare/ieire i sunt folosite pentru a modela
echipamentele seriale I/O cum ar fi terminalele, imprimantele sau reelele. Fiierele speciale de tip
bloc (block special files) sunt folosite pentru a modela discuri.
Fiierele normale sunt n general fiiere ASCII sau fiiere binare. Fiierele ASCII constau n linii de
text. Liniile nu trebuie s aib toate aceeai lungime. Marele avantaj al fiierelor ASCII este c pot fi
afiate i imprimate aa cum sunt i pot fi modificate cu orice editor de text.
Un alt tip de fiiere sunt fiierele binare, care sunt diferite de fiierele ASCII. Prin imprimarea lor
rezult un ir neinteligibil care seamn cu un ir de caractere i simboluri aleatoare. De obicei au o
structur intern pe care o cunosc programele care le folosesc.
De exemplu, n figura urmtoare (a) avem un executabil binar simplu extras dintr-o versiune de UNIX.
Dei fiierul este practic doar o secven de octei, sistemul de operare va executa fiierul doar dac
are un format corect. Acesta are 5 seciuni: antet, text, date, biii de relocare i tabela de simboluri.
Antetul ncepe cu aa numitul numr magic (magic number), care identific fiierul ca executabil
(pentru a preveni executarea accidental a unui fiier care nu este n acest format). Urmeaz
dimensiunile diferitelor seciuni din program, adresa de la care ncepe execuia i civa bii indicatori.
Dup antet urmeaz seciunile de text i date ale programului propriu-zis. Acestea sunt ncrcate n
memorie i relocate folosind biii de relocare. Tabela de simboluri e folosit pentru depanare.

(a)

(b)

Al doilea exemplu de fiier binar este o arhiv, de asemenea din UNIX. Ea const dintr-o colecie de
proceduri (module) de bibliotec, compilate dar nelegate nc. Fiecare este prefaat de un antet care
i spune numele, data crerii, proprietarul, codul de protecie i dimensiunea. La fel ca la executabile,
antetele modulelor sunt pline de numere binare. Copierea lor pe o imprimant, ar produce o secven
neinteligibil.
Fiecare sistem de operare trebuie s recunoasc cel puin un tip de fiiere, propriile executabile, dar
unele recunosc mai multe.

6.1.4 Accesarea fiierelor


Sistemele de operare mai vechi asigurau doar un singur tip de accesare a fiierelor: acces secvenial.
n aceste sisteme, un proces putea citi toii octeii sau nregistrrile dintr-un fiier n ordine, ncepnd
de la nceput, dar nu putea s sar aleator i s i citeasc ntr-o alt ordine. Fiierele secveniale erau
convenabile atunci cnd se folosea pentru stocare banda magnetic i nu discul. Cnd discurile un
intrat n folosin pentru stocarea fiierelor, a devenit posibil s se citeasc octeii nregistrrilor n
orice ordine sau s se acceseze nregistrrile dup cheie i nu dup poziie. Fiierele ale cror octei
sau ale cror nregistrri pot fi citite n orice ordine sunt numite fiiere cu acces aleator.
Fiierele cu acces aleator sunt eseniale pentru multe aplicaii, de exemplu, sistemele de baze de date.
Dac un client al unor linii aeriene sun i vrea s rezerve un loc la un zbor anume, programul de
rezervri trebuie s fie capabil s acceseze nregistrarea despre acel zbor fr a trebui s citeasc
nregistrrile altor mii de zboruri mai nainte.
Se folosesc dou metode pentru a se specifica de unde se ncepe citirea. n prima dintre ele, fiecare
operaie de citire d poziia din fiier de unde s se nceap citirea. n a doua, o operaie special de

cutare este oferit pentru a seta poziia curent. Dup o operaie de cutare fiierele pot fi citite
secvenial de la noua poziie curent.

6.1.5 Atributele fiierelor


Fiecare fiier are numele su i datele sale. n plus, sistemele de operare asociaz alte informaii
pentru fiecare fiier, de exemplu, data i ora la care fiierul a fost creat i dimensiunea fiierului. Vom
numi aceste informaii suplimentare atributele fiierelor. Lista atributelor variaz considerabil de la
sistem la sistem. Tabelul din figura urmtoare arat unele din posibiliti, dar exist i altele. Nici unul
din sistemele de operare existente nu le are pe toate, dar fiecare dintre ele exist ntr-un sistem.
Atribut
Protecie
Parol
Creator
Proprietar
Indicator numai-citire
Indicator ascuns
Indicator sistem
Indicator arhiv
Indicator ASCII/binar
Indicator acces aleator
Indicator temporar
Indicator de ncuiere
Lungimea nregistrrii
Poziia cheii
Lungimea cheii
Data crerii
Timpul ultimei accesri
Timpul ultimei modificri
Dimensiunea curent

Semnificaie
Cine poate accesa fiierul i n ce fel
Parola necesar pentru a accesa fiierul
Identificatorul persoanei care a creat fiierul
Proprietarul curent
0 pentru citire/scriere; 1 pentru numai citire
0 pentru normal; 1 pentru cele ce nu sunt artate la listare
0 pentru fiiere normale; 1 pentru fiiere sistem
0 pentru a fost salvat; 1 pentru trebuie s fie salvat
0 pentru fiier ASCII; 1 pentru fiier binar
0 pentru acces numai secvenial; 1 pentru acces aleatoriu
0 pentru normal; 1 pentru terge fiier la terminare proces
0 pentru descuiat; 1 pentru ncuiat
Numrul de octei dintr-o nregistrare
Deplasarea cheii n cadrul nregistrrii
Numrul de octei din cheie
Data i ora cnd fiierul a fost creat
Data i ora cnd fiierul a fost accesat ultima oar
Data i ora cnd fiierul a fost modificat ultima oar
Numrul de octei din fiier

Primele patru atribute se refer la protecia fiierului i spun cine l poate accesa i cine nu. n unele
sisteme utilizatorul trebuie s prezinte o parol pentru a accesa un fiier, caz n care parola trebuie s
fie unul din atribute.
Indicatorii sunt bii sau cmpuri scurte care controleaz sau permit anumite proprieti specifice.
Fiierele ascunse, spre exemplu, nu apar n listarea tuturor fiierelor. Indicatorul de arhiv este un bit
care reine dac fiierului i-a fost fcut o copie de siguran. Programul de fcut copii de siguran l
terge, iar sistemul de operare l seteaz de fiecare dat cnd fiierul este modificat. n acest fel
programul de fcut copii de siguran tie ce fiiere au nevoie de copii de siguran. Indicatorul de
temporar permite ca un fiier s fie marcat pentru tergere automat atunci cnd procesul care l-a
creat se termin.
Cmpurile lungimea nregistrrii, poziia cheii i lungimea cheii sunt prezente doar n fiierele n care
localizarea nregistrrii se poate face dup o cheie. Ele asigur informaia necesar pentru a gsi
cheile.
Momentele de timp referitoare la data crerii fiierului, data ultimei accesri, data ultimei modificri
sunt utile pentru o varietate de scopuri. De exemplu, un fiier surs ce are data de modificare dup
data crerii fiierului executabil corespunztor trebuie s fie recompilat.
Dimensiunea curent ne arat ct de mare este fiierul n acest moment. Unele sisteme vechi de
operare ale calculatoarelor mari cereau ca dimensiunea maxim s fie specificat la crearea fiierului,
pentru ca sistemul de operare s rezerve maximul de spaiu n avans. Sistemele de operare ale

staiilor de lucru i calculatoarelor personale sunt suficient de inteligente pentru a se descurca fr


aceast informaie.

6.1.6 Operaiile fiierelor


Fiierele exist pentru a stoca informaie i a permite s fie recuperat mai trziu. Diferite sisteme de
operare ofer diferite operaii care permit salvarea i recuperarea. Mai jos este o discuie despre cel
mai folosite apeluri de sistem legate de fiiere:
1.
Creare (create). Fiierul este creat gol. Scopul acestui apel este anunarea apariiei
fiierului i setarea anumitor atribute.
2.
tergere (delete). Cnd nu mai este nevoie de acesta, fiierul va fi ters pentru a
elibera spaiul de pe disc. ntotdeauna exist un apel de sistem n acest scop.
3.
Deschidere (open). nainte de folosirea unui fiier, un proces trebuie s l deschid.
Scopul apelului de deschidere este de a permite sistemului s aduc atributele i lista de
adrese de pe disc n memoria principal, pentru accesul rapid la acestea n urma unor
apeluri ulterioare.
4.
nchidere (close). Cnd toate accesele s-au terminat i atributele, adresele de pe disc
nu mai sunt necesare, fiierul ar trebui nchis pentru a elibera spaiul intern de adrese.
Multe sisteme de operare ncurajeaz acest lucru prin impunerea unui numr maxim de
fiiere deschise per proces. Un disc este scris n blocuri i nchiderea unui fiier foreaz
scrierea ultimului bloc din fiier, chiar dac acel bloc s-ar putea sa nu fie complet nc.
5.
Citire (Read). Datele sunt citite din fiier. De obicei, octeii ncep de la poziia curent.
Cel care face apelul trebuie s specifice ct de mult informaie este necesar i trebuie
de asemenea s asigure o zon tampon n care s o stocheze.
6.
Scriere (write). Datele sunt scrise n fiier, din nou de la poziia curent. Dac poziia
curent se afl la sfritul fiierului, dimensiunea fiierului se mrete. Dac poziia
curent este n mijlocul fiierului, datele existente sunt suprascrise i pierdute pentru
totdeauna
7.
Adugare (append). Acest apel este o forma restrictiv de scriere. Poate doar s
adauge date la sfritul fiierului. Sistemele ce asigur un set minim de apeluri de sistem
nu au n general adugarea, dar multe sisteme asigur metode multiple de a face acelai
lucru.
8.
Cutare (seek). Pentru fiierele cu acces aleatoriu, este necesar o metod care s
specifice de unde s se ia datele. Una din cele mai comune abordri este un apel de
sistem, cutare, care repoziioneaz cursorul fiierului la un punct specific din fiier. Dup
ce apelul se termin, datele pot fi citite de la sau scrise la acea poziie.
9.
Obinerea atributelor (get attributes). De multe ori procesele trebuie s citeasc
atributele fiierelor pentru a-i ndeplini sarcina. De exemplu, programul UNIX, make este
de multe ori folosit pentru a ntreine dezvoltarea proiectelor software ce conin multe
fiiere surs. Atunci cnd se apeleaz make, acesta examineaz timpul de modificare
pentru toate fiierele surs i fiierele obiect i determin numrul minim de compilri
pentru a aduce totul la zi. Pentru a face acest lucru, trebuie s se uite la atribute, mai
exact la timpul de modificare.
10.
Setarea atributelor (set attributes). Unele din atribute pot fi setate de utilizatori i
pot fi modificate dup ce fiierul a fost creat. Acest apel de sistem face posibil
modificarea. Modul de protecie este un exemplu evident. Majoritatea indicatorilor intr de
asemenea n aceast categorie.
11.
Redenumire (Rename). Se ntmpl frecvent ca un utilizator s trebuiasc s schimbe
numele unui fiier existent. Acest apel de sistem face schimbarea posibil. Nu este mereu
strict necesar, deoarece de obicei fiierul poate fi copiat ntr-un fiier nou cu un nume
nou, iar fiierul vechi poate fi ters.

6.1.7 Un exemplu de program care folosete apeluri de sistem


n aceast seciune vom examina un program UNIX simplu care copiaz un fiier surs ntr-un fiier
destinaie. Programul este listat mai jos. Programul are funcionalitate minim i n plus are o
raportare de erori i mai redus, dar ne ilustreaz modul de funcionare pentru unele din apelurile de
sistem legate de fiiere. Programul copyfile, poate fi apelat, de exemplu, prin linia de comand:
copyfile abc xyz
pentru a copia fiierul abc n xyz. Dac xyz exist deja, va fi suprascris. Altfel, va fi creat. Programul
trebuie apelat cu exact dou argumente, ambele nume valide de fiier.
Cele patru directive #include de la nceputul programului fac ca un numr mare de definiii i
prototipuri de funcii s fie incluse n program. Acestea sunt necesare pentru a face programul
conform cu standardele internaionale, dar nu ne vom preocupa de acest lucru n continuare.
Urmtoarea linie este prototipul funciei main, ceva cerut de ANSI C, dar de asemenea neimportant
pentru scopurile noastre.
Prima directiv #define este definirea unui macro care face ca irul de caractere BUF_SIZE s se
expandeze n memorie n numrul 4096. Programul va scrie i va citi din memorie n buci de 4096 de
octei. Se consider un bun exemplu de programare dac se dau nume simbolice constantelor ca
aceasta i s se foloseasc numele lor n loc de constante. Nu doar c aceast convenie face
programul mai uor de citit, dar l i face mai uor de ntreinut. A doua directiv #define determin
cine poate accesa fiierul de ieire.
Programul principal se numete main i are dou argumente, argc i argv. Acestea sunt furnizate de
sistemul de operare atunci cnd programul este apelat. Primul spune cte iruri de caractere au fost
prezente la linia de comand cu care a fost invocat programul, inclusiv numele programului. Ar trebui
s fie 3. Al doilea argument este un vector de pointeri la argumente. n apelul exemplificat mai sus,
elementele acestui vector ar conine poineri ctre urmtoarele valori:
argv[0] = "copyfile"
argv[1] = "abc"
argv[2] = "xyz"
Prin acest vector programul i acceseaz argumentele. Sunt declarate cinci variabile. Primele dou,
in_fd i out_fd, vor reine descriptorii de fiier, nite ntregi mici ntori atunci cnd fiierul se
deschide. Urmtoarele dou, rd_count i wt_count sunt variabilele care numr octeii ntori de
apelurile de sistem citire read i scriere write. Ultima variabil, buffer, este zona tampon folosit
pentru a reine datele citite i a asigura datele ce urmeaz a fi scrise.
/*

Program de copiere a fiierelor.


Verificarea i raportarea erorilor este minim.

*/
#include<sys/types.h> /*include fiierele antet necesare*/
#include<fcntl.h>
#include<stdlib.h>
#include<unistd.h>
int main(int argc, char *argv[]);
/*prototip ANSI*/
#define BUF_SIZE 4096
/*folosete o zon tampon de 4096 octei*/
#define OUTPUT_MODE 0700
/*biii de protecie pentru fiierul de ieire*/
int main(int argc, char *argv[]) {
int in_fd, out_fd, rd_count,wt_count;
char buffer[BUF_SIZE];
if (argc != 3) exit(1);

/*eroare de sintax dac argc nu e 3*/

/*Deschide fiierul de intrare i creeaz fiierul


in_fd = open(argv[1], O_RDONLY);
if (in_fd < 0) exit(2);
out_fd= creat(argv[2], OUTPUT_MODE);
if (out_fd< 0) exit(3);

de ieire*/
/*deschide fiierul surs*/
/*dac nu poate fi deschis, ieire*/
/*creeaz fiierul destinaie*/
/*dac nu poate fi creat, ieire*/

/*Bucla de copiere*/
while(TRUE)
{
rd_count = read(in_fd, buffer, BUF_SIZE);
/*citete un bloc de date*/
if (rd_count<= 0) break;
/*dac sfrit de fiier sau eroare, ieire bucl*/

/* scrie datele*/
wt_count=write(outfd,buffer,rd_count);
if (wt_count<= 0) exit(4);
/*wt_count <= 0 este o eroare*/

/*nchide fiierele*/
close(in_fd);
close(out_fd);
if (rd_count== 0) exit(0);
else exit(5);

/*nici o eroare la ultima citire*/


/*eroare la ultima citire*/

Prima instruciune verific dac argc este 3. Dac nu, se iese din program cu codul 1. Orice alt cod de
ieire diferit de 0 nseamn c a aprut o eroare. Codul de ieire este singurul mod de raportare a
erorilor prezent n acest program. O variant de program de producie ar afia de asemenea mesaje
de eroare.
Mai apoi ncercm s deschidem fiierul surs i s crem fiierul destinaie. Dac fiierul surs este
deschis cu succes, sistemul de operare atribuie un ntreg lui in_fd, pentru a identifica fiierul. Apelurile
ulterioare trebuie s includ acest ntreg, pentru ca sistemul de operare s tie ce fiier se dorete.
Similar, dac fiierul destinaie e deschis cu succes, i se d i lui out_fd o valoare pentru identificare.
Al doilea argument al lui creat seteaz modul de protecie. Dac deschiderea sau crearea eueaz,
descriptorul de fiier asociat este setat pe -l i programul iese cu un cod de eroare.
Urmeaz bucla de copiere. ncepe prin ncercarea de a citi 4 KO de date n tampon. Face acest lucru
chemnd procedura de bibliotec read, care de fapt invoc apelul de sistem read. Primul parametru
identific fiierul, al doilea i ofer zona tampon i al treilea i spune ci octei s citeasc. Valoarea
atribuit lui rd_count ne arat numrul de octei efectiv citii. n mod normal acesta trebuie s fie de
4096, cu excepia cazului cnd mai puini octei au rmas n fiier. Atunci cnd se ajunge la sfritul
fiierului, acesta este 0. Dac rd_count este vreodat 0 sau negativ, copierea nu poate continua, deci
este executat instruciunea break pentru a termina bucla (altfel infinit).
Apelul funciei write, scrie coninutul zonei tampon n fiierul destinaie. Primul parametru identific
fiierul, al doilea ofer zona tampon i al treilea spune ci octei s se scrie, analog ca la read. De
notat c numrul de octei considerat este cel efectiv citit i nu BUF_SIZE. Acest lucru este important
pentru c ultimul apel de read nu va ntoarce 4096, dect dac fiierul are o dimensiune multiplu de
4KO.
Dup ce ntreg fiierul a fost procesat, primul apel dincolo de sfritul fiierului va pune 0 n rd_count,
ceea ce va duce la ieirea din bucl. n acest moment cele dou fiiere sunt nchise i programul iese
cu un cod ce arat c totul a funcionat normal.
Dei apelurile de sistem Windows sunt diferite de cele din UNIX, structura general a uni program n
linia de comand Windows pentru copierea unui fiier este ct de ct similar cu cea din codul de mai
sus.

6.1.8

Fiiere direct n memorie

Muli programatori sunt de prere c accesarea fiierelor n modul descris mai sus este greoaie i
neconvenabil, n special dac se face comparaia cu accesarea memoriei obinuite. Din acest motiv,
anumite sisteme de operare, au pus la dispoziie o metod de a pune n coresponden un fiier cu
spaiul de adrese al unui proces care ruleaz. n mod conceptual, ne putem imagina existena a dou
apeluri noi de sistem, map (pune n coresponden) i unmap (anuleaz corespondena). Primul
ofer un nume fiierului i o adres virtual, ceea ce face ca sistemul de operare s pun n
coresponden fiierul cu zona de la adresa virtual din spaiul de adrese.
De exemplu, s presupunem un fiier f, cu lungimea de 64KO, este pus n coresponden cu adresa
virtual ce ncepe la adresa 512K. n continuare orice instruciune n cod main care citete
coninutul octetului de la adresa 512K, va primi octetul 0 al fiierului i aa mai departe. n mod
similar, o scriere la adresa 512K+21000 modific octetul 21000 al fiierului. Atunci cnd procesul se
termin, fiierul modificat este lsat pe disc ca i cum ar fi fost schimbat de o combinaie de apeluri
de sistem seek i write.
Ceea ce se ntmpl de fapt este c tabelele interne ale sistemului sunt schimbate s fac fiierul s
devin locul de stocare al zonei de memorie de la 512K la 576K. Prin urmare, o citire de la 512K
cauzeaz un defect de pagin, care aduce pagina 0 a fiierului. n mod similar, o scriere la 512K+1100
cauzeaz un defect de pagin, aducnd pagina ce conine acea adres, dup care poate avea loc
scrierea n memorie. n cazul n care pagina este evacuat de algoritmul de nlocuire a paginilor, este
scris napoi, la locul potrivit din fiier. Atunci cnd procesul se termin, toate paginile cu
coresponden n memorie care au fost modificate sunt scrise la loc n fiierele lor.
Punerea n coresponden a fiierelor n memorie funcioneaz cel mai bine n sistemele ce suport
segmentare. ntr-un asemenea sistem, fiecare fiier poate fi pus n coresponden cu un segment
propriu, astfel nct octetul k din fiier este octetul k din segment. n figura de mai jos (a) avem un
proces care are dou segmente, text i date. S presupunem c acest proces copiaz fiiere, la fel ca
programul anterior. Mai nti pune n coresponden fiierul surs, s spunem abc, n unul din
segmente. Apoi creaz un segment nou i l pune n coresponden cu fiierul destinaie, xyz, n
exemplul nostru. Aceste operaii ne aduc la situaia din figura de mai jos (b).

n acest moment procesul poate copia segmentul surs n segmentul destinaie folosind o bucl de
copiere obinuit. Nu e nevoie de nici un apel de sistem read sau write. Atunci cnd totul se termin,
se poate executa apelul de sistem unmap pentru a terge fiierele din spaiul de adrese i apoi se
iese. Fiierul de ieire, xyz, va exista acum, ca i cum ar fi fost creat n modul convenional.
Dei punerea fiierelor direct n memorie elimin nevoia de I/O, deci face programarea mai uoar,
introduce cteva probleme proprii. Este greu ca sistemul de operare s tie dimensiunea exact a
fiierului de ieire, xyz, n exemplul nostru. Poate spune cu uurin numrul celei mai mari pagini
scrise, dar nu poate s tie ci octei au fost scrii n acea pagin. S presupunem c programul
folosete doar pagina 0 i dup execuie toi octeii sunt n continuare 0 (valoarea iniial). Poate c
xyz este un fiier care const n 10 de zero. Poate c e un fiier care const n 100 de zero. Poate c e

un fiier care const n 1000 de zero. Sistemul de operare nu poate spune. Tot ce poate s fac este
s creeze un fiier de lungime egal cu dimensiunea paginii.
O a doua problem poate aprea (eventual) dac un fiier este pus direct n memorie de un proces i
deschis n mod convenional pentru citire de un altul. Dac primul proces modific o pagin,
schimbarea nu va fi reflectat n fiierul de pe disc pn cnd pagina nu este evacuat. Sistemul
trebuie s aib foarte mare grij pentru a fi sigur c cele dou procese nu vd versiuni inconsistente
ale fiierului.
O a treia problem cu punerea direct n memorie este c un fiier poate fi mai mare dect un
segment, sau chiar mai mare dect ntregul spaiu de adrese. Singura cale de ieire este de a aranja
ca apelul de sistem map s fie capabil c pun mai degrab n memorie o poriune din fiier, dect tot
fiierul. Dei acest lucru funcioneaz, este evident mai puin satisfctor dect punerea n memorie a
ntregului fiier.

6.2 Cataloage
Pentru a organiza i a ine evidena fiierelor, sistemele de fiiere folosesc aa-numitele cataloage
(catalogues) sau mape (folders), care n multe sisteme, sunt chiar ele nsele fiiere.

6.2.1 Sisteme cu un singur nivel de cataloage


Cea mai simpl form de sistem de cataloage este s avem un catalog care s conin toate fiierele,
denumit de cele mai multe ori catalog rdcin (root directory). Pe calculatoarele personale mai vechi,
acest sistem era des ntlnit, n mare parte din cauz c exista un singur utilizator. Ins trebuie
remarcat c i primul super-calculator din lume, CDC 600 avea tot un singur catalog pentru toate
fiierele, dei era folosit de mai muli utilizatori n acelai timp, pentru a menine simpl dezvoltarea
programelor.
Un exemplu de sistem cu un catalog este dat n figura de mai jos. Aici catalogul conine patru fiiere.
In figur sunt artai proprietarii fiierelor i nu numele acestora (pentru c proprietarii sunt
importani pentru ceea ce urmeaz). Avantajele acestei scheme sunt simplitatea i posibilitatea de a
localiza fiierele repede, n fond este doar un loc unde trebuie cutat.

Problema care apare la un sistem cu un singur catalog i cu mai muli utilizatori este c utilizatori
diferii pot folosi n mod accidental aceleai nume pentru fiierele lor. De exemplu, dac utilizatorul A
creeaz un fiier care se numete mailbox i mai apoi utilizatorul B creeaz i el un fiier care se
numete mailbox, fiierul lui B n va suprascrie pe cel al lui A. Prin urmare, aceast schem nu mai
este folosit pe sistemele multiutilizator.

6.2.2 Sisteme de cataloage cu dou nivele


Pentru a evita conflictele cauzate de alegerea identic a numelor de fiiere proprii pentru mai muli
utilizatori, urmtorul pas a fost s se dea fiecrui utilizator cte un catalog. n acest mod, numele
alese de un utilizator nu interfereaz cu numele alese de alt utilizator i nu e nici o problem dac

exist fiiere cu acelai nume n dou sau mai multe cataloage. Aceast implementare duce la un
sistem ca n figura urmtoare.

n mod implicit n aceast implementare cnd un utilizator ncearc s deschid un fiier, sistemul
trebuie s tie despre ce utilizator e vorba, pentru a ti n ce catalog s caute. n consecin, e nevoie
de o procedur de autentificare, n care fiecare utilizator specific un nume sau un identificator, ceea
ce nu era necesar la sistemele cu un singur nivel de cataloage.
Dac acest sistem este implementat n forma cea mai simpl, utilizatorii pot accesa doar fiierele din
cataloagele lor. n orice caz, o mic extensie permite unui utilizator s acceseze fiierele altor
utilizatori atunci cnd se furnizeaz o informaie despre proprietarul fiierului care va fi deschis. De
exemplu,
open("x")
ar putea fi apelul pentru deschidea fiierului numit x din catalogul utilizatorului i
open("nancy/x")
ar putea fi apelul pentru deschiderea fiierului numit x din catalogul altui utilizator, Nancy.
Una din situaiile n care utilizatorii au nevoie s acceseze alte fiiere dect ale lor este cea n care se
ruleaz programele executabile ale sistemului. Existena unor copii ale tuturor programelor utilitare n
fiecare catalog este n mod cert ineficient. La o adic e nevoie de un catalog de sistem care s
conin programele executabile.

6.2.3 Sisteme de cataloage ierarhice


Sistemul cu dou nivele de cataloage elimin conflictele de nume dintre utilizatori, dar nu este
satisfctor pentru utilizatorii cu un numr mare de fiiere. Chiar i pe un singur calculator personal
este neconvenabil. Este destul de ntlnit situaia n care un utilizator vrea s i grupeze fiierele
dup un model logic. Un profesor de exemplu, poate avea o colecie de fiiere, care mpreun
formeaz o carte, pe care el o scrie pentru un curs, o a doua colecie de fiiere coninnd programele
studenilor trimise pentru un alt curs, un al treilea grup de fiiere, coninnd codul unui sistem avansat
de scris compilatoare pe care el l construiete, un al patrulea grup de fiiere coninnd propunerile de
contracte de cercetare i de asemenea alte fiiere pentru pota electronic, amnunte despre ntlniri,
lucrri pe care le scrie i aa mai departe. Este necesar o metod de a grupa aceste fiiere n moduri
flexibile, alese de utilizator.
Astfel ajungem la nevoia de a avea o ierarhie general (de ex., un arbore de cataloage). Prin aceast
abordare, fiecare utilizator are attea cataloage cte are nevoie, astfel nct fiierele s fie grupate n
moduri ct mai naturale. Aceast abordare este exemplificat n figura urmtoare. Aici, cataloagele A,

B i C, fiecare coninute n catalogul rdcin, aparin unor utilizatori diferii, dintre care doi au creat
subcataloage pentru proiectele la care lucreaz.

Abilitatea ca utilizatorii s creeze un numr arbitrar de subcataloage ofer o unealt foarte puternic
de structurare pentru utilizatori s-i organizeze munca. Din acest motiv, majoritatea sistemelor de
operare moderne sunt organizate n acest scop.

6.2.4 Numele cilor


Atunci cnd sistemul de fiiere e organizat ca un arbore de cataloage, este nevoie de o metod de a
specifica numele. Exist dou metode diferite care se folosesc. n prima metod se d un nume de
cale absolut (absolut path name) constnd n calea de la catalogul rdcin pn la fiier. Spre
exemplu, calea /usr/ast/mailbox nseamn c n catalogul rdcin avem un subcatalog usr, care
la rndul lui conine un subcatalog ast, care conine fiierul mailbox. Numele de ci absolute ncep
ntotdeauna de la catalogul rdcin i sunt unice. n UNIX, componentele cii sunt separate de /. n
Windows separatorul este \. Prin urmare aceeai cale n cele dou sisteme s-ar fi scris aa:
Windows:
UNIX:

\usr\ast\mailbox
/usr/ast/mailbox

Indiferent ce caracter separator se utilizeaz, dac primul caracter al numelui cii este chiar
separatorul, atunci este vorba de o cale absolut.
Cellalt tip de nume este nume de cale relativ (relative path name). Acesta este folosit n conjuncie
cu conceptul de catalog de lucru (working directory), numit de asemenea i catalog curent (current
directory). Utilizatorul poate desemna un catalog ca i catalog de lucru, caz n care toate cile care nu
ncep de la catalogul rdcin sunt considerate relative la catalogul curent. De exemplu, dac
catalogul curent este: /usr/ast, atunci fiierul a crui cale absolut este /usr/ast/mailbox poate fi
referit simplu ca mailbox. Cu alte cuvinte, comanda UNIX,
cp /usr/ast/mailbox /usr/ast/mailbox.bak
i comanda
cp mailbox mailbox.bak
fac exact acelai lucru dac /usr/ast este catalogul de lucru. Forma relativ este de multe ori mai
convenabil, dar face exact acelai lucru ca forma absolut. Unele programe trebuie s acceseze un
anume fiier indiferent de catalogul de lucru. n acest caz, trebuie folosite ntotdeauna nume de ci
absolute.

Majoritatea sistemelor ce suport un sistem de fiiere ierarhic au dou intrri speciale n fiecare
catalog, notate cu "." i "..", pronunate de obicei punct" respectiv punct punct". "." se refer la
catalogul curent n vreme ce ".." se refer la catalogul printe. Pentru a vedea cum sunt acestea
folosite, s considerm arborele UNIX din figura urmtoare.

Un anume proces are ca i catalog de lucru /usr/ast. Poate folosi ".." pentru a merge n sus n arbore.
De exemplu poate copia fiierul /usr/lib/dictionary n catalogul propriu folosind comanda:
cp ../lib/dictionary .
Prima cale anun sistemul s mearg n sus (n catalogul usr), apoi s mearg n jos spre catalogul lib
pentru a gsi fiierul dictionary. Al doilea argument, "." indic catalogul curent. Atunci cnd comanda
cp primete un nume de catalog (inclusiv punct) ca ultim argument, copiaz toate fiierele acolo.
Bineneles, o metod mai normal de a copia ar fi:
cp /usr/lib/dictionary .
Aici, folosirea punctului l scutete pe utilizator de tastarea cuvntului dictionary a doua oar. Dar
oricum, tastarea comenzii:
cp /usr/lib/dictionary dictionary
funcioneaz, la fel cum funcioneaz i
cp /usr/lib/dictionary /usr/ast/dictionary
Toate aceste comenzi fac exact acelai lucru.

6.2.5 Operaiile cataloagelor


Apelurile de sistem permise pentru administrarea cataloagelor au o variaie foarte mare de la sistem la
sistem, spre deosebire de cele de la fiiere. Pentru a v face o impresie asupra lor i cum
funcioneaz, vom da un exemplu (specific UNIX).
1. Creare (create). Se creaz un catalog. Este gol, excepie fcnd "." i "..", care sunt puse
acolo automat de sistem (sau n anumite cazuri de programul mkdir).
2. tergere (delete). Se terge un catalog. Se poate terge numai un catalog gol. Un catalog
care conine doar "." i ".." se consider gol i acestea nu pot fi terse n mod normal.
3. Deschidere catalog (opendir). Cataloagele pot fi citite. Spre exemplu, pentru afiarea
tuturor fiierelor dintr-un catalog, un program deschide catalogul pentru a citi numele tuturor
fiierelor pe care le conine. nainte ca un catalog s fie citit, trebuie deschis, analog cu
deschiderea si citirea fiierelor.
4. nchiderea cataloagelor (closedir). Cnd un catalog a fost citit, ar trebui s fie nchis,
pentru a elibera spaiul din tabela intern.
5. Citirea cataloagelor (readdir). Acest apel ntoarce urmtoarea intrare ntr-un catalog
deschis. La nceputuri, era posibil s se citeasc cataloagele folosind apelul de sistem obinuit
de read (citire), dar aceast abordare are dezavantajul c foreaz programatorul s cunoasc
i s se descurce cu structura intern a cataloagelor. Prin contrast, readdir ntoarce
ntotdeauna o intrare n formatul standard, indiferent care din structurile posibile de cataloage
se folosete.
6. Redenumirea (rename). n multe privine, cataloagele sunt la fel ca fiierele i pot fi
redenumite la fel ca fiierele.
7. Legarea (link). Legarea este o tehnic ce permite unui fiier s apar n mai mult de un
catalog. Acest apel de sistem specific un fiier existent i un nume de cale i creeaz o
legtur de la fiierul existent la numele specificat prin cale. n acest mod, acelai fiier poate
aprea n mai multe cataloage.
8. Dezlegarea (unlink). Se terge o intrare dintr-un catalog. Dac fiierul care se dezleag
este prezent ntr-un catalog, (cazul normal), este ters din sistemul de fiiere. Dac e prezent
n mai multe cataloage, doar numele specificat prin cale este ters. Celelalte rmn. n UNIX,
apelul de sistem folosit pentru tergerea fiierelor i prezentat mai devreme este de fapt
unlink.
Lista de mai sus ne arat cele mai importante apeluri de sistem, dar mai sunt i altele, spre exemplu,
pentru administrarea informaiilor legate de protecia cataloagelor.

6.3 Implementarea sistemului de fiiere


6.3.1 Planul sistemului de fiiere
Sistemele de fiiere sunt stocate pe discuri. Majoritatea discurilor pot fi mprite n una sau mai multe
partiii, cu sisteme de fiiere independente pe fiecare dintre partiii. Sectorul 0 al discului se numete
MBR (Master Boot Record Inregistrarea principal de pornire) i este folosit pentru a starta
calculatorul. La sfritul MBR-ului se afl tabela de partiii. Aceast tabel ofer informaii cu privire la
nceputul i sfritul tuturor partiiilor. Numai una din partiiile din tabel este marcat ca activ. La
pornirea calculatorului este executat informaia din MBR. Primul lucru pe care l face programul din
MBR este s localizeze partiia activ, s citeasc primul ei bloc, numit bloc de iniializare (boot block)
i s l execute. Programul din blocul de iniializare ncarc sistemul de operare coninut n partiia
respectiv. Pentru uniformitate fiecare partiie ncepe cu un bloc de iniializare, chiar dac nu conine
un sistem de operare. Oricum, partiia poate s conin n viitor un astfel de sistem de operare i deci
pstrarea unui bloc de iniializare devine o idee potrivit.
n afar de faptul c ncep cu un bloc de iniializare, planul partiiei este foarte variabil n funcie de
sistemul de fiiere. De multe ori sistemul de fiiere va conine unele din elementele prezentate n

figura urmtoare. Primul element este superblocul (superblock). Coninnd toi parametrii principali
legai de sistemul de fiiere, el este citit n memorie cnd calculatorul este iniializat sau cnd sistemul
de fiiere este creat pentru prima dat. Informaia tipic din superbloc conine un numr ce identific
tipul de sistem, numrul de blocuri din sistemul de fiiere i alte informaii administrative importante.

Apoi pot urma informaii despre blocurile libere din sistemul de fiiere, spre exemplu sub form de
hart de bii sau list de pointeri. Aceasta poate fi urmat de i-noduri, care este un vector de structuri
de date, cu cte un i-nod pentru fiecare fiier, coninnd informaii exhaustive cu privire la acesta.
Dup aceasta poate urma catalogul rdcin, ce reprezint vrful arborelui sistemului de fiiere. n
cele din urm, restul discului este n general ocupat de toate celelalte cataloage i fiiere.

6.3.2

Implementarea fiierelor

Probabil c cea mai important discuie legat de implementarea stocrii de fiiere este pstrarea
legturii ntre fiiere i blocurile alocate acestora. n funcie de sistemul de operare sunt folosite
diferite metode.
Alocarea continu
Cea mai simpl schem de alocare este de a stoca fiecare fiier ca o niruire continu de blocuri. n
acest fel pe un disc cu blocuri de 1KB, un fiier de 50KB ar avea alocate 50 de blocuri consecutive. Tot
pentru un astfel de fiier, pentru un disc cu blocuri de 2KB, ar fi necesare 25 de blocuri consecutive.
Figura urmtoare (a) prezint un exemplu de alocare continu de spaiu de stocare. n acest caz sunt
evideniate primele 40 de blocuri, ncepnd cu blocul 0 din partea stng. Un fiier A, cu lungimea de
patru blocuri, este scris pe disc ncepnd de la blocul 0. Urmeaz un fiier B, de ase blocuri lungime,
acesta este scris imediat dup sfritul fiierului A. De notat faptul c fiecare dintre fiiere ncepe cu
un nou bloc, astfel, dac fiierul A are ca dimensiune 3.5 blocuri, o parte din spaiu va fi irosit la
sfritul ultimului bloc. n figur sunt reprezentate apte fiiere, fiecare ncepnd cu blocul imediat
urmtor ultimului bloc al fiierului anterior. Haurarea este folosit doar pentru a diferenia fiierele.
Alocarea continu de spaiu are dou avantaje principale. Primul avantaj este implementarea simpl,
aceasta doarece a ine minte locaia blocurilor unui fiier se reduce la a reine dou numere: adresa
primului bloc i numrul blocurilor ce aparin fiierului. Dndu-se numrul primului bloc, numrul
blocului urmtor poate fi obinut printr-o simpl adunare.
Al doilea avantaj este performana crescut, ntregul fiier putnd fi citit de pe disc ntr-o singur
operaie. Este necesar o singur operaie de localizare (pn la primul bloc). Apoi, nu mai sunt

necesare alte operaii de localizare sau ntrzieri de rotaie pentru ca datele s fie citite la viteza
maxim de pe disc. Astfel alocarea continu este simplu de implementat i are o performan
crescut.

Din pcate, alocarea continu are i un mare dezavantaj: n timp discul devine fragmentat. Pentru a
nelege aceasta mai bine, s urmrim (b). Aici dou fiiere, D i F au fost terse. Cnd un fiier a fost
ters, blocurile sale sunt eliberate, lsnd o serie de blocuri libere pe disc. Discul nu este comprimat n
acest caz pentu a elimina aceste goluri, deoarece aceasta ar nsemna copierea tuturor blocurilor ce
urmeaz, posibil milioane de astfel de blocuri. Ca rezultat, discul este n cele din urm format din
fiiere i goluri, cum este ilustrat n figur.
Iniial, fragmentarea nu este o problem deoarece fiecare fiier nou poate fi scris la sfritul discului,
dup terminarea tuturor celorlalte fiiere. Totui, n cele din urm, discul va fi complet ocupat i atunci
va fi necesar fie compactarea, care este o operaie neoptim, sau refolosirea spaiului liber din goluri.
Folosirea acestui spaiu nseamn pstrarea unei liste de goluri, lucru realizabil n practic. Totui, cnd
un fiier nou este creat, este necesar cunoaterea apriori a dimensiunii finale a acestuia pentru a
alege golul de dimensiunile potrivite pentru stocare.
Imaginai-v consecinele unui astfel de design. Un utilizator folosete un editor de texte pentru a crea
un nou fiier. Primul lucru pe care programul l ntreab este care va fi dimensiunea final a acestui
document. ntrebarea este obligatorie, altfel editorul nu va putea fi folosit. n cele din urm, dac
dimensiunea se dovedete prea mic, programul va trebui s i ncheie funcionarea prematur,
deoarece golul folosit este complet utilizat i nu mai exist loc n continuare pentru a scrie i restul
fiierului. Dac utilizatorul ncearc s ocoleasc aceast problem introducnd o valoare exagerat de
mare ca dimensiune final a fiierului, s spunem 100 MB, este posibil ca editorul s nu gseasc un
gol de o astfel de dimensiune i s anune faptul c fiierul nu poate fi creat. Desigur utilizatorul va
avea opiunea de a ncerca cu o dimensiune mai mic, s spunem 50MB de aceasta dat i tot aa
pn cnd un gol de dimensiunile potrivite este gsit. Un astfel de design este ns inacceptabil.
Exist ns o situaie n care alocarea continu de spaiu este fezabil i, n fapt, utilizat pe scar
larg: la CD-ROM-uri. Aici dimensiunile tuturor fiierelor sunt cunoscute apriori i nu se vor modifica la
utilizri diferite ale sistemului de fiiere de pe CD-ROM. Alocarea continu a fost n fapt folosit pentru
discurile magnetice, cu muli ani nainte, datorit simplitii i performanelor ridicate (pe atunci nu
conta foarte mult prerea utilizatorilor). Apoi ideea a fost abandonat datorit absurditii de a declara
dimensiunea final la crearea unui nou fiier. Totui cu lansarea CD-ROM-urilor, a DVD-urilor i a altor
suporturi de date optice cu o singur scriere, din nou alocarea continu pare o idee foarte bun. De
aceea este util studierea sistemelor vechi i ideilor ce sunt simple i clare conceptual, deoarece pot fi
utile n viitor n situaii surprinztoare.

Alocarea cu liste nlnuite


A doua metod pentru stocarea fiierelor este de a pstra pe fiecare dintre acestea ntr-o list
nlnuit de blocuri, aa cum arat figura urmtoare. Primul cuvnt al fiecrui bloc este folosit ca
pointer la urmtorul. Restul blocului este destinat datelor.
Fiier A

Spre diferen de alocarea continu, n aceast metod pot fi folosite toate blocurile. Spaiul nu este
pierdut din cauza fragmentrii (cu excepia fragmentrii interne din ultimul bloc). De asemenea, este
suficient ca intrarea catalogului s pstreze adresa primului bloc. Urmtoarele blocuri pot fi aflate
pornind de la acesta. Pe de alt parte, dei citirea unui fiier este pur secvenial, accesul aleator este
extrem de ncet. Pentru a ajunge la blocul n, sistemul de operare trebuie s nceap cu nceputul i s
citeasc cele n-1 blocuri dinaintea sa, cte unul pe rnd. Evident c, realiznd attea operaii de citire,
procesul va fi dureros de ncet.
De asemenea, cantitatea de date ce pot fi stocate ntr-un bloc nu mai este o putere a lui doi, deoarece
pointerul ocup el nsui civa octei. Dei nu imposibil de realizat, avnd o astfel de dimensiune
specific este mai ineficient deoarece multe programe execut operaii de citire i scriere pe blocuri a
cror dimensiuni este o putere a lui doi. Avnd primii octei ocupai de pointerul la blocul urmtor,
citirea ntregului bloc necesit preluarea i concatenarea informaiilor din dou blocuri, ceea ce
genereaz o ntrziere din cauza copierii.
Ambele dezavantaje ale alocrii folosind liste nlnuite pot fi eliminate prin preluarea pointerului din
fiecare bloc i pstrarea acestuia ntr-o tabel n memorie. Figura urmtoare prezint o astfel de
tabel pentru exemplul anterior. n ambele figuri avem dou fiiere. Fiierul A folosete blocurile 4, 7,
2, 10 i 12 n aceast ordine, iar fiierul B folosete n ordine blocurile 6, 3, 11 i 14. Folosind tabela
din figura urmtoare, putem ncepe cu blocul 4 i s urmm lanul pn la sfritul fiierului. Acelai
lucru poate fi obinut pornind de la blocul 6. Ambele lanuri sunt terminate cu un marcator special (n
exemplul nostru -1) ce nu este un numr de bloc valid. O astfel de tabel pstrat n memoria
principal este numit FAT (File Allocation Table - Tabel de alocare a fiierelor).
Folosind aceast organizare, ntregul bloc este destinat pstrrii datelor. Mai mult dect att, accesul
aleator este mult uurat. Dei lanul trebuie n continuare s fie urmat pentru a gsi o locaie dat
ntr-un fiier, lanul este n ntregime n memorie i poate fi astfel urmat nct s nu se fac nici o
referire la disc. Ca i n cazul metodei anterioare, este suficient ca intrarea catalogului s pstreze un
singur ntreg (numrul blocului de start) i pornind de la acesta s localizam toate blocurile, indiferent
ct de mare este fiierul.
Dezavantajul principal al acestei metode este c ntreaga tabel trebuie pstrat n memorie tot timpul
pentru ca sistemul s funcioneze. Cu un disc de 20GB i o dimensiune a blocurilor de 1KB, o tabel

are nevoie de 20 de miloane de intrri, cte una pentru fiecare dintre cele 20 de milioane de blocuri.
Fiecare intrare trebuie s aib cel puin 3 octei. Pentru o vitez crescut la regsirea informaiei ar
trebui s fie 4 octei. n acest fel tabela va ocupa tot timpul pn la 60 MB sau 80MB din memoria
principal, depinznd de optimizrile sistemului n timp i spaiu. Conceptual, tabela poate fi stocat i
n memoria paginat, totui ar ocupa n continuare o cantitate mare de memorie virtual i spaiu pe
disc, n timp ce ar genera un trafic crescut de paginare.

I-noduri
Ultima metod prezentat, pentru a pstra corespondena ntre fiiere i blocurile alocate, este de a
asocia cu fiecare fiier o structur de date numit i-nod (prescurtare de la index-node - nod-index),
ce pstreaz atributele i adresele pe disc ale blocurilor ce aparin fiierului. Un exemplu simplu este
prezentat n figura urmtoare.

Dndu-se un i-nod, este posibil s gsim apoi toate blocurile fiierului. Marele avantaj al acestei
metode, fa de fiierele nlnuite folosind o tabel n memorie, este aceea c un i-nod trebuie s fie
n memorie doar cnd fiierul corespunztor este accesat. Dac fiecare i-nod ocup n octei i un
maxim de k fiiere pot fi accesate simultan, memoria total ocupat de un vector coninnd i-nodurile
acestor fiiere este de doar kn octei. Doar acest spaiu trebuie alocat n avans.
Acest vector este n general mult mai mic dect spaiul ocupat de tabela de fiiere descris n
seciunea anterioar. Motivul este simplu. Tabela ce pstreaz lista nlnuit a tuturor blocurilor este
proporional n dimensiuni cu ntregul disc. Dac discul are n blocuri, tabela are nevoie de n intrri.
Pe msur ce discul crete n dimensiuni, tabela crete n dependen liniar. Prin contrast, metoda
folosind i-noduri necesit un vector n memorie cu dimensiuni proporionale cu numrul maxim de
fiiere ce pot fi accesate simultan. Nu are relevan faptul c discul poate avea 1 GB sau 10 GB sau
100 GB.
O problem cu i-nodurile este aceea c fiecare dintre ele are un spaiu pentru un numr limitat de
adrese de disc, ce se ntmpl cnd un fiier crete peste aceast limit? O soluie este rezervarea
ultimei adrese de disc nu pentru un bloc de date, ci pentru adresa unui bloc ce conine mai multe
adrese de blocuri de disc, aa cum se observ n figura de anterioar. O metod chiar i mai avansat
este pstrarea a dou sau mai multe astfel de blocuri ce conin adrese de disc sau chiar blocuri ce
pstreaz blocuri de disc pline de adrese.

6.3.3

Implementarea cataloagelor

nainte ca un fiier s poat fi citit, el trebuie deschis. Cnd un fiier este deschis, sistemul de operare
folosete calea indicat de utilizator pentru localizarea intrrii catalogului. Intrarea catalogului ofer
informaia necesar pentru localizarea blocurilor de disc. Depinznd de sistem, aceast informaie
poate s fie adresa pe disc a ntregului fiier (alocare continu), numrul primului bloc (amndou
schemele folosind liste nlnuite), sau numrul i-nodului. n toate cazurile, funcia principal a
sistemului de cataloage este s pun n coresponden numele ASCII al fiierului cu informaia
necesar localizrii datelor.
O problem asemntoare este aceea a pstrrii atributelor. Toate sistemele de fiiere pstreaz
atribute pentru acestea, de exemplu creatorul fiierului i momentul de timp al crerii, care trebuie i
ele stocate undeva. O posibilitate evident este pstrarea lor direct n intrarea catalogului. Multe
sisteme fac exact acest lucru. Aceast opiune este reprezentat n figura urmtoare (a).

n acest proiectare imediat, un catalog este reprezentat de o list de intrri de dimensiune fix, cte
una pentru fiecare fiier, coninnd un nume de fiier (de lungime fix), o structur pentru atributele
fiierului i una sau mai multe adrese de disc (pn la o dimensiune maxim) indicnd locaia
blocurilor de disc asociate.
Pentru sistemele ce folosesc i-noduri, o alt posibilitate pentru pstrarea atributelor este chiar n i-nod,
dect n intrrile cataloagelor. n acest caz, intrarea de catalog poate s fie mai scurt: doar un nume

de fiier i un numr de i-nod. Aceast abordare este reprezentat n (b). Aa cum vom vedea mai
trziu, aceast metod are anumite avantaje prin comparaie cu pstrarea n intrarea de catalog. Cele
dou abordri prezentate n figura de mai sus corespund sistemelor MS-DOS/Windows i respectiv
UNIX.
Pn acum am presupus c fiierele au nume scurte de lungime fix. n MS-DOS fiierele au ntre 1-8
caractere pentru numele de baz i o extensie opional de 1-3 caractere. n UNIX Versiunea 7,
numele de fiiere erau de 1-14 caractere, incluznd orice extensie. Totui, aproape toate sistemele de
operare moderne suport nume de fiiere mai mari i de lungimi variabile. Cea mai simpl abordare
pentru a implementa acest lucru este s fixm o limit pentru lungimea numelui fiierului, tipic 255
caractere i apoi folosirea uneia din posibilitile ilustrate n figura de mai sus, cu 255 caractere
rezervate pentru fiecare nume de fiier. Aceast abordare este simpl, ns irosete un spaiu mare de
stocare din catalog, deoarece doar un numr limitat de fiiere au denumiri att de lungi. Din motive
de eficien, o structur diferit este necesar.
O idee este s renunm la ideea c toate cataloagele au aceeai dimensiune. n aceast metod,
fiecare intrare de catalog are o poriune fix, tipic ncepnd cu lungimea intrrii, apoi urmnd
informaii cu un format fix, n general coninnd proprietarul, timpul crerii, o informaie de protejare
i alte atribute. Aceast prim informaie de lungime fix este urmat de numele fiierului, orict de
lung ar fi acesta, aa cum este ilustrat n figura de mai jos (a).

ZONA
Nume

n acest exemplu avem trei fiiere: project-budget, personnel i foo. Fiecare nume de fiier este
ncheiat de un caracter special (n general 0), ce este reprezentat n figur de un ptrat cu o cruciuli
n interior. Pentru a permite fiecrui catalog s nceap aliniat la dimensiunea unui cuvnt, fiecare
nume de fiier este completat cu un numr ntreg de cuvinte, reprezentat n figur prin csue
haurate.
Un dezavantaj al acestei metode este c la tergerea unui fiier, un spaiu liber de dimensiuni variabile
este introdus n catalog, n care urmtorul fiier poate s nu aib suficient loc. Aceast problem am
mai ntlnit-o la alocarea continu a fiierelor pe disc, numai c acum compactarea catalogului este
fezabil, ntruct el este n ntregime n memorie. O alt problem este c o intrare de catalog se

poate ntinde pe mai multe pagini, astfel nct pot aprea erori de paginare la citirea numelui unui
fiier.
O alt posibilitate de a trata problema numelor de dimensiune variabil este de a face intrrile de
cataloage de lungime fix i de a pstra numele de fiiere mpreun ntr-o zon la sfritul catalogului,
aa cum este reprezentat n figura anterioar (b). Aceast metod are avantajul c la tergerea unei
intrri, urmtorul fiier va ncpea mereu n locul liber. Desigur zona de nume trebuie ntreinut i
erori de paginare pot s apar n continuare n timpul procesrii numelor de fiiere. O mic victorie
aici este lipsa necesitii ca numele de fiiere s nceap aliniate la nivel de cuvnt, aa c nu mai sunt
necesare caracterele de umplere dup numele de fiiere (b), n timp ce ele sunt necesare n (a).
n toate abordrile de pn acum, cataloagele sunt parcurse liniar de la nceput i pn la sfritul lor
pentru regsirea unui fiier. Pentru cataloage extrem de mari, cutarea liniar poate s fie lent. O
modalitate de cretere a vitezei de cutare este folosirea unei tabele de dispersie n fiecare catalog. O
alt modalitate pentru creterea vitezei este pstrarea rezultatelor cutrilor anterioare. naintea
nceperii unei proceduri de cutare, se verific nti printre rezultatele operaiilor anterioare din
catalog. Dac este prezent printre acestea, atunci fiierul poate fi localizat imediat, eliminnd
necesitatea unei cutri greoaie. Desigur aceast variant funcioneaz cu succes doar dac un numr
mic dintre fiiere este apelat n marea majoritate a cazurilor.

6.3.4

Fiiere partajate

Cnd un numr de utilizatori lucreaz mpreun la un proiect, apare necesitatea de a partaja accesul
la aceleai fiiere. n consecin, este de preferat ca un fiier partajat s apar simultan n cataloage
diferite, aparinnd de utilizatori diferii. Figura urmtoare prezint un sistem de fiiere, cu doar unul
dintre fiierele lui C prezent i n cataloagele lui B. Lanul ntre catalogul lui B i fiierul partajat se
numete legtura. nsui sistemul de fiiere n acest caz este un graf orientat fr cicluri i nu un
arbore.

Partajarea fiierelor este folositoare, totui introduce anumite probleme. Pentru nceput, dac
cataloagele conin adrese de disc, atunci o copie a adreselor de disc va trebui fcut n catalogul lui B,
la crearea unei legturi. Dac B sau C deschid fiierul, noile blocuri vor fi prezente doar n catalogul
utilizatorului ce execut operaiile. Schimbrile nu vor fi vizibile celuilalt utilizator, n acest fel
pierzndu-se scopul principal al partajrii.

Aceasta problem poate fi rezolvat n dou moduri. n prima soluie, blocurile de disc nu sunt
prezente n cataloage, ci doar o mic structur de date asociat fiierului nsui. In acest caz
cataloagele indic doar spre aceast structur. Aceasta este abordarea folosit n UNIX (unde aceast
structur de date este i-nodul).
n a doua soluie, B are o legtur ctre fiierele lui C lsnd sistemul s creeze pentru el un nou
fiier, de tipul LEGTUR i pstrnd acest fiier n catalogul lui B. Acest nou fiier conine doar calea
complet ctre fiierul spre care se creaz legtura. Cnd B citete din fiierul legat, sistemul de
operare vede c fiierul citit este de tipul LEGTUR, caut apoi fiierul respectiv i ncarc originalul.
Aceast abordare se numete legtur simbolic.
Fiecare dintre metode are i dezavantaje. n cazul primei metode, cnd B creeaz o legtur la fiierul
partajat, i-nodul l pstreaz pe creator ca fiind C. Crearea unei legturi nu schimb proprietarul
fiierului (vezi figura urmtoare), dar crete contorul de legturi din i-nod, n acest fel sistemul tie
cte intrri de cataloage indic spre fiierul respectiv.
Catalogul lui C

Catalogul lui B

Catalogul lui C

Catalogul lui B

Dac C ncearc apoi s tearg fiierul, sistemul este pus n faa unei situaii delicate. Dac
ndeprteaz fiierul i terge i-nodul, B va avea o intrare de catalog indicnd spre un i-nod invalid.
Dac i-nodul este refolosit apoi de un alt fiier, legtura lui B va indica ctre un fiier greit. Sistemul
poate s vad din contorul din i-nod c fiierul este nc n uz, dar nu exist nici o modalitate pentru el
s localizeze toate intrrile de catalog pentru acest fiier, ca s le tearg. Indicatori ctre cataloage
nu pot fi pstrai n i-nod deoarece pot exista un numr nelimitat de cataloage.
Singura variant viabil este tergerea intrrii de catalog a lui C, dar lsarea intact a i-nodului, cu
contorul avnd valoarea 1, ca n figura de mai sus (c). Acum avem o situaie n care B este singurul
utilizator ce are o intrare de catalog ctre un fiier din proprietatea lui C. Dac sistemul permite
interogri, C va fi n continuare rspunztor pentru fiier, pn cnd B decide s renune la legtur.
n acest caz contorul ajunge la valoarea 0 i fiierul este ters.
Cu legturi simbolice aceast problem nu apare deoarece doar creatorul fiierului are un indicator
ctre i-nod. Utilizatorii, ce au creat legturi la fiier, au doar calea ctre fiier i nu indicatori i-nod.
Cnd proprietarul terge fiierul, acesta este complet distrus. ncercri ulterioare de acces la fiier vor
eua, deoarece sistemul este incapabil s localizeze fiierul. tergerea unei legturi simbolice nu
afecteaz fiierul n nici o msur.
Problema cu legturile simbolice este timpul suplimentar necesitat de ctre acestea. Fiierul coninnd
calea trebuie citit, apoi aceasta trebuie parcurs treptat i urmat, component cu component, pn
cnd i-nodul este regsit. Toat aceast activitate poate implica un numr suplimentar de accese la
disc. Mai mult dect att, este nevoie de cte un i-nod suplimentar pentru fiecare legtur simbolic
pentru a pstra calea ctre fiier; ca i optimizare, dac dimensiunile cii sunt reduse, sistemul ar
putea pstra aceast informaie chiar n i-nod. Legturile simbolice au avantajul c pot fi folosite

pentru a indica spre fiiere ale unor maini aflate oriunde, prin simpla pstrare a adresei de reea a
acesteia n plus fa de informaia legat de calea fiierului.

6.3.5

Gestiunea spaiului pe disc

Fiierele sunt n mod uzual pstrate pe disc, de aceea administrarea spaiului de disc este crucial
pentru proiectanii sistemelor de fiiere. Dou strategii sunt posibile pentru pstrarea unui fiier de n
octei: n octei consecutivi sunt alocai pe disc, sau fiierul este mprit ntr-un numr de blocuri
continue (dar nu obligatoriu). Aceeai alegere este prezent i la sistemele de administrare a
memoriei, unde apar segmentarea pur i paginarea.
Aa cum am vzut, pstrarea unui fiier ca o secven continu de octei are o problem evident:
dac fiierul crete n dimensiuni, probabil c va trebui s fie repoziionat pe disc. Aceeai problem
rmne valabil i pentru segmentele de memorie, cu observaia c repoziionarea unui segment n
memorie este o operaie relativ rapid prin comparaie cu mutarea unui fiier de la o anumit poziie
pe disc la alta. Din acest motiv, majoritatea sistemelor mpart fiierele n blocuri de dimensiune fix ce
nu trebuie neaprat s fie adiacente.
Dimensiunea blocurilor
n momentul n care s-a decis pstrarea fiierelor n blocuri de dimensiune fix, problema imediat ce
apare este alegerea dimensiunii acestor blocuri. Dac inem cont de organizarea discurilor, sectoarele,
pistele i cilindrii sunt candidai evideni pentru unitatea de alocare (cu toate c ele sunt dependente
de dispozitivul fizic, ceea ce evident este un minus). n sistemul de paginare, dimensiunea paginii este
o problematic major.
Avnd o unitate de alocare mare precum cilindrul, nseamn c fiecare fiier, chiar i unul de 1 octet,
va ocupa n ntregime cilindrul. Cercetri efectuate au demonstrat c dimensiunea medie a fiierelor n
mediul UNIX este de aproximativ 1KB, aa c alocarea de blocuri de 32KB pentru fiecare fiier ar duce
la pierderea a 31/32 sau 97% din capacitatea total a discului. Pe de alt parte folosirea unei uniti
de alocare mici, nseamn c pentru fiecare fiier vor fi necesare mai multe blocuri. Citirea fiecrui
bloc implic n principiu o operaie de cutare i o ntrziere datorat rotaiei discului, aadar citirea
unui fiier format din mai multe blocuri mici va fi nceat. Spre exemplu s considerm cazul unui disc
avnd 131072 de octei per pist, un timp de rotaie de 8.33 msec i un timp mediu de cutare de 10
msec. Timpul n milisecunde necesar citirii unui bloc de k octei este suma cutrii, ntrzierii de rotaie
i a timpului de transfer: 10 + 4.165 + (k /131072) x 8.33. Curba din figura urmtoare descrie viteza
de transfer a unui astfel de disc ca o funcie de dimensiunea blocului.

Pentru a calcula spaiul n mod eficient, trebuie s facem o presupunere n legtur cu dimensiunea
medie a fiierelor. Pentru exemplificare considerm msurtorile efectuate ntr-un departament, ce are
1000 de utilizatori i peste 1 milion de fiiere UNIX, i care au surprins o median de 1680 octei,

nsemnnd prin aceasta c jumtate dintre fiiere sunt mai mici i jumtate sunt mai mari dect
aceast valoare. Pentru simplitate, s presupunem c toate fiierele sunt de 2 KB, ceea ce formeaz
curba punctat din figura prezentat i care reprezint eficiena folosirii spaiului de disc.
Cele dou curbe pot fi nelese n modul urmtor. Timpul de acces pentru un bloc este complet
determinat de timpul de cutare i ntrzierea de rotaie, n consecin vor fi necesare 14 msec pentru
accesul unui bloc, cu ct mai multe date sunt citite o dat, cu att mai bine. n consecin rata de
transfer crete cu dimensiunea blocurilor (pn cnd transferul va ocupa att de mult timp nct el
devine dominant). Cu blocuri mici, ce sunt puterea lui doi i fiiere de 2 KB, nu este irosit spaiul din
blocuri. Totui, pentru fiiere cu blocuri de 2 KB i 4 KB sau mai mari, o parte din spaiu este nefolosit.
n realitate puine fiiere au dimensiunea multiplu de mrimea blocurilor, n consecin n general
oricum se pierde o anumit parte din ultimul bloc.
Ce arat aceste curbe este c oricum performanele i utilizarea spaiului de disc sunt n mod inerent
n conflict. O dimensiune de compromis este necesar. Pentru aceasta, 4 KB ar putea reprezenta o
alternativ bun, ns unele sisteme de operare i-au fcut alegerea acum muli ani n urm, pe
vremea cnd parametrii de disc i dimensiunile fiierelor erau diferite. De exemplu, pentru UNIX, 1 KB
este o dimensiune folosit n mod curent, iar pentru FAT16 dimensiunea blocurilor poate s fie orice
putere a lui doi de la 512 octei la 32 KB, dar este determinat de dimensiunea discului i de numrul
maxim de blocuri pe o partiie de disc care este 216=65536, ceea ce foreaz folosirea blocurilor mari
pentru discuri de capacitate ridicat.
Administrarea blocurilor libere
Pentru administrarea blocurilor libere sunt utilizate dou metode aa cum este prezentat n figura
urmtoare.

Prima folosete o list nlnuit de blocuri de disc, fiecare bloc pstrnd un numr maxim de blocuri
libere. Cu un bloc de 1KB, avnd o valoare unic asociat reprezentat pe 32 bii, fiecare dintre blocuri
pstreaz n lista sa 255 de astfel de identificatori (este necesar cte o poziie pentru referirea
urmtorului bloc). Un disc de 16GB are nevoie de o list de maximum 16794 de blocuri de cte 1KB,
pentru a pstra toate cele 224 identificatoare de blocuri.
Cealalt tehnic folosit este imaginea de bii. Un disc cu n blocuri are nevoie de o imagine cu n bii.
Blocurile libere sunt reprezentate cu 1 n imagine, n timp ce blocurile alocate sunt reprezentate de

valoarea 0 (sau vice versa). Un disc de 16 GB are 224 blocuri de 1KB i de aceea el are nevoie de 224
bii pentru imagine, ceea ce necesita 2048 blocuri. Nu este surprinztor c imaginea necesit mai
puin spaiu, deoarece folosete 1 bit pentru fiecare bloc, n locul a 32 bii cum este cazul listei
nlnuite. Doar dac discul este aproape plin (adic are un numr mic de blocuri libere) atunci
metoda folosind o list nlnuita va avea nevoie de mai puin spaiu dect imaginea de bii. Pe de alt
parte, dac sunt multe blocuri libere, cteva dintre ele pot fi mprumutate pentru a pstra lista, fr
pierderi legate de capacitatea discului.
Cnd este folosit metoda listelor nlnuite, doar un bloc de referine trebuie inut n memoria
principal. Cnd un fiier este creat, blocurile necesare sunt luate din blocul de referine. Cnd blocul
nu mai are referine, un nou bloc este citit de pe disc. n mod similar, cnd un fiier este ters,
blocurile sale sunt eliberate i adugate la lista de referine din memoria principal. Cnd acest bloc
este plin n totalitate, el va fi scris pe disc.
n anumite situaii, aceast metod duce la un trafic I/O nejustificat. S urmrim situaia din figura
urmtoare (a), n care blocul din memorie mai are spaiu doar pentru nc dou intrri. Dac un fiier
de trei blocuri este eliberat, blocul de referine nu va mai avea spaiu suficient i atunci el va trebui
scris pe disc, ducnd la situaia din (b). Dac un fiier de trei blocuri este scris n acest moment, un
ntreg bloc de referine trebuie s fie iari citit de pe disc, ceea ce ne duce iar situaia (a). Dac
fiierul de trei blocuri nou creat era un fiier temporar, cnd este eliberat, un alt acces de scriere va fi
necesar pentru a trece blocul plin de referine napoi pe disc. Pe scurt, cnd blocul de referine este
aproape liber, o serie de fiiere temporare de scurt durat pot cauza o multitudine de accese de I/O.

O abordare alternativ, ce evit majoritatea accesurilor I/O, este mprirea blocului de referine. n
acest mod, n loc de a trece din situaia (a) ctre cea din (b), vom trece din (a) n (c) cnd cele trei
blocuri sunt eliberate. Acum sistemul poate s suporte o serie de fiiere temporare fr a crete
numrul de apeluri I/O. Dac blocul din memorie se umple complet, el este scris pe disc i un bloc pe
jumtate plin de referine este adus n memorie. Ideea este, n acest caz, s pstrm majoritatea
blocurilor de referine pe disc (pentru a minimiza accesul la disc), dar n acelai timp s avem n
memorie un bloc plin doar pe jumtate, n acest fel suportnd att crearea ct i tergerea de fiiere,
fr accese suplimentare de I/O la disc.
Cu o hart de bii, este iari posibil s pstrm doar un bloc n memorie, fcnd schimburi cu discul
doar cnd blocul devine plin sau complet gol. Un beneficiu adiional al acestei metode este c, fcnd
toate alocrile dintr-un singur bloc al imaginii de bii, blocurile vor fi extrem de apropiate, n acest fel
minimiznd timpul de acces la disc.
Cot pe disc (Quote)
Pentru a preveni posibilitatea ca utilizatorii s foloseasc prea mult spaiu pe disc, sistemele de
operare multiutilizator, de cele mai multe ori, pun la dispoziie un mecanism de forare a cotelor
admise. Ideea este c administratorul sistemului rezerv fiecrui utilizator un maximum de fiiere i
blocuri, iar sistemul de operare are grij ca utilizatorul s nu depeasc aceste limite. Un mecanism
tipic este descris mai jos.

Cnd un utilizator acceseaz un fiier, atributele i adresele de disc sunt localizate i plasate ntr-o
tabel de fiiere deschise n memoria principal. Printre atribute exist o intrare care spune cine este
proprietarul fiierului. Toate adugrile la dimensiunea fiierului vor fi sczute din cota proprietarului.
O a doua tabel pstreaz informaia de cot pentru fiecare utilizator ce are la momentul respectiv un
fiier deschis, chiar dac fiierul a fost deschis de ctre un alt utilizator. Acest tabel este reprezentat n
figura urmtoare. Aici este parial figurat cota fiierelor pe disc pentru toi utilizatorii ce au fiiere
deschise n acest moment de timp. Cnd toate fiierele sunt nchise, nregistrrile sunt nscrise napoi
n fiierul de cote.

Cnd o intrarea nou este creat n tabela de fiiere deschise, o referin la nregistrarea de cot
pentru proprietar este adugat aici. n acest mod sunt accesibile foarte uor diferitele limite impuse
de administrator. De fiecare dat cnd un bloc este adugat la un fiier, numrul total de blocuri
aparinnd de proprietar este mrit cu o unitate i se efectueaz o verificare n legtur cu limitele
fizice i logice. Limitele logice pot fi depite, acest lucru nu este valabil i n cazul limitelor fizice. O
ncercare de a face adugri la un fiier, atunci cnd limita fizic este depit, va rezulta ntr-o
eroare. Verificri similare exist i pentru numrul de fiiere.
Cnd un utilizator ncearc s se autentifice, sistemul verific dac a fost depit cota fizic sau
logic a fiierelor sau numrul de blocuri de disc folosite. Dac oricare dintre limite a fost atins,
sistemul iniiaz un avertisment utilizatorului i numrul de avertismente rmase este sczut cu o
unitate. Dac acest contor atinge valoarea zero, nseamn c utilizatorul a ignorat de prea multe ori
avertismentul i n consecin lui nu i se va permite autentificarea n sistem. Pentru a recpta dreptul
de a avea acces iar la sistem, utilizatorul va trebui s discute personal cu administratorul. Aceast
metod are proprietatea c utilizatorii pot s treac de limitele logice n timpul sesiunii curente, cu
obligaia de a terge toat informaia suplimentar nainte de a ncheia sesiunea. Limitele fizice nu pot
fi niciodat depite.

S-ar putea să vă placă și