Cursul 10 - andrei.clubcisco.roandrei.clubcisco.ro/cursuri/4so2/cursuri2009/10.Gestiunea...
Transcript of Cursul 10 - andrei.clubcisco.roandrei.clubcisco.ro/cursuri/4so2/cursuri2009/10.Gestiunea...
26.02.2009 2
Test Curs 9
� Pe un sistem Linux cu split 3G/1G, la ce adres fizic este � �mapat adresa virtual 0xC0001000? Dar 0xF8001000?� �
� Care este complexitatea (e.g. O(1), O(n), etc.) aloc rii unei �pagini? Dar a unei structuri task_struct?
� Pentru folosirea unei zone de memorie dinamic alocat , în �context întrerupere, ce primitive de alocare pot fi folosite în Linux? Dar în Windows?
Gestiunea fi ierelor�
� Gestiunea fi ierelor � no iuni generale� �� Gestiunea fi ierelor în Linux�
� VFS� Inode cache, dcache, page cache� Buffer cache
� Gestiunea sistemelor de fi iere în Windows�� Cache manager� Fast I/O
Entit ti fundamentale�
� Superblock � con ine informa ii despre sistemul de fi iere � � �(dimensiunea blocului, inode-ul r d cin ); exist atât pe disc � � � �cât i în memorie�
� File � structura intern SO ce descrie un fi ier deschis; � �exist doar în memorie�
� Inode (FCB - file control block) � entitatea ce identific un �fi ier în mod unic; exist atât pe disc cât i în memorie� � �
� Dentry- asociaz un nume cu un fi ier; exist atât pe disc � � �cât i în memorie�
Entit i fundamentale � în memorie��
FILE
file descriptor
File descriptor table
FILE
DENTRY INODE
DENTRY
TipPermisiuni
....
LinkFile descriptorduplicat
Date
Date
DateDate
Gestiunea sistemelor de fi iere în sistemul de operare�
Filesystemdriver
Block I/O layer
Filesystemdriver
stat open read
Generic filesystem layer
Opera ii fundamentale�
� Montarea � Deschiderea unui fi ier�� Determinarea atributelor fi ierului�� Citirea de date din fi ier�� Scrierea de date în fi ier�� Închiderea unui fi ier�� Crearea unui fi ier�� tergerea unui fi ier� �
Montarea sistemului de fi iere�
� (sau înregistrarea lui în cadrul sistemului)� Intrare: un disk (parti ie)�� Ie ire: un DENTRY c tre directorul r d cin� � � � �� Opera ii: verificare parti ie, determinare diver i parametri, � � �
determinare inode-ului r d cin� � �� Exemplu PITIX:
� Se verific MAGIC-ul�� Se determin dimensiunea blocului�� Se cite te inode-ul r d cin i se creaz dentry-ul asociat� � � � � �
Deschiderea unui fi ier�
� Intrare: o cale� Ie iere: un file descriptor�� Opera ii:�
� Determinarea sistemului de fi iere�� Pentru fiecare nume din cale, determinarea inode-ului asociat cu
numele� Odat g sit inode-ul ultimului nume din cale se creaz structura FILE � � �
i se aloc o intrare în tabela de descriptori de fi ier � � �
Determinarea atributelor fi ierului�
� Intrare: file descriptor� Ie iere: atributele fi ierului� �� Opera ii:�
� Se acceseaz inode-ul (file->dentry->inode)�� Se citesc atributele din inode
Citirea de date din fi ier�
� Intrare: file descriptor, offset, length� Ie ire: date�� Opera ii:�
� Se acceseaz inode-ul (file->dentry->inode)�� Se determin blocurile de date�� Se copieaz datele de pe disk în memorie i sunt apoi trimise � �
utilizatorului
Scrierea de date în fi ier�
� Intrare: file descriptor, offset, length, date� Ie ire:�� Opera ii:�
� Se acceaz inode-ul�� Se aloca unul sau mai multe noi blocuri pe disc � se caut blocuri �
libere, se marcheaz ca fiind ocupate�� Se adaug blocurile alocate la inode�� Se copieaza datele de la user in bufere interne i apoi se scriu pe �
disk
Închiderea unui fi ier�
� Intrare: file descriptor� Ie iere:�� Opera ii:�
� Se decrementeaz reference counter-ul structurii FILE�� Dac referecen counter-ului structurii FILE ajunge la 0, se terge � �
structura� Se seteaz pe NULL intrarea din tabela de descriptori de fi ier� �
Directoare
Directoarele sun fi iere ce con in o � �în iruire (vector, câteodat arbore) de � �
DENTRY-uri.
Crearea unui fi ier�
� Intrare: o cale� Ie ire:�� Opera ii:�
� Se determin inode-ul directorului în care trebuie ad ugat fi ierul� � �� Se citesc blocurile de date� Se insereaz un nou dentry�� Se scriu pe disc blocurile de date modificate
tergerea unui fi ier� �
� Intrare: o cale� Ie ire:�� Opera ii:�
� Se determin inode-ul directorului în care trebuie ad ugat fi ierul� � �� Se citesc blocurile de date� Se caut i se sterge DENTRY-ul cu numele fi ierului (caz special: � � �
link-uri)� Se scriu pe disc blocurile de date modificate
VFS
Filesystemdriver
Block I/O layer
Inode cache Dentry cache Page cache
file
Filesystemdriver
inode Superblock
stat open read
inode
dentry
dentry filefile Superblock
file
Opera ii superblock�
� fill_super� put_super� write_super� read_inode� write_inode
� delete_inode� clear_inode� Statfs� remount_fs
Opera ii inode�
� Create� Lookup� Link� Unlink� Symlink� Mkdir� rmdir
� Rename� Readlink� follow_link� put_link� Truncate� ...
Inode cache
� Opera iile de citire a inode-urilor de pe disc sunt costisitoare�� Un inode citit se va men ine în memorie (pân când apar � �
condi ii de low memory)�� C utarea inode-ului se face cu ajutorul unei tabele hash�� Func ia de hash (sb, inode_number)�
Dentry
� St ri: �� Used � d_inode este valid i obiectul dentry este folosit�� Unused � d_inode este valid dar obiectul dentry nu este folosit� Negative � d_inode nu este valid (NULL); fie inode-ul nu a fost înc �
înc rcat fie a fost ters� �
� Dentry cache� Lista de dentry-uri folosite (dentry->d_state == used)� Lista celor mai recent folosite dentry-uri (sortat dup timpul de � �
access)� Un hash table pentru a elimina parcurgerea arborelui
Page cache
� Men ine în memorie datele citite de pe disc�� Se folose te pentru:�
� read/write� Mmap
� Cache-ul se face la nivel de fi ier i nu de block device -> � �este nevoie de o infrastructur pentru translatarea offset-�urilor din fi iere în blocuri pe disc�
� Cache-ul se bazeaz pe un radix tree�
address_space
� Structura care este folosit de page-cache pentru a �translata adrese
� Datorit acestei abord ri se poate face caching nu doar pe � �map ri de fi iere� �
� Opera ii address_space:�� write_page, read_page� Bmap� direct_IO� ...
Citirea de date din fi ier�
� generic_file_read � implementare generic�� Se verific dac pagina nu exist în page cache� � �� Daca exist se copiaz datele din pache cache în buffer-ul � �
utilizatorului� Dac nu exist se apelaz a_ops->readpage()� � �
� block_read_full_page � implementare generic , folose te � �a_ops->bmap()
� De la versiunea 2.4 nu mai exist un buffer cache separat�� S-a eliminat problema double buffering� S-au eliminat problemele de sincronizare
� buffer_head-urile � structurile care fac maparea dintre un buffer în memorie i un block pe disc folosesc memorie �alocat de page cache�
Buffer cache
Analogie UNIX- Windows
� Superblock � Volume Parameter Block� Inode � File Control Block� File � File Object� Dentry -
Tratarea IRP-urilor de scriere / citire în FSD
� Dac FILE_FLAG_NO_BUFFERING nu a fost setat:�� se copieaz datele în buferul utilizatorul cu ajutorul cache �
managerului: CcCopyRead
� Altfel:� Se creaz noi IRP-uri ce vor fi pasate storage device-ului�