Dischi e file system

Transcript

Dischi e file system
File system / Cluster
Il file system è la parte di SO che, usando il driver dei dischi,
fornisce e supporta le astrazioni di file e directory gerarchiche.
Il file system del DOS è accessibile attraverso le funzioni di int 21
Per fornire l’astrazione di file, il SO implementa un’associazione
nome file → sequenza di settori contenenti l’informazione del file.
Il disco è allocato ai file a (blocchi di) settori, non byte, per semplicità:
• l’accesso al settore è l’operazione HW elementare sul disco
• lo spreco da settori parzialmente sfruttati è trascurabile nei file di
dimensioni più comuni (p.es. 9.5K+1byte=20 settori, spreco=5%)
Un file non può avere tutti i settori contigui, o sarebbe un problema
farlo crescere e recuperarne i settori se cancellato.
D’altra parte non è desiderabile un’eccessiva frammentazione
(p.es. nemmeno una coppia di settori consecutivi contigui).
Compromesso: il file system alloca spazio per i file in blocchi o
cluster di n settori contigui, ma non assicura contiguità tra cluster;
n può valere 2,4,8,16,32,64 (max DOS); p.es. n=16 → cluster = 8K
Ovviamente, valgono le relazioni:
1.
dimensione cluster →
2.
numero max file ←
3.
frammentazione ←
4.
utilizzazione disco ←
Esempio (4): cluster=16 settori=8K; un file di 1 byte ne spreca 8191!
Purtroppo in DOS il n. di settori per cluster non è dettato dall’
ottimizzazione di 1-4, ma dai 2 byte delle FAT entry (vedi oltre)
Dischi e file system- 03/16/06 11:57 PM
1/8
File system DOS - Partizioni
I settori del disco si possono dividere tra al più 4 partizioni contigue,
ognuna con un file system, anche non DOS (p.es. UNIX).
Il master boot sector o MBR (cilindro 0, superficie 0, settore 1)
contiene una tabella delle partizioni o partition table
intero disco:
MBR
Partizione 1
Partizione 2
Partizione 3 Partizione 4
Formato (logico) della partition table
¦
¦ Starting Location ¦ Ending Location ¦ Relative ¦Number of
Type ¦Boot¦Side Cylind Sector ¦Side Cylind Sector ¦Start Sec.¦ Sectors
-------------------------------------------------------------------------BIGDOS¦ Yes¦ 0
9
1
¦ 11
901
63 ¦
6804 ¦
675108
unused¦ No ¦ 0
0
0
¦ 0
0
0 ¦
0 ¦
0
?
¦ No ¦ 1
0
1
¦ 11
8
63 ¦
63 ¦
6741
unused¦ No ¦ 0
0
0
¦ 0
0
0 ¦
0 ¦
0
NB: partizioni allineate con i cilindri, ma traccia 0 del cilindro 0 (con il MBR) non usata.
Il DOS può gestire al più 2 partizioni; avranno rispettivamente type:
• 06H (BIGDOS); è la partizione primaria (≤2GB, ospita unità c:)
• 05H (EXTENDED); ospita unità u1 ... un (u1≥d:)
implementazione: i settori di una partizione estesa sono visti come un disco a parte:
il settore 0 ospita una partition table secondaria, che divide la partizione estesa in:
- partizione ospitante unità u1; ha type 1 (Dos12,<16M), 4 (Dos16,< 32M), 6 (BigDos)
NB: usa le tracce della partizione estesa da 1 in poi (non la traccia del settore 0);
- ulteriore partizione estesa per le unità u2...un; cioè p. es.:
disco
rigido
d:
c: (primaria)
e:
part. estesa
(I livello)
part. estesa
(II livello)
Formato partizione BIGDOS:
System area
FAT1 e FAT2 (copia)
(p.es. 165 sec. ciascuna)
Data area
Root Dir
(32 sec.)
Cluster 2 Cluster 3
(es. 16 s.)
boot sector = parte codice boot + informazioni su partizione
Dischi e file system- 03/16/06 11:57 PM
2/8
Boot sector
Formato (logico) dell’informazione nel boot sector di una partizione:
• esempio: partizione primaria (BIGDOS)
OEM ID
Bytes per sector
Sectors per cluster
Reserved sectors at beginning
FAT Copies
Root directory entries
Total number of sectors
Media descriptor byte
Sectors per FAT
Sectors per track
Sides
Special hidden sectors
Big total number of sectors
MSWIN4.0
512
16
1
2
512
Unused
F8 Hex
165
63
12
6804
675108
Physical drive number
Extended Boot Record Signature
Volume Serial Number
Volume Label
File System ID
128
29 Hex
154E0BCF
FAT16
(1 byte, valore max 64 → cluster 32K max)
2 bytes (used for Dos16→ unità<64ks=32M)
n. relativo (nel disco) settore boot
4 bytes → max n. settori = 4G (2KGB);
non raggiungibili per il limite di 64K cluster
numero cluster a 16 bit (max 64K)
• esempio: unità logica (DOS-12) in partizione estesa
OEM ID
Bytes per sector
Sectors per cluster
Reserved sectors at beginning
FAT Copies
Root directory entries
Total number of sectors
Media descriptor byte
Sectors per FAT
Sectors per track
Sides
Special hidden sectors
Big total number of sectors
Physical drive number
Extended Boot Record Signature
Volume Serial Number
Volume Label
File System ID
Dischi e file system- 03/16/06 11:57 PM
MSDOS5.0
512
8
1
2
512
21105
F8 Hex
8
63
12
63
Unused
128
29 Hex
0B1E0FF2
FAT12
cluster=4KB (max per FAT12)
2B (max 32MB, irraggiungibile con FAT12)
n. relativo (in p. estesa) settore boot
4 bytes (inutilizzato per Dos12/16)
numero cluster a 12 bit (max 4K → 16MB)
3/8
Root Dir
Dopo le FAT (ampiezza nota da boot sector), la system area è
conclusa da un’area che descrive il contenuto logico della root dir.
L’area contiene una tabella di 512 elementi (entries) di 32 byte
(512 da boot sector, 32=costante di sistema → area root=32 settori).
Una entry non nulla descrive un file o dir contenuto nella root così:
16 bit
Nome file
(8 byte)
Estensione
(3 byte)
A D V S H R
Riservati (10 byte)
Time
Date
Numero 1° cluster
Dimensione file
(4 byte)
Attributi
Read-only
Hidden
System
Volume
Directory
Archive
formato
little-endian
La word Time si interpreta come: hhhhhmmmmmmsssss; p.es.:
4e40 → 01001 110010 00000 → 9:50:00
La word Date si interpreta come: yyyyyyymmmmddddd; p.es.:
1f18 → 0001111 1000 11000 → 15 (1995-1980), 8, 24
Il numero del 1° cluster del file si riferisce alla numerazione
dei cluster da 2 in su nella data area della partizione.
IO.SYS e MSDOS.SYS, se presenti, sono le prime 2 entry della root.
Dischi e file system- 03/16/06 11:57 PM
4/8
Sottodirectory
Subdirectory: file contenente una tabella di entry come per la root;
ma il file-subdir ha dimensione arbitraria → numero entry > 512.
Le prime due entry hanno nome . (1° cluster quello della subdir) e
.. (1° cluster quello della dir padre o 0 - non esiste ma denota \).
FAT (File Allocation Table)
La FAT è una tabella di entry (elementi) di 16 bit:
• FAT[0] vale sempre fff8 (per FAT su hard disk);
• FAT[1] vale sempre ffff (inutilizzato);
• FAT[n] (n≥2) indica l’uso del cluster n;
- 0000 → cluster inutilizzato
- fff7 → cluster con bad sector
- ffff → ultimo cluster di un file
- n’ (≠precedenti) → n’ è il cluster seguente n nel file di n
Quindi le directory specificano per ogni file/dir il 1° cluster, sia n≥2;
eventuali altri cluster sono specificati da FAT[n], FAT[FAT[n]], ...
NB: i cluster non si numerano partendo da 0 perché:
1. per convenzione la FAT si fa iniziare con le 2 word fff8 ffff
(anche se queste non hanno alcuna relazione cluster)
2. dato (1), si descriverebbe il cluster n in 0... con FAT[n+2]; ma
è più semplice/efficiente descrivere il cluster n in 2... con FAT[n].
Dischi e file system- 03/16/06 11:57 PM
5/8
Grandezze caratteristiche e FAT
Il DOS indirizza i cluster con 16 bit, nella FAT come nelle directory;
quindi una partizione ha max 64K cluster -{0, 1, fff7..ffff}.
Questa caratteristica, intrinseca del DOS, ne influenza molte altre.
Col n. settori/cluster determina la max dimensione della data area:
Settori in un cluster Max data area (settori) Max data area (byte)
1
64K
32M
2
128K
64M
4
256K
128M
8
512K
256M
16
1M
512M
32
2M
1G
64
4M
2G
NB: 2GB = max dimensione prevista per partizione DOS (4.0)
in fase di configurazione si fissa la dimensione della partizione;
da questa e dalla tabella → n. di settori per cluster necessario;
p.es. partizione 330M → cluster=16 settori.
Calcolo |FAT| (NB: |X| = dimensione X):
|Partition| = |SystemArea|+|DataArea| = |BootSector| + 2×|FAT| + |RootDir| + |DataArea|
|BootSector| + 2×NFATEntries×|FATEntry| + |RootDir| + |Cluster|×(NFATEntries-2)
qui solo NFATEntries è incognita (le altre sono date o già valutate);
o più semplicemente (SystemArea>>DataArea, NFATEntries>>2):
NFATEntries ≅ |Partition| / |Cluster|
|FAT| = NFATEntries×|FATEntry| = 2×NFATEntries Byte
Esempio: |Partition| = 330MB, |Cluster| = 8KB → NFATEntries ≅ 41K;
|FAT| ≅ NFATEntries×|FATEntry| = 82KB = 164 settori
Infine, il max numero di file Nf si ha se ogni file è 1 cluster → Nf<64K
Dischi e file system- 03/16/06 11:57 PM
6/8
Implementazione del file system
Il file system usa,
oltre alle strutture
dati già viste:
Memoria programma
FHT
Stato handle 0
Memoria DOS
MSFT
Descr. file aperto
Stato handle i
Descr. file aperto
Stato handle max
• File Handle Table, nel PSP di ogni programma;
FHT è un array[0..19] of byte; FHT[n] dà lo stato della handle n;
FHT[n]=FF → handle n unused; altrimenti FHT[n] è un indice in:
• Master System File Table: per ogni file aperto ha una entry con:
1° cluster, posizione corrente, dimensione corrente.
Open(p:TNomeFile; var h:THandle).
Cerca una handle libera h in FHT e una entry libera in MSFT;
se p ha la forma \d1\...\n si cerca d1 nella root dir, d2 in d1 ...;
trovata dir entry n, copia 1° cluster e dim. in MSFT e restituisce h.
Read(h;handle; var buf:array of char; n:Word).
Copia in buf n byte del file dalla pos. corrente (in MSFT) e la aggiorna
Seek(h:THandle; n:integer).
Occorre trovare il cluster in cui si trova il byte n del file: partendo
dal 1° cluster (in MSFT), si segue la lista di cluster nella FAT.
Delete(p:TNomeFile).
Se p=\d1\...\n, nella dir entry n rende E5 (σ) il 1° char del nome;
inoltre nella FAT marca 0000 (liberi) i cluster che erano di p.
Quesito: come funziona undelete?
Dischi e file system- 03/16/06 11:57 PM
7/8
Svantaggi del file system DOS
1.Nomi file troppo brevi (formato delle directory entry)
2.Max numero di cluster limitato da ampiezza FAT entry
(64K cluster per FAT16, con entry a 16 bit)
3.Max numero file piccolo (64K), ancora a causa del
limite massimo di 64K cluster.
4.Dimensione cluster eccessiva per partizioni grandi;
p.es. 2GB suddivisi in 64K cluster danno cluster di 64 settori-32K;
→ allocazione dello spazio poco efficiente.
5.Partizioni limitate a 2GB, per non aggravare (4).
6.Il concetto di FAT non è ben scalabile: le FAT con entry a 12 bit
non si possono gestire come le nuove FAT con entry a 16 bit;
ulteriori incrementi sono poco pratici (vedi p.es. 7).
7.La FAT è troppo grossa per stare tutta in memoria RAM;
p.es. con 40K entries da 16 bit occupa 80Kbyte.
Questo problema si può mitigare dividendo il disco in partizioni con piccole FAT
e aumentando in CONFIG.SYS il n. di BUFFERS (memoria di scambio DOS-disco).
Ancora più efficace è l’uso di una disk cache software (p.es. SMARTDRV).
8.Random file access poco efficiente per la necessità di seguire
la catena di link in FAT:
Tempo di accesso a blocco dati B nel file F
∝ Distanza in cluster tra B e l’inizio di F
Dischi e file system- 03/16/06 11:57 PM
8/8