La memoria di massa, viene generalmente suddivisa in partizioni, come illustrato nella fig. 1.27, ognuna delle quali può contenere un filesystem.
Un filesystem gestisce unità minime di memorizzazione delle informazioni, dette blocchi (block), cioè tutte le sequenze di byte vengono memorizzate sulla memoria di massa in blocchi, ovvero raggruppamenti di byte, e l’accesso ai byte è effettuato dal filesystem passando per i blocchi. Ogni blocco può essere allocato (allocated), cioè contenere effettivamente delle informazioni, o libero (free), ovvero non contenere nessuna informazione.
La scelta della dimensione dei blocchi deriva da un compromesso tra l’avere prestazioni elevate e minimizzare lo spreco di spazio medio inutilizzato sul filesystem. Blocchi più grandi permettono di mantenere le informazioni in maniera più raccolta, avendo una minore dispersione (frammentazione esterna) delle stesse sul disco: quando un blocco viene riempito, il sistema ne deve utilizzare un altro libero. Pertanto quando si devono ritrovare le informazioni memorizzate, più blocchi esse occupano sul disco, più operazioni di ricerca devono essere effettuare dal filesystem per ritrovarle. Per contro, blocchi più piccoli permettono di sprecare meno spazio sul disco, in quanto, come sarà illustrato in seguito, per ogni file memorizzato sul disco si spreca mediamente la metà della dimensione di un blocco (frammentazione interna). In genere quindi, per ottimizzare il filesystem la dimensione dei blocchi da utilizzare dovrebbe essere proporzionale alla dimensione media dei file che si andranno a memorizzare sullo stesso.
|
Non si confondano i blocchi logici in cui vengono suddivise le informazioni dal filesystem, con quelli fisici utilizzati per la memorizzazione delle informazioni sulla superficie magnetica del dispositivo di memoria di massa. In genere i blocchi fisici hanno una dimensione di 512 byte, mentre i blocchi logici hanno una dimensione maggiore (comunque multiplo di quella dei blocchi fisici). |
In genere un file viene rappresentato sul filesystem da un’apposita struttura che contiene le sue caratteristiche ed i riferimenti relativi ai blocchi nei quali sono memorizzate le informazioni contenute nel file stesso (v. fig. 4.4).
Alcuni filesystem utilizzano come riferimenti ai blocchi delle strutture particolari, denominate extent, ognuno dei quali rappresenta un gruppo di blocchi fisicamente contigui. Ogni extent è una tripla di valori <inizio, dimensione, offset> dove
A questo punto il sistema memorizza le operazioni effettuate sul filesystem. Senza utilizzare la tecnica degli extent, per la memorizzazione del contenuto del file pippo, viene utilizzato un numero di blocchi necessario a contenere 5 + 10000 + 3 = 10008 byte, la cui maggior parte è sprecata, poiché 10000 byte non contengono nessun valore significativo. Utilizzando gli extent invece si possono memorizzare soltanto i blocchi relativi ai 5 + 3 byte significativi (scartando gli altri 10000), i primi 5 in un blocco riferito da un extent (ad esempio <123, 1, 0>), e gli ultimi 3 in un altro, riferito da un altro extent (ad esempio <135, 1, 1>) (si noti che l’indice del blocco contenente le informazioni può essere qualunque: l’ordine dei blocchi è specificato dall’offset degli extent). Si ottiene così quello che viene chiamato uno sparse file, ovvero un file con dei “buchi”.