• Non ci sono risultati.

File systemIl termine file system assume significati diversi a seconda del contesto in cui viene utilizzato.

N/A
N/A
Protected

Academic year: 2021

Condividi "File systemIl termine file system assume significati diversi a seconda del contesto in cui viene utilizzato."

Copied!
1
0
0

Testo completo

(1)

File system

Il termine file system assume significati diversi a seconda del contesto in cui viene utilizzato.

File system è l'insieme dei file memorizzati su supporti di memorizzazione.

File system è la componente del S.O. che permette all'utente di avere una visione logica ed astratta dei file e che implementa una tecnica di allocazione delle aree disco.

Dal punto di vista utente (sia utente programmatore che utente di applicazioni) un file è un insieme di informazioni identificate da un nome. La visione logica del file è realizzata dal S.O.

dal punto di vista utente è indifferente quale tipo di supporto di memorizzazione contenga il file.

Il nome di un file può essere:

- globale se rappresenta il percorso necessario per individuare il file a partire dalla

directory radice ad esempio /usr/users/corso/ordina.c o

c:\windows\programmi\ordina.cpp

- locale (o relativo) se rappresenta il percorso necessario per individuare il file a partire dalla directory corrente ad esempio ../relazioni/rel1.txt o ..\relazioni\rel1.txt

-

Esistono diversi tipi di file:

- file di testo - file binari

- file directory (permettono la visione gerarchica del file system come struttura ad albero e contengono le informazioni dei file che logicamente contiene, le operazioni di lettura/scrittura su questi file vengono fatte indirettamente attraverso i comandi che creano file, cancellano file, rinominano file ….)

- pseudo file (associati a dispositivi come la tastiera, il monitor, le porte seriali ...)

Il file può essere considerato un tipo di dato, pertanto deve essere definito un insieme di operazioni per accedere al file stesso.

Ogni file system mette a disposizione un insieme di primitive (o system call) per operare sui file:

- create - open - close - read - write - seek

I linguaggi i programmazione ad alto livello interfacciano le primitive di I/O del file system attraverso le proprie funzioni di I/O, in questo modo è possibile la portabilità dei programmi.

Il file system fornisce anche una visione logica dei supporti di memorizzazione; l’unità logica di riferimento dei supporti è la partizione. Un disco può essere suddiviso in più partizioni (partizionato) o contenere una sola partizione. Ogni partizione deve contenere, oltre allo spazio per memorizzare i file, anche uno spazio per contenere le informazioni che descrivono la partizione stessa, in modo che il S.O. possa conoscerne le caratteristiche e sia in grado di identificare quali aree della partizione sono libere. Ogni partizione deve quindi contenere:

un’area di boot che contiene le informazioni necessarie per avviare i S.O.

un’area che contiene i descrittori dei file contenuti nella partizione

un’area che contiene gli indirizzi dei blocchi liberi della partizione (blocchi di indirizzi)

un’area che contiene i blocchi che per memorizzare le informazioni vere e proprie (blocchi dati)

Nei S.O. Windows ogni partizione è identificata da una lettera e ogni partizione contiene una propria radice (ad es. a:\ c:\ ….), a partire dalla quale esiste una struttura ad albero che rappresenta l’organizzazione dei file in quella partizione.

Nei S.O. Unix tutte le partizioni vengono agganciate (montate) tra loro per formare un’unica struttura ad albero, esiste quindi una sola directory radice ( / ). In effetti esiste una partizione principale (quella che contiene il S.O.), detta anche partizione root, alla quale fa riferimento la directory /, tutte le altre partizioni possono essere pensate come sottoalberi della partizione root. Con questa tecnica l’utente può avere una visione del file system

(2)

completamente indipendente dal numero di partizioni realmente esistenti sul computer.

L’inconveniente è che anche i supporti di memorizzazione rimovibili (floppy e CDROM), per poter essere visti, devono essere esplicitamente montati.

Strategie di allocazione delle aree su disco

Il settore è l’unità indirizzabile sui dischi, un settore contiene un certo numero di byte.

Un blocco è un insieme di settori contigui.

Quando un file viene creato, il S.O. deve decidere quali aree del disco riservare per contenere il file. Qualsiasi strategia di allocazione deve cercare di ottimizzare l’utilizzo dello spazio disco (evitando o minimizzando la frammentazione) e massimizzare la velocità di reperimento delle informazioni.

Riguardo la velocità di reperimento delle informazioni deve essere osservato che il tempo maggiore è impiegato per il posizionamento della testina di letture/scrittura sul disco (tempo di seek), piuttosto che per effettuare le operazioni di lettura o scrittura. Pertanto sarebbe opportuno, una volta posizionata la testina, leggere o scrivere la maggiore quantità di informazioni a partire da quella posizione.

Possono essere considerati sostanzialmente 3 tipi di strategie:

1. contigua – viene ricercato un numero di settori contigui adeguato rispetto alle dimensioni dei file, nel descrittore del file è sufficiente memorizzare l’indirizzo del primo settore e il numero di settori allocati

2. totalmente non contigua – viene utilizzato qualsiasi settore libero, tutti i settori utilizzati vengono concatenati tra di loro formando una lista, memorizzando in ogni settore l’indirizzo del settore successivo (tranne per l’ultimo), nel descrittore del file è sufficiente memorizzare l’indirizzo del primo settore; a partire dal primo settore è possibile seguire la catena e trovare gli indirizzi dei settori successivi.

3. parzialmente contigua – il blocco diventa l’unità indirizzabile sul disco; un file viene memorizzato utilizzando qualsiasi blocco libero, tutti i blocchi utilizzati vengono concatenati tra di loro formando una lista, memorizzando in ogni blocco l’indirizzo del blocco successivo (tranne per l’ultimo), nel descrittore del file è sufficiente memorizzare l’indirizzo del primo blocco; a partire dal primo blocco è possibile seguire la catena e trovare gli indirizzi dei blocchi successivi.

La prima tecnica è vantaggiosa per la velocità, ma è molto inefficace l’utilizzo dello spazio.

La seconda tecnica elimina la frammentazione, ma i tempi di reperimento sono i peggiori.

La terza tecnica è la migliore perché rappresenta un compromesso tra le altre due: fornisce tempi accettabili per il reperimento (una volta posizionata la testina sul blocco, viene letta o scritta in aree contigue del disco una buona quantità di informazioni) e minimizza la frammentazione.

La prima tecnica non è utilizzabile, perché il requisito di allocazione contigua dei file è di fatto impraticabile.

Con la seconda e la terza soluzione però l’accesso diretto ad un blocco o settore del file non è possibile perché, per accedere ad una informazione, è sempre necessario, partendo dall’indirizzo del primo blocco o settore, seguire la catena dei puntatori.

Pertanto la soluzione migliore è di utilizzare un insieme di blocchi per memorizzare le informazioni, senza però mantenere le informazioni degli indirizzi dei blocchi nei blocchi stessi ma utilizzando aree separate per questo scopo(blocchi indice).

Una soluzione è quella chiamata a “blocchi indice”, gli indirizzi dei blocchi dati sono tutti memorizzati in una lista concatenata di blocchi indice, nel descrittore del file è memorizzato soltanto il puntatore al primo dei blocchi indice (puntatore alla lista dei blocchi indice).

In questo caso, se un blocco indice può contenere fino a N indirizzi, ogni blocco indice conterrà fino a (N-1) indirizzi di blocchi dati e 1 indirizzo che rappresenta l’indirizzo del blocco indice successivo (tranne nel caso in cui il blocco indice sia l’ultimo della lista, in questo caso l’ultimo indirizzo sarebbe nullo).

Un’altra soluzione è quella adottata nei S.O. Unix.

Il descrittore del file è chiamato inode, esso contiene:

UID – User Identifier (numero che identifica il proprietario del file)

GID – Group Identifier (numero che identifica il gruppo del proprietario del file)

(3)

Tipo del file (es. file normale, directory, link, …)

Lista dei permessi di accesso (read, write, execute per il proprietario, il gruppo e gli altri utenti)

Dimensione del file

Data di accesso al file

Data di modifica del file

Contatore di hard link

Vettore di indirizzi di blocchi

Cosa contiene il vettore di indirizzi di blocchi?

I primi 12 puntatori contenuti nel vettore puntano direttamente ai blocchi dati che contengono il file (cioè contengono gli indirizzi dei blocchi che contengono i dati).

Gli altri tre puntatori contenuti nel vettore puntano indirettamente, con uno o più livelli di indirettezza, ai blocchi dati (cioè puntano a blocchi indice).

Il tredicesimo puntatore è l’indirizzo di un singolo blocco indice che non contiene dati ma gli indirizzi di blocchi dati (un livello di indirettezza)

Il quattordicesimo puntatore è l’indirizzo di un blocco indice che contiene indirizzi di blocchi indice che contengono indirizzi di blocchi dati (due livelli di indirettezza)

Il quindicesimo puntatore è l’indirizzo di un blocco indice che contiene indirizzi di blocchi indice che contengono indirizzi di blocchi indice che contengono indirizzi di blocchi dati (tre livelli di indirettezza)

Un file di tipo directory contiene una coppia di valori (nome logico, indice nella lista di inode) per ogni file che appartiene alla directory stessa. Contiene sempre almeno due coppie: il riferimento a sé stessa ( . , numero inode) e alla directory superiore ( .. , numero di inode).

Quando si specifica il nome locale di un file esso viene ricercato nel file directory relativo alla directory corrente e, se viene trovato, viene utilizzato l’indice corrispondente per reperire l’inode del file e quindi verificare i permessi di accesso al file e, se si possiedono i permessi adeguati, viene aperto il file reperendo i dati...

Nei sistemi Unix i link (collegamenti) possono essere soft o hard, ad esempio, se si suppone che esista il file prova.c:

con il comando ln –s prova.c uno.c si ottiene un link soft, in questo caso nella directory corrente, relativamente al file uno.c viene memorizzata la coppia di valori (uno.c, prova.c) questo perché il file uno.c non possiede un proprio inode ma è solo un riferimento ad un altro file. Se si cancella il file prova.c il link uno.c continua ad esistere ma il suo riferimento è nullo.

con il comando ln prova.c due.c si ottiene un link hard, in questo caso nella directory corrente, relativamente al file due.c viene memorizzata la coppia di valori (due.c, numero inode) questo perché il file due.c possiede un proprio inode che avrà un vettore di puntatori il cui contenuto è identico a quello dell’inode del file prova.c. In sostanza gli inode dei due file puntano agli stessi blocchi (dati o indice), entrambi i contatori di hard link saranno incrementati. Il contatore di hard link è necessario per sapere quando dovranno essere rilasciati i blocchi puntati dal vettore dell’inode, perché fino a quando almeno un inode punta a quei blocchi essi non potranno essere rilasciati. Con questo tipo di link, anche se venisse cancellato il file originale, i link continuerebbero a riferire correttamente ai blocchi (dati o indice).

Riferimenti

Documenti correlati

– tabella associata ad ogni processo utente contenente una riga per ogni file aperto dal processo (indice = descrittore del file) con l’indirizzo della riga della tabella globale

Cancellare il file solo dopo la cancellazione dell’ultimo link – richiede lista di tutti i riferimenti al file o anche solo un “contatore dei riferimenti”. Non permettere le

copiando il descrittore del file da questo alla tabella dei file aperti.  Close(f) – il descrittore del file viene rimosso dalla tabella dei

 Open(f) – prende il nome del file e cerca nel dispositivo, copiando il descrittore del file da questo alla tabella dei file aperti.  Close(f) – il descrittore del file viene

• Le operazioni di lettura e scrittura su file ad accesso random fanno uso di un indice che si può spostare con le funzioni lseek (basso livello) e fseek (stream). • Ovviamente non

Scrivere un programma che dato un codice libro visualizzi il titolo ed il numero dei suoi autori ed il nome ed email della sua

Calcolo dell’indirizzo fisico: a partire dall’indirizzo logico, il file system fisico individua il numero del blocco che contiene il record richiesto, in base alla lunghezza

Una conseguenza della struttura delle directory descritta e che costituisce una caratteristica peculiare dei file system dei sistemi Unix è che un inode può essere associato a più di