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.
***