c4. memoria secondaria
Transcript
c4. memoria secondaria
C4. MEMORIA SECONDARIA Nel seguito verranno analizzati, oltre alla struttura dei dispositivi di memorizzazione, anche gli algoritmi di scheduling delle unità a disco, la formattazione dei dischi, la gestione dei blocchi d’avviamento e l’area di avvicendamento dei processi. Struttura dei dispositivi di memorizzazione Dischi magnetici I dischi magnetici sono il mezzo fondamentale di memoria secondaria dei moderni sistemi di calcolo. La struttura interna è riportata in figura: l’informazione è memorizzata su piatti di forma piana e rotonda, ricoperti di materiale ferromagnetico. Sulla superficie di ciascuno di essi è sospesa una testina di lettura e scrittura, attaccate al braccio del disco che le muove in blocco. Un piatto è logicamente diviso in tracce circolari, a loro volta suddivise in settori. L’insieme delle tracce corrispondenti a una certa posizione del braccio costituisce un cilindro. Dovrebbe essere dunque chiaro che le tracce periferiche sono più lunghe delle tracce centrali: sarebbe dunque possibile fare tracce a densità variabile, ma questa soluzione implicherebbe la progettazione di testine tecnologicamente all’avanguardia. Durante il suo funzionamento, un disco ruota a circa 10000 rotazioni per minuto. La sua efficienza è misurata da due valori: • velocità di trasferimento, cioè la velocità con cui i dati fluiscono dal disco al calcolatore • tempo di posizionamento o tempo di accesso (diretto), cioè la somma del ◦ tempo per spostare il braccio sul cilindro desiderato (seek time) ◦ tempo affinché il settore si porti sotto la testina (latenza di rotazione) Siccome le testine sono sospese su un cuscino d’aria, c’è il rischio che la testina urti la superficie del disco. Questa situazione è nota come crollo della testina e comporta la sostituzione dell’intera unità disco. Un’unità disco è connessa a un calcolatore attraverso un insieme di fili, detto bus di I/O: esistono diversi tipi di tale bus, tra cui EIDE, ATA, Serial ATA, USB, ecc. Il trasferimento dei dati in un bus è eseguito da speciali unità di elaborazione, dette controllori. Gli adattatori sono i controllori posti all’estremità relativa al calcolatore, mentre i controllori dei dischi sono incorporati in ciascuna unità disco. L’esecuzione di operazioni di I/O è possibile mediante scrittura di appositi comandi nell’adattatore, generalmente mediante porte di I/O mappate in memoria. Solid state I dischi a stato solido sono basati su transistor e il funzionamento è una “via di mezzo” tra quello delle ROM e quello delle RAM. Sono più affidabili perché non sono basati su rotazione, ma possono durare di meno per “invecchiamento”: ogni bit ha infatti un numero limitato di riscritture. Solitamente la capacità è minore di un disco magnetico, ma la velocità è molto più alta. Nastri magnetici I nastri magnetici, pur potendo memorizzare un’enorme quantità di dati, sono caratterizzati da un tempo d’accesso molto elevato. Questo perché il tempo di accesso diretto, essendo basato su ricerca sequenziale, è migliaia di volte maggiore di quello dei dischi magnetici. Struttura dei dischi I moderni dischi sono considerati come grandi array monodimensionali di blocchi logici. Un blocco logico è la minima unità di trasferimento ed è solitamente grande 512 B, sebbene alcuni dischi si possano formattare a basso livello per ottenere una diversa dimensione dei blocchi logici. L’array monodimensionale dei blocchi logici corrisponde in modo sequenziale ai settori del disco: il settore 0 è il primo settore della prima traccia sul cilindro più esterno, e così via di cilindro in cilindro dall’esterno verso l’interno. Con questa corrispondenza sarebbe possibile trasformare il numero di un blocco logico in un corrispondente indirizzo fisico di “vecchio tipo”, ma in pratica l’operazione è difficile perché i settori difettosi sono sostituiti con altri settori sparsi in giro per il disco e in alcune unità il numero di settori per traccia non è costante. Connessione dei dischi I calcolatori accedono alla memoria secondaria in due modi: il più comune è attraverso le porte di I/O (memoria secondaria connessa alla macchina), ma esiste anche la possibilità di un collegamento remoto per mezzo di un file system distribuito (memoria secondaria connessa alla rete). Memoria secondaria connessa alla macchina Quando la memoria secondaria è connessa alla macchina, l’accesso è fatto con le porte locali di I/O. I comuni PC impiegano architetture IDE o ATA per il bus, mentre le stazioni di lavoro di fascia alta ricorrono ad architetture più raffinate, come SCSI o FC. SCSI, in particolare, consente di avere sul bus fino a 16 dispositivi e consente di accedere fino a 8 unità logiche (vedi RAID). FC, invece, è alla base delle reti di memoria secondaria. Memoria secondaria connessa alla rete Un dispositivo di memoria secondaria connesso alla rete è uno speciale sistema di memoria al quale si accede in modo remoto per mezzo di una rete di trasmissione dati. Le chiamate di procedura remota sono realizzate per mezzo dei protocolli TCP/IP: il più recente protocollo di gestione è iSCSI, che sfrutta IP per veicolare comandi SCSI. Un sistema di questo genere tende a essere meno efficiente e con prestazioni inferiori rispetto a sistemi che prevedono la connessione diretta alla memoria secondaria. Reti di memoria secondaria Siccome i sistemi di memoria secondaria impegnano banda della rete – aumentandone la latenza – sono state proposte soluzioni basate su reti di memoria secondaria (storage area network, SAN) tra i server e le unità di memoria secondarie, separate dalla LAN/WAN. Impiega protocolli specifici ed è per questo più “difficile” (e più costosa). Scheduling del disco Il sistema operativo ha la responsabilità di utilizzare le risorse fisiche in maniera efficiente. Nel caso delle unità a disco, questa responsabilità si declina nella garanzia di tempi di accesso contenuti e ampiezze di banda elevate. Per mezzo della gestione dell’ordine delle richieste di I/O – il criterio cronologico non è garantito ottimale – contenute nella coda del disco di un sistema multiprogrammato (sistema operativo / processi di sistema / processi utente) è possibile ottimizzare questi parametri. Ogni richiesta contiene diverse informazioni: • l’operazione è di immissione o emissione dati? • qual è l’indirizzo coinvolto del disco? • qual è l’indirizzo coinvolto della memoria? • quanti byte devo trasferire? Scheduling in ordine di arrivo La forma di scheduling più semplice è quella secondo l’ordine di arrivo (FCFS, FIFO). Algoritmo equo, ma non garantisce la massima velocità del servizio. Supponendo che la coda di richieste coinvolga blocchi sui cilindri 98, 183, 37, 122, 14, 124, 65 e 67 e che la testina sia inizialmente sul cilindro 53 si ha una sequenza del genere Come si può notare, il salto da 122 a 14 e da 14 a 124 non è il massimo dell’efficienza. Scheduling per brevità Nell’algoritmo di servizio secondo il più breve tempo di ricerca (shortest seek time first, SSTF) si sceglie ogni volta la richiesta che dà il minimo tempo di ricerca rispetto alla posizione corrente della testina. Supponendo che la coda di richieste coinvolga blocchi sui cilindri 98, 183, 37, 122, 14, 124, 65 e 67 e che la testina sia inizialmente sul cilindro 53, si parte dal cilindro 65 perché è il più vicino (in valore assoluto) al 53, e così via. Costituisce un miglioramento notevole rispetto all’algoritmo FCFS, ma non è una strategia ottima perché – come nell’esempio – si va avanti, indietro e poi nuovamente avanti (anche se a intervalli più regolari). Scheduling per scansione Con lo scheduling per scansione basato sull’algoritmo SCAN, il braccio dell’unità a disco parte da un punto e si sposta verso un estremo, per poi invertire la marcia e giungere all’estremo opposto. E’ anche detto algoritmo dell’ascensore perché il braccio serve prima tutte le richieste in salita e poi quelle in discesa. Supponendo che la coda di richieste coinvolga blocchi sui cilindri 98, 183, 37, 122, 14, 124, 65 e 67 e che la testina sia inizialmente sul cilindro 53, si decide di andare verso il cilindro 0 e si servono prima le richieste per i cilindri 37 e 14 per poi invertire il senso di marcia e servire tutti gli altri a partire dal cilindro 67 fino al 183. Se arriva una nuova richiesta per uno dei cilindri posto davanti alla testina verrà soddisfatta immediatamente. Se invece la richiesta è per un cilindro già superato, bisognerà attendere l’inversione della direzione del moto. Per questo, il tempo di attesa è molto variabile. Scheduling per scansione circolare L’algoritmo scan circolare, o C-SCAN, garantisce un tempo di attesa meno variabile. Quando la testina giunge a un estremo del disco, ritorna all’altro senza servire richieste nel “viaggio”. Il disco è quindi trattato come se fosse una lista circolare, dove il primo e l’ultimo segmento sono adiacenti. Supponendo che la coda di richieste coinvolga blocchi sui cilindri 98, 183, 37, 122, 14, 124, 65 e 67 e che la testina sia inizialmente sul cilindro 53, si decide di andare verso il cilindro 199 e si servono le richieste per i cilindri 65, 67, 98, …, 183 prima di tornare al cilindro 0 e servire le richieste per i cilindri 14 e 37. Scheduling LOOK Sia SCAN che C-SCAN tornano a un estremo del disco. Nella pratica, però, si interrompe il viaggio non appena non ci sono più richieste da servire in quella direzione. Queste particolari versione di SCAN e C-SCAN sono dette LOOK e C-LOOK. Nell’esempio è riportato uno scheduling C-LOCK. Scelta di un algoritmo di scheduling Nella scelta dell’algoritmo di scheduling bisogna tenere conto di diversi fattori, tra cui la posizione delle directory e dei blocchi indice: se un elemento directory risiede nel primo cilindro e i dati del file nell’ultimo, la testina deve percorrere l’intera superficie del disco. Questa e altre complicanze portano ad affermare che sarebbe meglio che l’algoritmo di scheduling del disco costituisca un modulo a sé stante del sistema operativo, in modo da essere sostituito quando necessario. E’ ragionevole scegliere SSTF o LOOK come algoritmo di partenza e, se ci si accorge di avere carichi elevati, passare a SCAN o CSCAN. Gestione dell’unità a disco Come vengono piazzate le informazioni sul disco? Formattazione del disco Prima che sia possibile la memorizzazione dei dati, un disco dev’essere diviso in settori leggibili o scrivibili dal controllore. Questo processo è definito formattazione a basso livello e riempie il disco con una speciale struttura dati per ogni settore, consistente di • un’intestazione • un’area dati, solitamente di 512 B • una coda Intestazione e coda contengono informazioni usate dal controllore del disco, come il numero di settore e un codice per la correzione degli errori che contiene sufficienti informazioni affinché il controllore possa ripristinare il corretto valore dei bit. Per usare un disco come contenitore di informazioni, il sistema operativo deve registrare le proprie strutture dati nel disco. Questo processo è fatto in due passi: 1. partizionamento, che suddivide il disco in uno o più gruppi di cilindri in modo che il sistema operativo possa trattare ogni gruppo come se fosse un’unità disco a sé stante 2. formattazione logica, che crea un file system Molti file system accorpano i blocchi in gruppi, detti cluster. L’I/O del disco continua a procedere per blocchi, ma – siccome dopo aver letto il blocco 5 è ragionevole supporre che vengano letti i blocchi successivi – quello del sistema operativo è per cluster in modo che l’I/O mutui più caratteristiche dell’accesso sequenziale. Alcuni sistemi operativi danno l’opportunità a certi programmi speciali di impiegare una partizione del disco come un grande array sequenziale di blocchi logici, senza alcuna struttura dati relativa al file system. Questa partizione è trattata come un disco a basso livello (raw disk). Blocco di avviamento La memorizzazione del programma di avviamento può essere fatta utilizzando una memoria ROM. Questo sistema presenta alcuni inconvenienti, uno su tutti il dover sostituire la ROM se si vuole cambiare il programma. Molti sistemi memorizzano nella ROM solo un caricatore d’avviamento (bootstrap loader), il cui solo compito è quello di caricare da disco il programma di avviamento completo. Windows 2000, ad esempio, colloca il proprio codice di avviamento nel primo settore del disco rigido denominato Master Boot Record MBR. Gestione dell’area di avvicendamento Gestire l’area di avvicendamento è un compito di basso livello del sistema operativo. La memoria virtuale usa lo spazio dei dischi come estensione della memoria centrale: siccome l’accesso ai dischi è più lento, le prestazioni del sistema ne risentono a meno di non progettare tutto a regola d’arte. Alcune scelte intelligenti prevedono il sovradimensionamento dell’area di avvicendamento, evitando di utilizzare un grande file all’interno del file system (semplice ma inef- ficiente) ma preferendo un’apposita partizione del disco non formattata. Proprio perché ci può non essere il supporto da parte del file system, ogni area di avvicendamento ha una sua mappa di avvicendamento associata, che è un array di contatori, ciascuno dei quali corrispondente a uno slot nell’area di avvicendamento. Se un contatore segna il valore 0, la pagina che gli corrisponde è disponibile. Valori superiori a 0 indicano il numero di processi a cui è associata la pagina. Strutture RAID RAID è l’acronimo di Redundant Array of Independent (Inexpensive) Disks, e si pone lo scopo di affrontare i problemi di prestazioni e affidabilità sulla memoria secondaria. Miglioramento dell’affidabilità tramite la ridondanza Il metodo più semplice per aumentare l’affidabilità è la copiatura speculare (mirroring, shadowing): ogni disco logico è composto da due dischi fisici e le scritture si effettuano su entrambi i dischi, in modo da poter leggere i dati dall’altro disco in caso di guasto. I dati vengono persi solo se entrambi i dischi si guastano, ma supponendo che i guasti siano indipendenti tra i dischi – anche se nella realtà non è proprio così – la probabilità che il secondo disco si guasti prima della sostituzione del primo è molto bassa. Miglioramento dell’affidabilità tramite il parallelismo Attraverso l’uso di più dischi è inoltre possibile migliorare la capacità di trasferimento distribuendo i dati in sezioni su più dischi. Questa distribuzione, chiamata sezionamento dei dati (data striping), consiste nel distribuire i bit di ciascun byte oppure i blocchi di ciascun file su più dischi. Livelli RAID Livello Descrizione Rappresentazione RAID 0 Sezionamento senza ridondanza. RAID 1 Copiatura speculare. RAID 2 Codici per la correzione degli errori. RAID 3 Bit di parità intercalati. Riduco quantità di informazione per la correzione degli errori. RAID 4 Blocchi di parità intercalati. RAID 5 Organizzazione con blocchi intercalati a parità distribuita. RAID 6 Schema di ridondanza P + Q. Nei livelli RAID 5 e RAID 6 ogni disco contiene informazioni “utili” più ridondanza. Sono poi possibili varianti che combinano striping e mirroring secondo diverse strategie. ***