






Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Libro di Michael Dahlin, Thomas Anderson tradotto in italiano (13 capitoli).
Tipologia: Appunti
1 / 12
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!







Professore (10/05/18)
La memoria principale perde il contenuto che ha nel momento in cui viene tolta l’elettricità. Per questo sono state inventate delle memorie di massa (rappresentate come cilindri poiché all’inizio erano tamburi). Tra i tamburi e i dischi c’è stato un periodo di transizione in cui si usavano i nastri magnetici. Queste memoria mantengono l’informazione anche quando viene spenta poiché ha delle superfici magnetizzate. I dischi verranno sostituiti dalle memoria flash.
Vedremo:
È un modo per organizzare e gestire dati in modo efficiente. Deve resistere alla mancanza di corrente elettrica, e di malfunzionamenti (quindi molto robusta). L’accesso avviene come la memoria principale in modo casuale e l’accesso avviene a blocchi chiamato blocco disco. Il blocco del disco e la pagina in memoria principale possono anche non essere della stessa dimensione, ma tipicamente lo è! La pagina quindi è un multiplo di un blocco. Hanno grandi capacità e costano abbastanza poco ma sono molto lenti. I blocchi del disco possono essere corrotti (o consumati), quindi man mano che si va avanti il disco tende a rallentare costringendoci a cambiare pc o più semplicemente hard disk.
File system
È un’illusionista. File system + hardware tende a mascherare gli eventuali malfunzionamenti. Il file system è organizzato in modo tale che se stessi facendo delle operazioni sul disco e queste non possono essere eseguiti fine in fondo perché accade qualcosa, il file system provvede a completare l’operazione richiesta. L’hardware identifica la loro posizione nel disco tramite delle informazioni, ma per noi sarebbe complicatissimo perché dovremmo capire il linguaggio binario. Quindi i dati sono memorizzati nelle coordinate , e gli vengono assegnati dei nomi (il mapping tra i nomi simbolici e la loro posizione nel disco è chiamato Naming ).
Per legare logicamente file inserisco i file all’interno di cartelle ( subdirectory ) , le cartelle possono essere contenute in altre cartelle chiamate directory.
I file system mi permette di indirizzare ogni singolo byte (anche se il disco li trasferisce a blocchi, e poi all’interno del blocco si prende il byte cercato).
File system: Formato da directory (che possono contenerne al suo interno altre); quest’ultima mappano il nome del file con i metadati del file. Ogni directory ha un nome, per accedere ad un file si usa un path , il quale è una stringa che identifica a partire dalla root directory fino al file cercato.
I link per arrivare ad un file possono essere:
Memorie di massa
Il disco ha tanti piatti (ognuno dei quali è magnetizzato da entrambe le parti). I dischi ruotano attorno ad un asse (spindle) , e vengono lette tramite un braccio nel quale vi è attaccata una testina. Ogni faccia ( superfice ) ha dei dischi concentrici chiamate tracce , le quali sono formati da settori.
Le tracce del disco sono grandi 1 micron. Non possono essere attaccate, quindi esistono regioni di guarda non magnetizzate, per separare le tracce.
Le tracce vengono organizzate in regioni.
Outer -> Inner tracce: Più mi avvicino verso l’interno meno dati posso salvare (quindi all’esterno ho più banda di trasferimento), ma leggere un’informazione è più veloce.
I settori sono tutti della stessa dimensione, e qui vengono memorizzati i dati (in modo robusto). I settori contengono codici correttori per poter salvare le informazioni in modo corretti.
La testina non legge solo una traccia ma un po’ più (perché è più grande della traccia), ma ho delle guardie (menzionate in precedenza) per capire dove sono.
Devo avere dei settori di riserva ( sector sparing ), poiché quando i settori si consumano, i dati vengono rimappati (possibilmente nella stessa faccia).
Se un file è sparpagliato completamente nel disco ( slip sparing ), si cerca di unire sequenzialmente tutti i settori rimappandoli.
Performance del disco:
-> buffer disco (54 / 128 MB/s) e dal buffer alla memoria principale (375 MB/s).
Nella figura mostrata qui sopra, si vede un disco Toshiba (2008).
Tempo totale 500 letture random. 10.5+4.5+0.0095 = 14.66 ms per richiesta. Quindi per 500 richiesta è di circa 14.66 * 500 = 7.33 secondi.
Scheduling Disco
Devo sfruttare la fisica del disco. Il tempo di rotazione è fisso (poiché non so mai qual è il settore da leggere), il tempo di trasferimento è sempre quello. Quindi si cerca di migliorare il tempo di seek.
Non uso l’ordine FIFO ma una tecnica chiamata:
Il settore 0 del disco reale n° 0 viene mappato nel disco virtuale nel settore 0, il settore 0 del disco reale n° 1 viene mappato nel disco virtuale nel settore 1, e così via per tutti i dischi reali, cosicché io possa leggere in parallelo.
I dischi raid sono 8 tipi e si differenziano per livello, in base alle loro funzionalità:
Raid livello 0: No ridondanza, ma maggiore parallelismo
L’informazione la divido in strisce e le metto su vari dischi.
Raid livello 1: Copia di backup dei vari blocchi nei vari dischi.
Raid livello 2: Ridondanza con codice correttore di errori, stripe bit-level.
Ogni singolo bit viene scritto nei vari dischi, e altri bit ridondanti (in altri dischi). In modo tale da poterli leggere in parallelo
L’informazione è divisa in bit, e salvata in strisce come nel raid di livello 0.
Raid livello 3: Ridondanza con parità, stripe bit-level( può essere byte-level)
Potrei usare un disco per il bit di parità, controllo un numero minore di errore, ma risparmio sull’hardware. Quindi ho una striscia di bit in vari dischi, e il bit di parità riferito a tale striscia è messa allo stesso livello della striscia di bit.
Raid livello 4: Ridondanza di parità
Distribuisco per ogni posizione del disco le strisce, per ogni striscia di strisce vi è un controllo di parità sui dischi a livello di strisce multiple.
Raid livello 5: Come il 4, ma le strip di parità sono distribuite in vari dischi.
Si ha un miglior bilanciamento del carico
Raid level 0 +1 : Divido i dischi in gruppi, e questi vengono replicati
Raid level 1 + 0: Divido il disco in gruppi, ma replico internamente al gruppo.
ES: Disco raid di livello 4 ( 5 dischi fisici da 0 a 4). Mappati modulo 4!
read(buffer,12,3) = legge i blocchi 12, 13, 14 mappati nel blocco 3 dei dischi fisici 0,1,2.
File system (Introduzione)
Per progettare il file system al meglio, devo sapere come sono i file (avvantaggio quelli piccoli o grandi?). La maggior parte dei file sono tipicamente piccoli e qualche file grande, quindi la maggior parte degli accessi sono a file piccoli; chi usa più byte di I/O è riferito dai file più grandi. I file li leggo e li scrivo sequenzialmente o in modo random? Dipende dal lavoro che devo eseguire! Nei file di tipo database li scrivo in modo random, per video o documenti viene fatto in modo sequenziale.
Premessa: Il disco è una memoria, molte delle problematiche viste per la memoria principale sono presenti anche nel disco (anche se utilizziamo tecniche di risoluzione diverse poiché l’hardware è diverso).
Capitolo 12
Dispositivi di memorizzazione
Sebbene i dispositivi di memorizzazione persistenti abbiano grandi capacità a basso costo, hanno performance drasticamente più basse rispetto alle memoria volatili DRAM.
Non solo quello, ma le caratteristiche sono differenti e sono peculiari per i dispositivi di memorizzazione. Per esempio, sebbene i programmi possono accendere a parole random della DRAM ottime performance, i programmi possono soltanto accedere ai dischi e dispositivi flash soltanto a centinaia o migliaia di byte alla volta. Inoltre, anche se un’applicazione restringe sé stessa per supportare una determinata dimensione (per esempio, 2kb per leggere o scrivere), se il pattern di accesso è random, le applicazioni risulterebbero molto più lente di un accesso sequenziale della stessa dimensione.
Per aggirare tali limitazioni e massimizzare la performance dei dispositivi di storage, sia la costruzione del sistema operativo che la scrittura delle applicazioni necessitano di capire le caratteristiche fisica di un dispositivo di storage persistente.
12.1 Magnet Disk
Il disco magnetico è un tecnologia di memorizzazione non volatile che è largamente usata nei laptop, pc fissi, e server. Le unità disco lavorano magneticamente memorizzando dati in film metallico legato ad un vetro, ceramica, o disco di alluminio che ruota rapidamente.
La figura soprastante schematizza un disco, indentificandone i componenti chiave. Ogni unità mantiene uno o più platter (piatti), cilindri fini realizzati con materiali magnetici. Ogni platter ha 2 surface (superfici), una per ogni lato. Quando un unità viene accesa, i platter ruotano continuamente attorno una spindle (perno) alimentato da un motore. Nel 2011, i dischi più comuni eseguivano dalle 70-250 rotazioni per secondo.
La head ( testa) del disco è componente che legge e scrive dati rilevando o introducendo un campo magnetico su una superficie. C’è soltanto una testa per superficie, e poiché come detto in precedenza la superfice ruota attorno ad un perno, la testa legge o scrive una sequenza di bit lungo un cerchio centrato nel perno. Mentre un piatto del disco ruota, crea un livello di aria circolare, e le testa del disco fluttua in quel livello, permettendo alla testa di essere estremamente vicina senza toccarla. Un head crash avviene quando la testa del disco si rompe con una forza sufficiente a danneggiare la superficie magnetica sottostante; tali crash sono causati da shock eccessivi come alzare di colpo il disco magnetico in funzione.
Per raggiungere l’intera superfice, ogni testa del disco è attaccata ad un arm (braccio), ogni braccio presente nel disco è attaccato ad un arm assembly, il quale a sua volta è collegato ad un motore il quale permette ai bracci di muoversi attraverso le superfici del piatto. Da notare che esiste un solo motore, quindi tutti i bracci si muovono insieme.
I dati sono memorizzati in sectors ( settori); tipicamente, i settori sono di 512 byte. Il disco hardware non può leggere o scrivere byte o parole individuali; invece, può sempre leggere o scrivere un intero settore. Questo significa che per cambiare un byte in un settore, il sistema operativo deve leggere il vecchio settore,
Il tempo di richiesta per una ricerca dipende da quanto è lontano il braccio dalla posizione desiderata.
Il caso ottimo (quindi il tempo minimo di ricerca = minimum seek time ) è il tempo che impiega il disco per muoversi da una traccia a quella successiva, e quest’ultima è quella richiesta. Il più piccolo tempo di seek, il disco semplicemente “posiziona– resettle ” la testa sulla nuova traccia aggiornando la posizione (target track number) in quella successiva nella circuiteria. Il minimo seek time oscilla tra gli 0.3 – 1.5 ms.
Se un disco sta leggendo l’n-esima traccia sulla superficie, il suo tempo di switch di superficie è il tempo che ci vorrebbe per leggere l’n-sima traccia su un’altra superficie. Le tracce possono essere più sottili di un micron quindi su differenti superfici possono essere non allineate. Così, un cambio di posizione tra la stessa traccia su differenti superfici ha un costo simile a un minimum seek: il disco inizia usando il sensore su una differente testa e dopo si muove finché quest’ultima non si trova sulla traccia corretta.
Il caso pessimo ( quindi il tempo massimo che si impiega in una ricerca = maximum seek time ) si verifica quando la testa deve spostarsi da un estremo all’altro. La tempista può essere sopra i 20 ms.
Il caso medio ( tempo medio = average seek time ) è la media tra le ricerche tra ogni possibile coppia di tracce su un disco. Questo valore è spesso approssimato come il tempo per ricercare un terzo delle tracce sul disco.
Una volta che il disco si è stabilito sulla nuova traccia, molti dischi immediatamente iniziano a leggere i settori nel loro buffer, ovviamente i soli settori che sono stati richiesti. In questo modo, se c’è una richiesta per uno dei settori che è già stata passata sotto la testa del disco, i dati possono essere trasferiti immediatamente, piuttosto che dover ritardare la richiesta di quasi una rotazione completa per rileggere i dati.
Per ammortizzare il tempo di seek e di rotazione, le richieste del disco sono molto spesso settori consecutivi. Il tempo per trasferire uno o più settore sequenziali da ( o verso ) una superfice una volta che il disco ha iniziato a leggere ( o scrivere) viene definito surface transfer time.
Su un disco moderno, il tempo di trasferimento da (o verso) una superfice per un singolo settore è molto più piccolo rispetto ad un seek time o rotation latency. Per esempio, la banda del disco spesso eccede 100 MB/s, quindi il tempo di trasferimento per un settore di 512 byte è di circa 5 microsecondi (0.005 ms).
Poiché le tracce esterne del disco hanno più spazio rispetto a quelle interne e poiché il disco ruota ad una velocità costante, la banda di trasferimento di una superfice è spesso più alta per i settori esterni che per quelli interni.
Per una lettura disco, una volta che i settori sono stati trasferiti dal buffer alla memoria, devono essere trasferiti dalla memoria dell’host su qualche connessione SATA, SAS, Fibra, o USB. per le scrittura, il trasferimento va nell’altra direzione. Il tempo di trasferimento dalla memoria dell’host al buffer del disco è chiamato host transfer time. Tipicamente il range per la banda è di 60 MB/s per le USB 2.0 a 2500 MB/s per la Fibra 20GFC.
Per le letture multiple di settori, la pipeline del disco trasferisce tra la superficie e il buffer del disco e dal buffer verso la memoria dell’host; quindi per trasferimenti grandi, il tempo totale di trasferimento sarà dominato da qualsiasi di questi è il collo di bottiglia. Similmente, per le scrittura,
il disco parte dall’host, esegue un seek, una rotazione, una trasferimento sulla superficie; di nuovo, il tempo totale di trasferimento sarà dominato da qualsiasi di questo è il collo di bottiglia.
12.1.2 Caso di studio Toshiba MK3254GSY
La figura sottostante mostra alcuni parametri chiave per un recente disco da 2.5 pollici per un laptop.
Random vs. Sequenziale performance. Dato che il tempo di seek e di rotazione è misurato in millisecondi, piccoli accessi random nel disco sono molto più piccoli rispetto a quelli grandi, accessi sequenziali.
Workload ad accesso random. Per la descrizione del disco nella figura soprastante, consideriamo un workload con 500 richieste, ognuna di questa in modo random sceglie un settore nel disco, assumiamo che queste vengano servite in ordine FIFO. Quando tempo servirà a soddisfare a tali richieste?
Tempo = Accesso al disco è il seek time + rotation time + transfer time
Seek time. Ogni richiesta richiede una ricerca da una traccia di inizio random ad una traccia di fine random, quindi il costo medio per una ricerca di 10.5 ms è un buon tempo per il seek time.
Rotation time. Una volta che la testa del disco è posizionata sulla traccia corretta, deve aspettare che ruoti fin quando non si trova sotto il settore desiderato. Poiché non c’è motivo di credere che il settore sia vicino o lontano a quello attuale sotto la testa, una ragionevole stima è di circa 4.5 ms (la metà di 7200 RPM).
Transfer time. La banda di trasferimento dalla superficie è almeno 54 MB/s quindi per trasferire 512 byte ci vogliono circa 0.0095 ms (9.5 micro secondi).
Tempo totale. 10.5+4.5+0.0095 = 14.66 ms per richiesta. Quindi per 500 richiesta è di circa 14.66 * 500 = 7.33 secondi.
Workload ad accesso sequenziale. Per il disco menzionato in precedenza, consideriamo un workload di 500 richieste di settori sequenziali nella stessa traccia. Quando tempo ci vorrà per eseguire tale richieste?
Tempo = Accesso al disco è il seek time + rotation time + transfer time
Seek time. Siccome non sappiamo in quale traccia siamo all’inizio delle richieste, considereremo il tempo medio di seek che è di 10.5 ms.
Rotation time. Poiché non sappiamo in che posizione sia la testa all’interno di una traccia considereremo la metà di una rotazione completa quindi circa 4.15 ms.
Transfer time. Il tempo di trasferimento dipende da quanto ci impiega il tempo di trasferimento dal disco al buffer, quindi considereremo o 4.8 o 2 ms poiché non sappiamo se ci troviamo all’interno o all’esterno su di una superficie.
FIFO. La più semplice cosa da fare è gestire le richieste in ordine di arrivo. Sfortunatamente, uno scheduler del disco può comportare performance degradanti. Per esempio, una sequenza di richieste che alterna tra tracce esterne e interne comporta un seek molto alto.
SPTF/SSTF. Un opzione inizialmente allettante è usare uno scheduler greedy che, dato la posizione corrente della testa del disco e il piatto, serve sempre le richieste pendenti che possono essere gestite col minor tempo. Questo approccio è chiamato shortest positiong time first (SPTF) ( o shortest seek time first) SSTF se il posizionamento rotazionale non è considerato).
SPTF E SSTF hanno due significative limitazioni. Per prima cosa, poiché nel perdere tempo per muovere il braccio del disco e nell’aspettare le varie rotazioni influenza il costo per servire le richieste, questi approcci greedy non garantiscono l’ottimizzazione delle performance del disco. In secondo, possono causare starvation quando, per esempio, un continuo stream di richieste per tracce interne previene richieste per le tracce esterne prima che queste vengano lette.
SPTF non è ottimale. Supponiamo che la testa del disco è all’interno della traccia in mezzo al disco così cercare una traccia interna costerà circa 9.9 ms mentre una esterna costerà circa 10.1 ms. Assumiamo che per il disco in questione, la ricerca tra una traccia interna ad esterna costi 15 ms e che il tempo di rotazione costi 10 ms.
Supponiamo anche che il disco ha due insiemi di richieste pendenti. Il primo set ha 1000 richieste di lettura ognuna di 1000 settori su una traccia interna al disco; il secondo ha 2000 richieste di lettura ognuna di 2000 settori su una traccia esterna del disco.
Compariamo il tempo medio di risposta per SPTF (quindi prima vengono servite le tracce interne e poi quelle esterne) e viceversa.
La quantità di tempo presa per completare tutte le richieste è relativamente corta se leggessimo le tracce da quella più interna a quella più esterna. Quindi, il tempo medio per servire tale richiesta è minore se leggessimo le tracce dalla più interna a quella più esterna.
Per servire entrambi gli insiemi di richieste, il disco deve ricerca la traccia appropriata e aspettare per una rotazione completa finché tutte i dati di una traccia non siano passati sotto il braccio. Per entrambi gli insiemi, il tempo medio di risposta per una richiesta in un insieme sarà ritardato finché non viene completata la ricerca di una traccia più metà giro del disco. Da notare che la gestione del secondo insieme è in pausa fin quando la prima non viene eseguita completamente, aggiungendo quindi ulteriore ritardo per il tempo di completamento.
Se usassimo SPTF e leggiamo i settori dalle tracce più interne, il tempo medio di risposta per una richiesta è la media ponderata per le richieste delle tracce interne e quelle esterne:
(1000 * (9.9 + 5) + 2000(9.9 + 10 + 15+ 5 )) / 3000 = 31.6 ms
Se invece leggessimo dalle tracce più esterne a quelle interne, il tempo medio di risposta sarebbe di:
(2000 * ( 10.1 + 5) + 1000 ( 10.1 + 10 + 15 + 5)) / 3000 = 23.3 ms
In questo caso, la ricerca per il settore più vicino muove la testa del disco lontano dalla maggior parte delle richiesta, incrementando il tempo di risposta medio di 8.3 ms.
Elevator, SCAN, e CSCAN. SCAN e CSCAN hanno ottime performance e assicurano pure un’equità in cui nessuna richiesta deve aspettare per un tempo lungo. L’approccio base è simile a come funziona un ascensore (elevator): quando un ascensore sta andando su, questo lo fa finché tutte le richieste pendenti per andare al piano sopra non sono soddisfatte; lo stesso accade se si sta scendendo giù.
Lo scheduling SCAN lavora allo stesso modo. Il braccio del disco prima va dalle tracce più interne a quelle esterne, servendo tutte le richieste che vi sono in mezzo. Poi, fa il viceversa. Questo processo si ripete.
Lo scheduling CSCAN ( SCAN circolare) è una piccola variazione su SCAN nel quale il disco serve le richieste senza mai spostare la testa. Quando l’ultima richiesta nella direzione in cui si stava muovendo il braccio è soddisfatta, il disco immediatamente ricerca da dove deve partire ( per esempio, la traccia più interna o la più esterna con una richiesta pendente) e serve le richieste pendenti muovendo la testa nella stessa direzione come nel passaggio iniziale.
Il vantaggio di CSCAN su SCAN è che se dopo un passaggio in una direzione, la testina del disco dovesse semplicemente cambiare direzione, incontrerà una regione del disco in cui le richieste in sospeso sono scarse (dal momento che questa regione del disco è stata appena revisionata). Ricercare nella parte opposta del disco ( come in CSCAN) muove la testa del disco in un area dove le richieste pendenti sono probabilmente più dense. In aggiunta, CSCAN è molto più fair di SCAN in quanto la ricerca sul lato opposto del disco consente di iniziare a soddisfare le richieste che probabilmente attendevano più a lungo delle richieste vicine, ma "appena dietro" la testa.
Piuttosto che una pura seek-minimizing SCAN o CSCAN, gli scheduler prendono anche in considerazione il tempo di rotazione e permettono piccole ricerca “ nella direzione sbagliata” per evitare che rotazioni extra ritardino usando delle variazioni chiamate “rotationally-aware” R-SCAN o R- CSCAN. Per esempio, se la testa del disco è posizionato nel settore 0 delle traccia 0 e ci sono richieste pendenti del settore 1000 della traccia 0, settore 500 della traccia 1, e settore 0 della traccia 10000, uno scheduler R-CSCAN per prima servirà la seconda richiesta, poi la prima e infine la terza.
La figura soprastante mostra tutte le tecniche descritte in precedenza.
Effetti del disk scheduling. Per il disco descritto nel corso di questo capitolo, consideriamo un workload di 500 richieste di lettura, ognuna delle quali randomicamente sceglie un settore nel disco, assumendo che la testa del disco è su una traccia esterna e le richieste vengono servite in CSCAN (dall’esterno all’interno). Quanto tempo servirà per servire tali richieste?
La risposta a questa domande ha tante ipotesi plausibili; differenti persone potrebbero proporre differenti e ragionevoli stime.
Seek time. Per primo notiamo che 500 richieste pendenti si propagano randomicamente nel disco, il tempo medio di seek da una richiesta ad una successiva ricercherà lo 0.2% nel disco. Con 4 superfici, molti di queste ricerche richiedono un head switch. Non conosciamo il tempo esatto per un ricerca del 0.2% del disco, ma possiamo stimarla interpolando il tempo per una ricerca di 1 traccia (1 ms) e il tempo per un 33.3% di seek (10.5 ms per le letture).
stimato 0.2% seek time = ( 1 + 0.2/33.3 * 10.5) ms = 1.06 ms
Rotation time. Siccome non sappiamo dove sia la posizione del disco quando la ricerca della traccia ha terminato e siccome i settori sono scelti in modo random, una semplice e ragionevole stima per il tempo di rotazione della testa del disco è di 4.15 ms, la metà del tempo che impiega il disco per fare una rotazione completa.
Tempo di trasferimento. Similmente al caso di studio Toshiba MK3254GSY, il tempo di trasferimento per ogni settore è al più 0.0095 ms.
Tempo totale. 1.06 + 4.15 + 0.0095 = 5.22 ms per richiesta, quindi per 500 richieste ci vorranno circa 2.6s. Da notare che con l’esempio del caso di studio menzionato precedentemente, il tempo totale è più piccolo rispetto a servire le richieste in ordine FIFO.
12.2 Memorie flash
Nell’ultimo decennio, le memorie flash sono largamente usate per uno storage di medie dimensioni. Le memoria flash sono la tecnologia più dominate per i palmari, per le fotocamere dei telefoni etc.., ed è usata in una frazione sempre più maggiore nei computer laptop e server.