|
Appunti informatica |
|
Visite: 1319 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Interfaccia col pilota umanoInterfaccia col pilota umano 1.1 Obiettivi I La tecnologia DVDLa tecnologia DVD Il DVD si presenta come un comune compact disc da 12 cm di Cronologia dei processori intelCronologia dei processori intel Non tutti sanno che uno dei primi processori, |
Ottimizzazione dell'I/O
Abbiamo visto che il FS rediretta le richieste di operazioni I/O ad un disco virtualizzato da un gestore di risorsa. Un disco rigido è strutturato in dischi (in generale è costituito da un pack di dischi), tracce (e cilindri) e settori e un generico settore (singolo blocco fisico accessibile) è univocamente identificato su disco dalla terna (f,t,s) (numero di faccia, numero di traccia sulla faccia, numero di settore entro la traccia); supponendo che T sia il numero di tracce per faccia e S il numero di settori per traccia, l'intero insieme dei settori fisici che compongono un drive viene trattato come un array di settori logici, in cui il settore fisico (f,t,s) corrisponde al settore logico [f x T x S + t x T + s]. Qualunque sia la tecnologia adottata da un drive a componenti mobili, le operazioni di accesso, lettura e scrittura richiedono un tempo non nullo, sebbene individualmente breve. Un disco a testine mobili presenta delle testine montate su braccetti a pettine spostati meccanicamente in senso radiale sulla superficie dei dischi; il tempo medio di trasferimento di un settore (in lettura o scrittura in/da un buffer noto) risente del tempo medio di accesso (per posizionare la testina sul settore desiderato) e del tempo di trasferimento effettivo dei dati contenuti nel settore, secondo la relazione TF = TA + TT: il TA in particolare è somma del tempo di seek (per posizionare la testina sopra la traccia che contiene il settore desiderato) il tempo di latenza o rotational latency (tempo necessario perchè il pack di dischi ruoti fino a che il settore non è sotto la testina), ovvero TA = TS + RL; il TT analogamente corrisponde al tempo necessario a far transitare sotto la testina l'intero settore e vale approssimativamente TT = Tc / S, con Tc il tempo che occorre al disco per effettuare un giro completo; una volta che le testine si siano posizionate sopra uno specifico cilindro (l'insieme di tutte le tracce omologhe su tutti i dischi) andrebbe considerato anche un tempo di selezione della traccia/faccia, tuttavia esso è trascurabile perchè realizzata elettronicamente. Un disco a testine fisse viceversa presenta tante testine quanti sono i cilindri e il braccio non si sposta mai: il tempo di seek è nullo. Esistono poi dei dischi a testine mobili che hanno un numero di testine poco inferiore al numero dei cilindri, in modo da rendere minimo lo spostamento possibile (e quindi il tempo di seek). In tutti i casi, si osservi che - nella pratica - durante l'eventuale posizionamento della testina e la rotazione dei dischi, la stessa testina legge a ciclo continuo ogni settore su cui transita, ricopiando i dati letti sempre nello stesso buffer: ogni settore è preceduto da un mark di inizio settore cui segue la tripla che identifica il settore stesso, e solo quando le due triple (quella letta e quella richiesta) coincidono il buffer non viene più sovrascritto sicché gli ultimi valori letti sono quelli desiderati.
L'ottimizzazione delle operazioni di I/O può essere condotta con due tipi di intervento: ridurre il tempo medio di attesa per il completamento della singola operazione, oppure ottimizzare il modo in cui i dati sono memorizzati su disco scegliendo un opportuno metodo di allocazione dei file (strategia parzialmente già analizzata nel paragrafo sul file system
Nell'ottica di ridurre il tempo medio di attesa, osserviamo che per un disco a testine mobili l'ottimizzazione può avvenire sia rispetto al tempo di seek, sia rispetto al tempo di latenza, sia rispetto ad entrambi: tipicamente il primo è maggiore del secondo, quindi conviene optare per una ottimizzazione rispetto al tempo di seek; per un disco a testine fisse invece l'eventuale ottimizzazione può avvenire soltanto rispetto al tempo di latenza (anche se in generale il RL è talmente piccolo che non vale nemmeno la pena ottimizzare
Per ottimizzare il tempo di seek, le richieste in coda ad un dispositivo possono essere servite secondo diverse politiche di scheduling la First Come First Served (FCFS o semplicemente FIFO) prevede che le richieste siano servite nell'ordine in cui si presentano: non risponde ad alcun criterio di ottimalità ma azzera il problema della starvation; la Shortest Seek Time First (SSTF, equivalente all'SJF per la CPU) seleziona la richiesta col tempo di seek minimo a partire dalla posizione attuale della testina: può generare lo starvation; con l'algoritmo dell'ascensore o SCAN la testina si porta ad un'estremità del disco e si sposta servendo le richieste man mano che viene raggiunta una nuova traccia fino a raggiungere l'altra estremità, dopodichè cambia direzione: non genera starvation perchè evita di servire richieste consecutive ad uno stesso settore; la Circular SCAN (C-SCAN), variante della precedente, prevede che, arrivata alla fine, la testina torni immediatamente all'inizio del disco: ipotizzando (verosimilmente) una distribuzione uniforme per le richieste relative alle varie tracce, essa fornisce un tempo di attesa più uniforme (oltre ad ottimizzare il moto che non è più a scatti) dal momento che, quando la testina inverte la direzione, sono presenti nei paraggi poche richieste in quanto servite di recente; la LOOK e la C-LOOK sono varianti della SCAN e C-SCAN in cui la testina non arriva mai alle estremità del disco ma si arresta sempre all'ultima richiesta in ciascuna direzione. Volendo valutare quale di essi sia il più performante, occorre dire che ciascuno di questi algoritmi (anche il FIFO) funziona comunque piuttosto bene in presenza di un sistema mediamente scarico (cioè con poche richieste pendenti) e che analogamente in presenza di molte richieste ciascuno di essi può comunque funzionare meglio o peggio in relazione alla modalità di allocazione dei file: se i file sono allocati in modo contiguo, tutte le richieste inerenti un certo file sono certamente concentrate in un'area ridotta del disco, tuttavia ciò non impedisce che richieste alternate, relative a due file pur allocati in modo contiguo ma in zone molto distanti del disco, possano produrre spostamenti anche significativi delle testine; inoltre, se i file directory e gli i-node sono tutti concentrati in una specifica regione del disco, notevole è l'andirivieni relativo a quella zona rispetto al resto del disco e occorre certamente un algoritmo che ottimizzi gli spostamenti. In generale, sulla base delle osservazioni fatte, l'algoritmo da preferire è il C-SCAN. Si tenga conto che un algoritmo di scheduling come quelli proposti viene generalmente implementato a livello 3 del FS (le richieste vengono ordinate e sottoposte in quell'ordine al driver), tuttavia, in grossi sistemi, le richieste I/O vengono direttamente bufferizzate dal controller che applica proprie politiche di scheduling mentre il SO rinuncia ad occuparsene: in caso contrario, il SO preordinerebbe le richieste somministrandole poi una alla volta al controller, con ovvio calo delle prestazioni e potenziale conflitto con un'eventuale postordinamento effettuato dal controller stesso.
L'ottimizzazione del tempo di latenza ha senso per un disco a testine fisse nel quale, in ogni istante, su ogni traccia di ogni cilindro c'è una testina: poichè i settori hanno numerazioni coincidenti in senso radiale, posto che ci siano S settori per traccia, in ogni istante tutti i settori di numero 0 X S-1 sono coperti da una testina; la più ovvia politica di scheduling adottabile prevede che, nell'ambito della rotazione continua dei dischi, vengano servite contemporaneamente tutte le richieste di volta in volta pendenti relative ai settori (di numerazione omologa) su cui le testine sono attualmente in transito: pur essendo teoricamente (il limite è dato solo dalla larghezza di banda del canale di comunicazione tra il disco e il buffer in cui i dati letti vengono memorizzati) possibile leggere contemporaneamente (cioè in parallelo) un intero "raggio" di settori per ogni faccia, in realtà di volta in volta saranno selezionate elettronicamente solo le effettive tracce di interesse. Si noti che per un disco a testine mobili un algoritmo del genere darebbe dei benefici totalmente irrilevanti, visto che in ogni istante è possibile un accesso in parallelo ai soli settori di numero omologo giacenti però su un unico cilindro; potrebbe viceversa tornare comunque utile per i dischi dotati di una cache in cui venga letto un intero cilindro per volta.
L'ottimizzazione dell'I/O inerisce anche la scelta delle tecniche di gestione della cosiddetta area di swap (nell'ambito della più generale gestione della memoria virtuale), la quale non necessariamente deve avvenire con le stesse modalità con cui avviene la gestione del file system, essendo le esigenze chiaramente diverse nei due casi. In quest'ottica, è facile notare come l'allocazione contigua, mentre non è molto adatta alla gestione del FS (come si è già visto), risulta viceversa ottimale per la gestione dell'area di swap. L'allocazione contigua produce infatti suo malgrado frammentazione nello spazio vuoto del FS (frammentazione esterna perchè vengono occupati parzialmente blocchi liberi più grandi lasciando in essi uno spazio insufficiente per altre allocazioni, frammentazione interna perchè in previsione di un aumento delle dimensioni dei file allocati viene solitamente allocato uno spazio più grande del necessario, ambedue rendono necessarie continue ricompattazioni/spostamenti di file) e, nonostante massimizzi la velocità di trasferimento (le locazioni che contengono i dati da trasferire sono contigue), tale peculiarità non viene sfruttata totalmente dal FS dal momento che esso effettua generalmente solo accessi a parti di file (salvo operazioni di copia di file interi). Nell'ambito della gestione dell'area di swap, al contrario, l'allocazione contigua è ottimale perchè le operazioni di Swap-In e di Swap-Out coinvolgono sempre processi interi e la velocità con cui il trasferimento viene eseguito costituisce un parametro critico di efficienza per l'intero sistema; inoltre anche se, a causa della frammentazione, lo spazio risulta istantaneamente gestito in modo poco efficiente, sul lungo periodo l'alta frequenza con cui avvengono i trasferimenti elimina ogni esigenza di manutenzione dello spazio libero, dal momento che i buchi tendono a ricompattarsi da soli. In linea del tutto generale quindi, lo spazio di swap viene gestito nei SO con una tecnica di allocazione contigua oppure quasi contigua, cioè al processo vengono assegnati un certo numero di blocchi (settori contigui) di dimensione fissa o variabile non necessariamente adiacenti tra loro ma tali da ridurre drasticamente la frammentazione (si vedano la segmentazione e il paging
Alcuni SO (come Windows) gestiscono l'area di swap allo stesso modo in cui viene gestito il FS, ovvero le routine che operano sull'area di swap sono le stesse che operano sul FS: l'area di swap corrisponde di fatto ad uno o più file dentro/da i quali i processi vengono trasferiti durante lo swapping. In Unix invece esiste una sostanziale distinzione tra FS e area di swap: ogni volta che un processo nasce gli viene assegnata una sua specifica area di swap, allocata staticamente e non dinamicamente, rimossa solo quando il processo termina; durante il cosiddetto swapping dell'area istruzione, il codice o "testo" del programma viene allocato in blocchi (di settori contigui) di al massimo 512KB (l'ultimo è chiaramente di grandezza variabile) linkati tra loro da un vettore di puntatori di swap, mentre lo swapping dell'area dati coinvolge segmenti di dimensione variabile (16, 32, 64KB) linkati in un diverso vettore di puntatori, e in ambedue i casi le routine che si occupano di gestire allocazioni/trasferimenti sono distinte dalle omologhe routine del FS; in realtà si può notare che, stante uno swapping differenziato per codice e dati, lo Swap-Out è necessario solo per i dati (che possono cambiare in RAM e vanno aggiornati su disco) mentre per il codice è richiesto solo lo Swap-In (ogni volta che occorre ricaricarlo in RAM) dal momento che non si modifica in RAM (a meno che non sia non rientrante
Quando una RAM è costituita da più moduli di memoria, si può disporre le word dati in maniera alternata tra i vari moduli, secondo il cosiddetto metodo dell'interliving o interlacciamento della memoria: in presenza di N banchi di RAM distinti, se (ad esempio) ogni indirizzo in memoria corrisponde ad una word a 16 bit (coppia di byte), avremo che i primi 2 byte saranno memorizzati nel primo banco (cui corrisponderà l'indirizzo 0), i secondi 2 byte nel secondo banco (cui corrisponderà l'indirizzo 1), la word (N+1)-esima sarà memorizzata ancora nel primo banco (vi corrisponderà l'indirizzo N, e costituirà la seconda word memorizzata nel banco), e così via; quando si effettua un accesso ad una serie consecutiva di word, queste si trovano in moduli diversi e l'accesso può essere eseguito in parallelo, riducendo il tempo di accesso complessivo. L'estensione dell'interliving ai dischi rigidi si traduce nella cosiddetta tecnica RAID.
Nella sua definizione più semplice il sistema RAID (Redundant Array of Independent Disks, insieme ridondante di dischi indipendenti) permette di combinare un insieme di dischi rigidi in modo che il SO veda una sola unità logica, anzichè dischi distinti. La sua implementazione originaria (in cui l'acronimo era l'abbreviazione di Redundant Array of Inexpensive Disks insieme ridondante di dischi economici) si basava sul combinare più dischi a basso costo o obsoleti, in modo da rendere il sistema complessivamente migliore di un disco di ultima generazione in termini di capacità, affidabilità e/o velocità. Oggigiorno il RAID è tipicamente implementato nei server (o anche in PC domestici di fascia alta) e i principali benefici offerti sono l'accresciuta integrità dei dati, tolleranza ai guasti e prestazioni, rispetto ad un singolo disco. Le specifiche originali del RAID risalgono ad un articolo pubblicato nel 1988 da un gruppo di ricercatori dell'università di Berkley in California, e suggerivano un diverso numero di livelli di RAID o combinazioni di dischi, ciascuna con dei vantaggi e degli svantaggi, tradotte nel corso degli anni in almeno 7 livelli RAID standardizzati.
Un concetto fondamentale del sistema RAID è il data striping (letteralmente "fare a strisce i dati"), meccanismo con il quale i dati vengono partizionati in segmenti (detti fette) di uguale lunghezza (detta unità di striping, 1 bit, 1 byte, 1 word, ) distribuiti su un array di dischi differenti, generalmente usando un algoritmo round robin: ogni disco dell'array si può immaginare suddiviso in fette (un blocco di settori fisicamente adiacenti, quantificato dall'unità di striping) e un insieme di fette logicamente consecutive (giacenti chiaramente su più dischi) che mappi esattamente una fetta in ogni elemento dell'array di dischi si definisce striscia, sicché dati consecutivi giacenti logicamente su una medesima striscia sono in realtà distribuiti su più fette logicamente consecutive in dischi diversi e possono essere letti in parallelo aumentando le prestazioni. Va detto comunque che l'effettivo aumento delle prestazioni dipende da diversi fattori: in primo luogo è fondamentale che lungo tutto il percorso che va dalla memoria del sistema fino ai singoli drive dell'array (passando per il bus di memoria, il bus I/O e gli adattatori I/O) la capacità di trasferimento sia adeguatamente elevata; in secondo luogo (posto che una singola richiesta I/O isolata ha un tempo di soddisfacimento che risente in maniera abnorme del tempo di seek e di latenza del disco) appare evidente che le applicazioni devono essere orientate a somministare le richieste I/O in modo da ottimizzare l'uso dell'array di dischi, dacché numerose richieste di grandi quantità di dati logicamente contigui consentono al gestore dell'array di bilanciare il carico di richieste massimizzando il parallelismo di trasferimento; in terzo luogo, infine, le prestazioni dipendono anche dalla dimensione delle fette, dal momento che con fette grandi una singola richiesta I/O necessita tendenzialmente di un solo accesso a disco cosicché più richieste I/O in attesa potranno essere eseguite in parallelo. Il RAID può essere implementato sia con software specifico (eseguito sul sottosistema di gestione del disco) su hardware comune, sia con hardware dedicato: con una implementazione software il SO gestisce l'array di dischi attraverso un normale controller (implementazione più lenta ma non richiede hardware aggiuntivo); una implementazione hardware (quindi più performante) del RAID richiede invece (almeno) un controller RAID ad hoc, che non solo gestisce i dischi ma effettua controlli di parità (di cui diversi livelli RAID necessitano) sui dati e può supportare l'hot swapping (scambio a caldo) ovvero la sostituzione di un disco mentre il sistema rimane in esecuzione; sia i sistemi hardware che software supportano inoltre l'uso degli hot spare, dischi di scorta preinstallati che vengono attivati ed usati immediatamente nel caso in cui un'unità si rompa.
Il sistema RAID 0 (non presente tra i livelli RAID originari) implementa una pura e semplice operazione di striping, cioè divide i dati equamente tra due o più dischi ma non supporta alcuna informazione di parità o ridondanza: se due diverse richieste di I/O sono in attesa di due diversi blocchi dati, al crescere del numero di dischi, aumenta la probabilità che tali blocchi siano posizionati su dischi diversi e che possano essere letti in parallelo, con evidente aumento delle prestazioni. Si noti d'altra parte che l'affidabilità (misurata come tempo medio tra due guasti) di un sistema RAID 0 è inversamente proporzionale al numero degli elementi (affidabilità media dei dischi / N dischi): essendo infatti il FS diviso tra tutti i dischi, se uno solo dei drives si guasta, ne risulta una corruzione spesso irreparabile di tutti i dati, non essendo il FS capace di gestire una perdita dei dati così estesa; per lo stesso motivo, i dischi sono insostituibili visto che sono tutti interdipendenti tra di loro in modo assoluto. In sintesi, l'uso del RAID 0 è confinato a quei sistemi in cui capacità, prestazioni e basso costo sono prioritari rispetto all'affidabilità. In qualche misura affine al RAID 0 è il JBOD (Just a Bunch of Disks, una semplice concatenazione di dischi, indicato nel kernel di Linux 2.6 come RAID Linhr), metodo popolare per combinare insieme dischi fisici in un unico grande disco logico: anche nel JBOD (come il RAID 0) la rottura di un disco rende inutilizzabile l'intero array di dischi, tuttavia in tal caso il recupero dei dati sarà più probabile rispetto al RAID 0 in quanto i dati sono scritti linearmente (non c'è interliving), per cui è come se fosse un unico hard disk con un numero di blocchi danneggiati pari alla dimensione del disco danneggiato.
ll sistema RAID 1 crea una copia esatta (mirroring) di tutti i dati su due o più dischi: tutti i dati vengono memorizzati (con tecnica identica a quella adottata da RAID 0) in al più la metà dei dischi disponibili e il contenuto di questi duplicato (backup in tempo reale) nell'altra metà (ogni fetta logica viene mappata in almeno due dischi differenti), offrendo quindi ridondanza (ogni disco ha almeno un disco gemello) ma non informazioni di parità. Si noti che (al contrario del RAID 0) l'affidabilità di un sistema RAID 1 è direttamente proporzionale al numero degli elementi gemelli (affidabilità media dei dischi / N dischi x G copie). I principali vantaggi sono l'aumento delle prestazioni in lettura (una richiesta in lettura viene servita dal disco che contiene il dato o dal suo gemello, a seconda di quale dei due richieda minor tempo di seek e latenza, oppure semplicemente dal disco al momento non occupato purchè il sistema abbia un tasso di letture molto superiore al tasso di scritture, altrimenti l'aumento delle prestazioni è marginale) e la facilità di recupero dei dati in presenza di guasti (basta accedere alla copia), viceversa i principali svantaggi sono la duplicazione delle operazioni di scrittura (ogni richiesta di scrittura su un disco deve coinvolgere anche il suo gemello e le prestazioni globali dipendono dall'unità più lenta) e il dimezzamento dello spazio logico effettivo (su N unità identiche, solo la capacità di N/2 di esse è effettivamente a disposizione, il resto serve alla ridondanza). Una pratica comune è di creare un mirror extra di un disco (detto anche BCV, Business Continuance Volume) che può essere diviso dal sistema RAID originario ed essere usato in maniera indipendente.
Il sistema RAID 2 è sostanzialmente un RAID 1 maggiormente affidabile, che adotta una divisione (striping) a livello di bit (invece che di blocco) e un codice di Hamming (che permette di correggere errori su singoli bit e di rilevare errori su bit multipli) per la correzione d'errore. Tutti i dischi sono sincronizzati dal controllore, in modo che la testina di ciascuno di essi sia nella stessa posizione in ogni istante, e ogni lettura e scrittura coinvolge sempre tutti i dischi (nel primo caso il controller si occupa di verificare la parità ed eventualmente correggere i bit errati, nel secondo di ricalcolarla e di aggiornarla). Si noti inoltre che i dischi supplementari (che qui memorizzano la parità, mentre in RAID 1 la copia esatta dei dati) richiesti non crescono in modo lineare bensì logaritmico. In sintesi, questo sistema si rivela molto efficiente in ambienti in cui si verificano numerosi errori di lettura o scrittura ma, data l'elevata affidabilità dei dischi, il RAID 2 offre una protezione eccessiva e non viene utilizzato.
Il sistema RAID 3 è simile al RAID 2 ma usa una divisione (striping) a livello di byte e un solo disco (indipendentemente dal numero di dischi dati utilizzato) dedicato alla parità (anzichè al codice di hamming). Nella pratica esso è estremamente raro, giacchè (suo principale svantaggio) non può eseguire richieste multiple simultaneamente: ogni singolo blocco dati ha la propria definizione diffusa tra tutti i dischi (anche stavolta sincronizzati) e risiederà in tutti i dischi nella stessa locazione, cosicchè ogni operazione di I/O richiede sempre di usare tutti i dischi (compreso quello di parità, da leggere e aggiornare). Per N dischi dati, il disco di parità contiene i bit di parità relativi a tutte le N-ple di bit dati in stretta corrispondenza posizionale (cioè, il primo bit di parità - per esempio - è quello relativo all'N-pla formata dai primi bit di ciascun disco dati), qui raggruppati in fette di dimensione analoga alle fette contenute nei singoli dischi (ovvero byte). Si osservi inoltre che i bit di parità servono non solo a verificare la correttezza dei dati ma anche al loro recupero, giacchè un bit illeggibile su uno qualunque dei dischi può essere ricalcolato semplicemente eseguendo una XOR di tutti i bit omologhi sugli altri dischi e su quello di parità: un intero disco danneggiato può essere rigenerato usando questa tecnica per ogni bit e trasferendone poi il contenuto su un nuovo disco; in temporanea assenza di un'unità di riserva, il sistema RAID consente anche di lavorare nella cosiddetta modalità ridotta (detta anche Interim Data Recovery Mode), in cui l'accesso al singolo bit di un'unità danneggiata viene simulato, in lettura eseguendo (in modo totalmente trasparente per l'utilizzatore) il recupero on fly (calcolando l'XOR sopra descritto) del bit e in scrittura modificando opportunamente il bit di parità (in modo congruo come se la modifica del bit inaccessibile avvenisse realmente, così da poterlo "ri-leggere" in un successivo recupero on fly
Il sistema RAID 4 è simile al RAID 3, ha sempre un disco dedicato alla parità e usa una divisione (striping) a livello di blocchi (invece che a livello di byte), ma ogni disco dell'array opera in maniera indipendente quando è richiesto un singolo blocco, ovvero non c'è sincronizzazione coatta dei dischi: il che rende questo sistema molto adatto ad applicazioni che richiedono alti tassi di richieste I/O ma meno adatti a quelle che richiedono alti tassi di trasferimento dati. Se il controller dei dischi lo consente il sistema può anche servire diverse richieste di lettura contemporaneamente. Per N dischi dati, il disco di parità contiene i bit di parità relativi a tutte le N-ple di bit dati in stretta corrispondenza posizionale (cioè, il primo bit di parità - per esempio - è quello relativo all'N-pla formata dai primi bit di ciascun disco dati), qui raggruppati in fette di dimensione analoga alle fette contenute nei singoli dischi (ovvero blocchi di byte). Si osservi inoltre che ogni qualvolta c'è una scrittura che modifichi una singola fetta in una specifica stripe, l'aggiornamento coinvolge non solo i dati ma anche la fetta di parità richiedendo un totale di 2 letture (lettura di dati e parità prima della modifica) e 2 scritture (scrittura di dati e parità dopo la modifica): per esempio con N=4 se la fetta numero 2 viene modificata nel bit i-esimo, si ha
X4(i) = X0(i) X1(i) X2(i) X3(i) prima della modifica
X4'(i) = X0(i) X1(i) X2'(i) X3(i) dopo la modifica
da cui, aggiungendo a destra due volte X2(i) si ottiene
X4'(i) = [X0(i) X1(i) X2(i) X3(i)] X2(i) X2'(i) = X4(i) X2(i) X2'(i)
e quindi per aggiornare dati e parità (X4'(i) e X2'(i), per un totale di due scritture) il controller avrà bisogno di conoscere dati e parità prima della modifica (X4(i) e X2(i), per un totale di due letture). Chiaramente, nel caso in cui la scrittura coinvolga tutte le fette in una specifica stripe, l'aggiornamento della stripe di parità avviene direttamente, senza accessi extra.
Il sistema RAID 5 è simile al RAID 4, ma distribuisce i dati di parità a rotazione tra tutti i dischi anzichè avere un disco di parità dedicato: il principale vantaggio è che, se due scritture coinvolgono singole fette di stripe diverse c'è una buona probabilità che le rispettive fette di parità si trovino in dischi diversi e quindi le operazioni possono essere eseguite in parallelo. Va detto che il blocco di parità non viene acceduto durante la lettura dei dati da disco (sarebbe un sovraccarico non necessario) ma solo quando la lettura di un settore dà un errore CRC: in questo caso l'uso del blocco di parità per il recupero dei dati danneggiati avviene on fly (come nei RAID 3 e 4) in maniera trasparente all'utilizzatore.
Degno di nota è anche il sistema RAID 6 (non presente tra gli originali livelli RAID), simile al RAID 5, che genera due fette di parità identiche distribuite su due dischi separati, scelti a rotazione tra tutti i dischi: è più ridondante del RAID-5, ma è molto inefficiente quando viene usato in un numero limitato di dischi.
Schema riepilogativo
RAID Ridondanza Parallelismo degli accessi Affidabilità
0 - R/W -
1 Mirroring R/W (W duplicate) copia di riserva
2 Hamming (1 bit) - (dischi sincronizzati) correzione errori
3 Parità (1 byte) - (dischi sincronizzati) IDRM
4 Parità (1 blocco) R/W (ma solo se nella stessa stripe) IDRM
5 Parità RR (1 blocco) R/W IDRM
6 Doppia Parità R/W IDRM (più ridondante)
Appunti su: |
|