Implementazione FS Struttura tipica FS
Transcript
Implementazione FS Struttura tipica FS
Implementazione FS 1. Rappresentazione e memorizzazione di file e directory; in particolare mapping nome file → lista di blocchi 2. gestione spazio su disco; p.es.: • |blocco| • rappresentazione spazio libero/occupato • quote 3. efficienza 4. affidabilità Struttura tipica FS • Superblocco: informa su tipo di FS, num blocchi partizione ... • I-nodes o altre forme di indice (FAT) File system: implementazione - 27/02/2006 1/26 Allocazione contigua • + semplice (corrispondenza: file ↔ blocco iniziale + dimensione) • + veloce: syscall R/W richiede 1 R/W HW del controller • + seek blocco random N richiede 0 accessi al disco (indirizzo blocco = base+N) • - richiede conoscenza dim max file all’atto della creazione • - frammentazione (da creazione/cancellazione) Oggi è tornata ad aver senso per i FS dei CD. File system: implementazione - 27/02/2006 2/26 Linked list • • • • • + + 2) in dir entry basta memorizzare il blocco iniziale anche se lo spazio libero è frammentato, lo si può utilizzare R/W sequenziale causa vari R/W HW del controller seek random a blocco N costa, in accessi a disco, O(N) per via dei puntatori, |blocco file|≠ |blocco disco| (potenza di Rimedio: indice (p.es. dopo il superblocco) File system: implementazione - 27/02/2006 3/26 Linked list e indice (FAT) Elimina due dei difetti della linked list pura. Adesso: • seek random a blocco N costa, in accessi a indice (RAM), O(N) • |blocco file| = |blocco disco| (potenza di 2) Problema residuo: l'indice occupa molta RAM; p.es.: • partizione 16GB, blocco 1K → 16M blocchi • indice di 16M=224 entry → entry 3 byte (o 4 per allineamento) • |indice| = 16M x 3 = 48M (64M) File system: implementazione - 27/02/2006 4/26 Linked list e indice: FAT16 (MS-DOS) Compromesso, per ridurre dimensione indice (o FAT): • indice di max 64K → entry di 2B → max |indice|=128K • partizione max 2GB • → per partizione di 2GB, blocchi (cluster) grandi;, |blocco| = |partizione|/(n.entry in indice) = 231/216 = 215 = 32K Problemi FAT16: • blocchi grandi → frammentazione interna • per DOS (640K RAM controllata) non occupa comunque troppo spazio? Soluzione: tenere in RAM solo indici per blocchi di file aperti, anziché un unico indice per tutti i blocchi; → a questo punto, conviene separare indici anche su disco File system: implementazione - 27/02/2006 5/26 Allocazione con i-node Ogni file ha un index-node che ne dà attributi e indirizzi dei blocchi: I-node in locazioni fisse su disco, caricati in RAM per file aperti. Layout tipico. Disco: 32 bit address, 1K block. I-node: • attributi • 10 direct pointers: file < 10K • puntatore a indirect block, porta a 1K/4=256=28 blocchi: file < 256K+10K • puntatore a double indirect block, porta a 216=64K blocchi: file < 64M+266K • puntatore a triple indirect block, porta a 224=16M blocchi: file < 16G+64M+266K Vantaggio: un accesso al file costa max 3 accessi al disco e i file piccoli sono meno penalizzati. File system: implementazione - 27/02/2006 6/26 Ext2FS / ReiserFS Ext2FS: http://web.mit.edu/tytso/www/linux/ext2intro.html Reiser V3: http://linux.co.uk/ldp/LDP/LG/issue55/florido.html Reiser V4: http://www.namesys.com/v4/v4.html Confronti tra FS: http://en.wikipedia.org/wiki/Comparison_of_file_systems File system: implementazione - 27/02/2006 7/26 Implementazione directory • Directory: tabella multilivello, con una dir entry per file. • Dir entry = puntatore/i-node a blocchi del file + (a volte) attributi • nomi di file di lunghezza variabile (NB: allineati su word) • per migliorare prestazioni di ricerca su directory: • hashing, oppure • caching delle ricerche già effettuate File system: implementazione - 27/02/2006 8/26 Esempi di implementazione delle directory • • • • CP/M dim file in blocchi, non byte per OS file=insieme blocchi per i programmi fine file=^Z file di n blocchi occupa n/16 dir entries, numerate da Extent DOS Unix Apertura file: pathname→dir entry→indirizzi blocchi file. Esempio: lookup di /usr / as t /mbox in Unix: • i-node di root dir ha n. fisso • dir entry . e . . per lookup pathname relativi, es. . . / a s t /mbox File system: implementazione - 27/02/2006 9/26 Link Rendono un DAG il directory tree (condivisione o evitare ridondanza) Un (hard) link al file /.../g è una dir entry di nome g (= o ≠ f), che punta a: • stesso i-node di /.../f (hard link) • → originale f e link g sono indistinguibili Il pathname /.../g si dice talvolta alias di /.../f dir di B dir di C f g Owner=C n.links=2 i-node Problema link: inganna discese ricorsive (p. es. backup/restore) Problemi hard link: • CP/M: impossibile → dir entry ha indirizzi di più blocchi del file (p.es. come registrare sui link nuovi blocchi dopo append?) • DOS: append funziona (opera su FAT), ma non delete ( filename) : blocchi resi liberi in FAT, ma la dir entry / link punta ancora al 1° • cancellazione problematica; p.es. cosa accade se C vuole cancellare il file g? • l’i-node non si può eliminare se non insieme con l’hard link di B (altrimenti questo resterebbe dangling (“pendente”)) • ma l’hard link non si può eliminare: FS non può dall’i-node risalire a ogni hard link (hard link = dir entry, quindi non indirizzabile facilmente) • soluzione non ideale: i-node e hard link di B restano, C risulta owner e paga! File system: implementazione - 27/02/2006 10/26 Symbolic link Un symlink al file /.../f è una dir entry di nome g (= o ≠ f), che punta a: • i-node di un nuovo file contenente il pathname /.../f (symbolic link) Il pathname /.../g si dice talvolta alias di /.../f dir /bin dir /user/bin file /user/bin/g /bin/f f g link simbolico Owner=user Owner=root n.links=1 i-node i-node (di tipo LINK) Vantaggi: • cancellazione i-node ok (symbolic link resta invalido) • network pathname via symbolic link Problemi symbolic link: • overhead da doppio lookup di pathname • extra i-node e blocco per file contenente pathname (ottimizzazione: pathname in i-node) • rende difficile discese ricorsive accurate File system: implementazione - 27/02/2006 11/26 Gestione spazio su disco Scelta di fondo (simile a segmentation/paging) 1. allocazione in settori contigui 2. suddivisione in blocchi non contigui Problemi/tradeoff: 1. allocazione contigua: • frammentazione interna • frammentazione esterna (dello spazio libero) • difficoltà incremento dimensione • cf. segmentazione e gestione memoria centrale, ma qui compattare è assai più oneroso che in RAM 2. allocazione in blocchi non contigui; • frammentazione interna • frammentazione da scattering (sparpagliamento dei blocchi di un file) → peggiora seek/latency time File system: implementazione - 27/02/2006 12/26 Dimensione dei blocchi |Blocco|? Scelte ovvie: cilindro, traccia, n× settore, frame (se paging) Tradeoff su dimensione blocco: • piccolo → frammentazione esterna e da scattering • grande → frammentazione interna Valori tipici: blocco=0.5K, 1K, 2K, 4K; settore=0.5K Analisi data rate medio per |block|=B • a occhio conviene B grande per diminuire impatto seek + latency: • T(B) = SeekTime + Period/2 + Period × (B / |track|) = SeekTime + Period/2 × (1+2B/|track|) • Data Rate=B/T(B); è quasi lineare se 2B≪|track| NB: nel grafico B è riportato sulle ascisse in scala logaritmica • curva a tratti = tasso utilizzo legato a frammentazione interna: • si suppone ogni file di 2K (tipica dimensione mediana) • utilizzo = 100% per B=...0.25K, 0.5K, 1K, 2K 2K/B per B=4K, 8K, ... • B ottimale ≃4K (come in NT, in Unix è 1K per motivi storici) File system: implementazione - 27/02/2006 13/26 Gestione blocchi liberi • Linked free list di blocchi contenenti i numeri dei blocchi liberi • 1 blocco free list contiene num. liberi: (|blocco|/|n.blocco|) -1 • P.es. Partizione 16GB, blocco 1K, n. blocco a 32 bit: • 1 blocco di free list memorizza 255 blocchi liberi • nel caso peggiore (tutta la partizione libera) free list contiene 16M blocchi e occupa 16M/255 ≈ 64K blocchi • Bitmap: 1 bit per blocco. • Esempio precedente (partizione 16GB, blocco di 1K): la bitmap occupa 16Mbit = 16M/8 Byte = 2MB = 2K blocchi File system: implementazione - 27/02/2006 14/26 Confronto bitmap/free list • Con il disco quasi vuoto, la free list occupa molto più spazio, ma ciò non è necessariamente un problema: • una free list grande (causata da disco quasi vuoto) può essere memorizzata proprio nei molti blocchi liberi • tenere tutta la free list in memoria sarebbe oneroso, ma in effetti basta tenerne un blocco • Se si cerca di tenere un solo blocco di free list in memoria, va evitato che questo sia troppo vicino a riempirsi: • se un file di 3 blocchi viene spesso cancellato e creato (su /tmp): • • • • si rischia di oscillare da (a) in (b) e ritorno; conviene invece mantenere la situazione (c): un blocco di lista libera in memoria pieno per metà in corrispondenza, un blocco di lista libera sul disco, pieno per metà • Anche con la bitmap si può: • tenere un solo blocco della bitmap in memoria e • il resto sul disco File system: implementazione - 27/02/2006 15/26 Quote • Hard limit non si può superare • Soft limit exceeded: warning al login, decremento warning count • warning count = 0: no login Implementazione: • tabella delle quote in memoria • ogni creat viene controllato • ogni append su file aperto viene controllato Open file table Attributes Disk Addresses User = 108 Quota pointer Quota table Soft block limit Hard block limit Current n. of blocks n. Block warnings left Soft file limit Quota record for user 108 Hard file limit Current n. of files n. File warnings left File system: implementazione - 27/02/2006 16/26 Affidabilità FS Gestione bad blocks: • hw: controller rimappa ogni bad block su spare block (tabella memorizzata in apposito settore) • sw: FS o utility (DOS) marcano bad block o costruiscono bad file (cui non si accede mai) Backup: • incrementale: file cambiati da ultimo backup full o incrementale; • cambiamento riconoscibile da archive bit (DOS) o dal confronto tra modified time e backup time (memorizzato a parte) Concetti relativi all'affidabilità: • mirroring on line • hot swap • MTBF (Mean Time Between Failures) non scala linearmente con il costo del disco • ridondanza ⇒ RAID • ridondanza e majority voting File system: implementazione - 27/02/2006 17/26 RAID DOC SuSe Like a RAID controller,which canoftenbequiteexpensive,soft RAID is alsoableto takeon thesetasks.SUSE Linux offers theoptionof combiningseveralharddisksinto onesoft RAID systemwith thehelp of YaST—a veryreasonablealternativeto hardwareRAID. RAID impliesseveralstrategiesfor combiningseveralharddisksin a RAID system,eachof themhaving differentgoals,advantagesandcharacteristics.Thesevariationsarecommonlyknownas RAID levels. CommonRAID levelsare: RAID 0 This level improvestheperformanceof your dataaccessby spreadingoutblocksof eachfile acrossmultipledisk drives. Actually, this is not really a RAID, becauseit doesnotprovidedatabackup,butthenameRAID 0 for this typeof systemhas becomethenorm.With RAID 0, two or moreharddisksarepooledtogether.The performanceis verygood,buttheRAID systemis destroyedandyour datalost if evenoneharddisk fails. RAID 1 This level providesadequatesecurityfor yourdata,becausethedatais copiedto anotherharddisk 1:1. This is knownas hard diskmirroring. If a disk is destroyed,a copyof its contentsis availableon anotherone.All of themexceptonecouldbe damagedwithoutendangeringyour data.The writingperformancesuffersa little in thecopyingprocesscomparedto when usingsingledisk access(tento twentypercentslower),butreadaccessis significantlyfasterin comparisonto anyoneof the normalphysical harddisks,becausethedatais duplicatedso canbe parallel scanned.Generally it canbe said thatLevel 1 providesnearlytwicethereadtransactionrateof singledisksandalmostthesamewritetransactionrateas singledisks. RAID 2 andRAID 3 Thesearenottypical RAID implementations.Level 2 stripesdataat thebit level ratherthantheblock level. Level 3 provides byte-level stripingwith a dedicatedparitydisk andcannotservicesimultaneousmultiplerequests.Both levelsareonly rarely used. RAID 4 Level 4 providesblock-level stripingjust like Level 0 combinedwith a dedicatedparitydisk. In thecaseof a datadisk failure, theparitydatais usedto createa replacementdisk. However,theparitydisk maycreatea bottleneckfor writeaccess. Nevertheless,Level 4 is sometimesused. RAID 5 RAID 5 is an optimizedcompromisebetweenLevel 0 andLevel 1 in termsof performanceandredundancy.The harddisk spaceequalsthenumberof disksusedminusone.The datais distributedovertheharddisksas with RAID 0. Parity blocks, createdon oneof thepartitions,aretherefor securityreasons.Theyarelinkedto eachotherwith XOR, enablingthecontents, via XOR, to bereconstructedby thecorrespondingparityblock in caseof systemfailure.With RAID 5, no morethanonehard disk canfail at thesametime.If oneharddisk fails, it mustbereplacedas soonas possibleto avoid therisk of losingdata. OtherRAID Levels SeveralotherRAID levelshavebeendeveloped(RAIDn, RAID 10, RAID 0+1,RAID 30, RAID 50, etc.), someof thembeing proprietaryimplementationscreatedby hardwarevendors. File system: implementazione - 27/02/2006 18/26 RAID (Tanenbaum) Backup and parity drives are shaded File system: implementazione - 27/02/2006 19/26 File system consistency Integrità: compromessa se avviene crash prima che blocco modificato in RAM sia copiato su disco. Consistency: compromessa se il blocco contiene struttura dati FS: • i-node • directory entry • parte di free list FS check (consistency) a boot time: blocchi, dir entries, euristica. Blocchi. FS check (e2fsck ) determina, per ogni blocco: 1. n. usi = n. presenze in qualche file (segue puntatori da ∀ inode) 2. n. presenze in free list (o bitmap con 0) File system: implementazione - 27/02/2006 20/26 FS check sui blocchi: esempio • b. blocco (p.es. 2) non usato né in free list (mancante): mettilo in free list • c. blocco (p.es. 4) duplicato in free list (impossibile con bitmap): ricostituisci free list • d. blocco (p.es. 5) in 2 file: copialo su blocco, inseriscilo in uno dei file; informa utente • e. (non in fig.) blocco in file e in free list: eliminalo da free list Osservazioni: • (b) è solo inefficiente, ma (d) implica perdita dati • è opportuno riparare (c),(e) perché può accadere (e)→(d), o (c)→(e) • altra transizione possibile: (d)→(e) File system: implementazione - 27/02/2006 21/26 FS consistency: file check Visita directory tree e per ogni i-node conta r =numero riferimenti: • r =l (link count registrato in i-node) → ok • r<l non pericoloso, ma spreca spazio: rm r entries rende link count=l-r>0 → i-node resta in uso • correzione: link count:= r; • r>l pericoloso, causa perdita dati: rm l entries, fa link count=0 → FS libera i-node e blocchi puntati • correzione: link count:= r; FS integrity: altre misure Euristiche segnalano situazioni errate o strane: • controllo formato dir entry, p.es. i-node n. > n. i-node su disco • controllo n. entry in dir (p.es. > 100000) • controllo diritti, p.es. other>user • controllo file in user dir, con owner=root e SETUID=1 (security) Alcuni sistemi consentono undelete: • DOS • Unix con Wastebasket File system: implementazione - 27/02/2006 22/26 Performance: caching Accesso a memoria ≈ 10ns, accesso a blocco ≈ 10ms. Block/buffer cache: blocchi di disco memorizzati in RAM. Tipico algoritmo: • se è richiesto un blocco lo si cerca in cache (ricerca hash) • se il blocco non è in cache, ve lo si copia • se la cache era piena, si fa posto scegliendo una vittima • se cache è usata anche per Write, le vittime dirty vanno salvate La vittima si può scegliere con Page Replacement Algorithm: • p.es. LRU; è possibile l'implementazione con LRU list: accessi a cache più rari che a frame VM • la lista LRU è integrata con una tabella hash File system: implementazione - 27/02/2006 23/26 Buffer cache: accorgimenti Il rimpiazzamento LRU puro è inadeguato, in quanto prescinde da: • se il blocco sarà presto necessario o viceversa; p.es.: 1. blocco parzialmente pieno in corso di scrittura o viceversa • → dovrebbe servire presto e va forzato su MRU 2. blocco pieno, double/triple indirect block, blocco i-node; • → non dovrebbero servire e vanno forzati su LRU Per la consistency del FS è importante che i blocchi dirty in cache vengano salvati presto su disco: • i blocchi dirty non contenenti dati vanno scritti immediatamente, prescindendo da quando li scaccerà /salverà LRU Ma anche i cache block non critici, se modificati, vanno salvati spesso: • sync invocata da processo update ogni 30 s • write-back o write-through cache (nessun caching, MS-DOS) • NB: ovviamente l’applicazione DOS non scrive un byte alla volta, ma usa un buffer più grande. File system: implementazione - 27/02/2006 24/26 Performance / 2 Read-ahead dei blocchi di un file: • presuppone accesso prevalentemente sequenziale • quest'informazione si può rispecchiare con un bit: • azzerato da seek() • impostato da accessi sequenziali Allocare nuovi blocchi di un file consecutivamente: • facile con bitmap (specie se in RAM), • difficile con free list (specie se in parte su disco) Soluzione per allocazione con free list: • allocare non un blocco, ma una zona di n blocchi; • ciò consente di diminuire: • i movimenti del braccio, quindi • i tempi di trasferimento • la cache e quindi i trasferimenti da/a disco restano organizzati in blocchi Nozione estesa di “contiguità”: • si cerca di allocare i blocchi consecutivi di un file • finché è possibile nella stessa traccia, • quindi nello stesso cilindro File system: implementazione - 27/02/2006 25/26 Performance / 3 Altro problema: • i-node all’inizio del disco, settori lontani • → apertura+accesso a un blocco causa un ampio seek. Soluzioni: • i-node nei cilindri centrali • i-node suddivisi tra cilindri: • i blocchi per un file sono scelti (se possibile) • dai cilindri del suo i-node. File system: implementazione - 27/02/2006 26/26