File System (WIP) AXO Matteo Guarnerio
1
File System
Riferimento alla slide: AXO – 04 – File system.pdf
E’ il componente del SO che realizza i servizi di gestione dei file.
I file sono unità di archiviazione in memoria di massa.
Il FS è quindi la struttura logica della memoria di massa.
Un file è caratterizzato da un nome, univoco nella directory nel quale si trova.
Da degli attributi:
• Tipo: definisce il tipo dei dati contenuti (estensione del file, è facoltativa)
• Locazione: riferimento implicito alla posizione fisica sul dispositivo
• Dimensione: espressa in numero di byte o blocchi
• Protezione: definisce le politiche di accesso
• Ora e data: indicano il momento della creazione, ultima modifica o ultimo accesso a file
• Proprietario: nome utente di chi ha creato il file
Le operazioni offerte dalla gestione del FS sono:
• File, link e operazioni sui file
• Directory e file speciali (stampanti, tastiera, ecc)
• Attributi e politiche di accesso a file e directory
• Corrispondenza del FS logico con i dispositivi fisici
Tra le operazioni sui file troviamo [riferimento alle funzioni del C, fopen e sue modalità di apertura]:
• Creazione
• Apertura
• Scrittura
• Lettura
• Riposizionamento
• Cancellazione
L’immagine del FS è memorizzata su disco.
Per velocizzare l’accesso ai file il SO mantiene in memoria una parte delle strutture dati per gestire i file.
Esistono due tabelle principali del FS:
• Tabella dei file aperti per ogni processo
E’ un vettore contente informazioni sui file aperto da un certo processo, visibile quindi solo da quel processo.
Le prime 3 posizioni sono riservate a; stdin, stdout, stderr (l’unica differenza tra stdout e stderr, è che stderr non ha un buffer, quindi l’output arriva subito, senza passare da buffer di sistema).
Se un processo effettua una fork(), nella tabella file aperti del figlio
verranno copiate tutte le entry dei file aperti dal padre, consentendogli di usarli.
File System (WIP) AXO Matteo Guarnerio
2
• Tabella globale dei file aperti nel sistema
Ogni elemento è referenziato tramite gli elementi delle tabelle dei file aperti dei processi e contiene, ed in aggiunta contiene l’indicatore di posizione corrente nel file, il numero di riferimenti (link) al file e un riferimento al file su disco.
Tabella di allocazione su UNIX, i-‐node
Utilizza la logica della lista (i-‐list), i cui elementi sono chiamati i-‐node (index-‐
node).
Un i-‐node conviene la lista degli attributi e degli indirizzi di blocchi di disco cui sono associati i blocchi di file.
Un file esiste su disco solo se esiste un i-‐node corrispondente, quindi ogni file, cartella o file speciale ha associato un i-‐node.
Se due file hanno lo stesso i-‐node, sono lo stesso file (link al file).
Un volume contiene l’immagine del FS (struttura logica), così suddivisa:
• Blocco zero o blocco di bootstrap: coincide tipicamente con il primo settore del disco, contiene il codice di inizializzazione del sistema operativo.
• Superblock: descrive lo stato del FS, dimensioni, spazio libero, ecc.
• Lista degli i-‐node: dimensione definita in fase di configurazione del SO.
• Blocco di dati: contiene i blocchi dei file, i dati effettivi su HD.
Struttura iList o tabella degli iNode
#iNode – Numero dell’inode (numerazione sequenziale da zero)
Tipo – Dir/File Indirizzo Blocco – Numero del blocco al quale si fa riferimento
Struttura tabella file aperti da un processo
FId Id File Table Globale
Struttura File Table Globale
FId Posizione
cursore su file Num proc con
aperto il file #iNode
File System (WIP) AXO Matteo Guarnerio
3
Direct Memory Access (DMA)
Ogni accesso alla memoria fisica viene gestito tramite interrupt dal DMA, il quale ha il compito di gestire tutte le letture e scritture di dati su disco, quindi di gestire anche le chiamate a primitive: open, write e read.
Nel conteggio degli interrupt a DMA si procede così:
Funzione Numero di interrupt effettuati
open() Si controlla il path di apertura.
Ogni slash è un interrupt.
Ogni cartella o file è un interrupt.
Se la root non si trova in memoria, bisogna aggiungere un interrupt.
Esempio:
open(“/info2/axo”)
Num. Interrupt con root non in memoria: 1+2+2
Num. Interrupt con root in memoria:
2+2
(Evidenziati gli interrupt che valgono 2)
read() / write() Dipende dal numero di blocchi
letti/scritti, che a sua volta dipende dalla posizione attuale del cursore su file.
Ogni blocco letto/scritto corrisponde ad un interrupt.