Struttura dei dischi Il file system può essere considerato come costituito da tre parti. L’interfaccia verso l’utente e il programmatore, le strutture dati e gli algoritmi del sistema operativo per implementare queste interfacce, e infine le strutture di memoria secondaria. Per i computer attuali, i dischi rappresentano la forma principale di archiviazione secondaria; oggi i nastri vengono usati principalmente per le operazioni di backup. I dischi rigidi sono indirizzati come grandi array monodimensionali di blocchi logici , dove il blocco logico è la più piccola unità di dati trasferibile in lettura o scrittura. La dimensione di un blocco logico è di solito di 512 byte, sebbene alcuni dischi possano essere configurati a basso livello per consentire una diversa dimensione di blocco logico, ad esempio 1024 byte o più. L’array monodimensionale di blocchi logici viene mappato nei settori del disco in modo sequenziale. Il settore 0 è il primo settore della prima traccia sul cilindro più esterno. La mappatura procede nell’ordine lungo quella traccia, poi sul resto delle traccie in quel cilindro e infine sul resto dei cilindri dal più esterno al più interno. Con il progresso della tecnologia il numero di settori per traccia è andato aumentando, e oggi le zone esterne di un disco hanno in genere centinaia di settori per traccia. I dischi posono avere decine di migliaia di cilindri. Schedulazione degli accessi ad disco Una delle responsabilità del sistema operativo è di usare l’hardware in modo efficiente. Per le unità a disco ciò si traduce nella necessità di avere un rapido tempo di accesso e una buona larghezza di banda. Il tempo di accesso ha due componenti principali: il tempo di ricerca (seek time) e il tempo che impiega il braccio del disco a muovere le testine fino al cilindro contenente il settore desiderato: la latenza di rotazione è il tempo aggiuntivo speso in attesa che il disco faccia ruotare il settore desiderato fino alla testina di lettura. La larghezza di banda (bandwith) del disco è data dal numero totale di byte trasferiti diviso per il tempo totale che intercorre tra la richiesta di servizio e il completamento dell’ultimo trasferimento. E’ possibile migliorare sia il tempo di accesso sia la larghezza di banda programmando opportunamente l’ordine delle azioni di risposta alle richieste di I/O su disco. Ogni volta che un processo richiede una operazione di I/O verso o dal disco, effettua una chiamata al sistema operativo che indica: Se l’operazione è di ingresso o di uscita L’indirizzo nel disco richiesto per il trasferimento L’indirizzo di memoria centrale per il trasferimento Il numero di byte da trasferire Se l’unità a disco e il controller sono disponibili, la richiesta può essere espletata immediatamente, altrimenti viene posta nella coda delle richieste pendenti per quell’unità. Schedulazione FCFS La forma più semplice di schedulazione di disco è ovviamente l’algoritmo “primo arrivato primo servito (First Come First Served) . Questo algoritmo è equo, ma generalmente non offre il servizio più veloce. Consideriamo ad esempio una coda del disco con richieste di I/O ai blocchi sui cilindri 98,183,37,122,14,124,65,67 Struttura dei dischi pag. 1 di 5 Se la testina è inizialmente al cilindro 53, si muoverà prima dal 53 al 98 e così via per un movimento totale di 640 cilindri. 0 14 37 53 65 67 98 122 124 183 Schedulazione con l’algoritmo FCFS Schedulazione SSTF Sembra ragionevole servire tutte le richieste vicine alla posizione corrente della testina prima di spostare lontano la testina per servirne altre. Questa assunzione è la base per l’algoritmo “prima il più breve tempo di ricerca” (Shortest-Seek-Time-First). Con l’esempio di prima questo metodo provoca un movimento totale di solo 236 cilindri Struttura dei dischi pag. 2 di 5 0 14 37 53 65 67 98 122 124 183 Schedulazione con l’algoritmo SSTF La schedulazione SSTF può causare la starvation di alcune richieste. Supponiamo di avere due richieste accodate per i cilindri 14 e 186 e che, mentre stiamo ervendo la richiesta per il 14, arrivi una nuova richiesta vicino al cilindro 14. Questa nuova richiesta sarà la successiva a essere servita facendo aspettare la richiesta al cilindro 186. Mentre questa richiesta viene servita, potrebbe arrivare un’altra richiesta vicino al 14. In teoria, potrebbe arrivare un flusso continuo di richieste una vicina all’altra, causando un’attesa indefinita per la richiesta al cilindro 186. Amministrazione del disco Configurazione Prima che un disco magnetico possa memorizzare i dati deve essere diviso in settori (tipicamente 512 byte di dati) che il controller del disco può leggere e scrivere. Questa formattazione a basso livello o formattazione fisica avviene normalmente in fabbrica come parte del processo di produzione. Per memorizzare i file su disco, il sistema operativo ha bisogno di registrare su disco le proprie strutture dati; ciò viene fatto in due passi. Il primo passo consiste nel partizionare il disco in uno o più gruppi di cilindri. Il sistema operativo può trattare ogni partizione come se fosse un disco separato. Il secondo passo e la formattazione logica , che provvede alla creazione di un file system; In questa fase il sistema operativo immagazzina sul disco le strutture dati iniziali del file system(ad esempio una FAT16, FA32, o gli inode) e una directory inizialmente vuota. (cluster composti da più settori) Il blocco di avvio Affinché un calcolatore cominci a funzionare, ad esempio quando viene acceso o riavviato, deve avere un programma iniziale da eseguire. Questo programma di inizializzazione (bootstrap) è Struttura dei dischi pag. 3 di 5 usualmente semplice. Esso inizializza tutte le funzioni del sistema per poi avviare il sistema operativo. Nella maggior parte dei computer, il bootstrap è immagazzinato in una porzione di memoria centrale a sola lettura (Read Only Memory ROM). E’ una posizione conveniente perché la ROM non è volatile (non perde le informazioni a computer spento) ed essendo a sola lettura non può venire infettata da virus informatici. Il problema è che sarebbe problematico modificare questo codice di bootstrap. Per questo motivo, la maggior parte dei sistemi memorizza un piccolo programma caricatore nella ROM di avvio del sistema, il cui unico compito è di prendere un programma di avvio completo dal disco. Il programma di avvio completo può essere facilmente modificato: una nuova versione viene semplicemente scritta su disco. Il programma di bootstrap completo è immagazzinato in una partizione di avvio situata in una posizione fissa su disco ( i blocchi di boot). Un disco che ha una partizione per il caricamento del sistema è denominato disco di boot o di sistema. Il programma di avvio completo è più sofisticato del caricatore posto nella ROM di avvio; può caricare l’intero sistema operativo. MS-DOS usa un blocco di 512 byte per il proprio programma di caricamento del sistema. settore 0 blocco di avvio settore 1 FAT directory radice blocchi di dati sottodirectory Struttura dei dischi pag. 4 di 5 La struttura RAID Le unità a disco hanno continuato a diventare sempre più piccole e meno costose, al punto che ora è economicamente fattibile collegare un gran numero di dischi a un computer. Avere tanti dischi in un sistema offre l’opportunità di migliorare la velocità alla quale i dati possono essere letti o scritti, se i dischi funzionano in parallelo. Inoltre questa configurazione offre la possibilità per migliorare l’affidabilità di archiviazione dei dati, perché in dischi multipli possono essere memorizzate informazioni ridondanti, di modo che il guasto di un disco non porti alla perdita dei dati. Ai fini delle prestazioni e dell’affidabilità è comunemente usata una varietà di tecniche di organizzazione dei dischi, chiamate nel loro insieme array ridondanti di dischi a basso costo (RAID). Miglioramento dell’affidabilità La probabilità che un certo disco in un insieme di N dischi non funzioni è molto più alta rispetto alla probabilità che uno specifico disco singolo non funzioni. Si supponga che il tempo medio al guasto di un singolo disco sia di 100 000 ore; allora il tempo medio di guasto di un certo disco in un array di 100 dischi sarà 100 000/ 100= 1000 ore o 41,66 giorni che è un tempo breve. (La probabilità di guasto è il prodotto delle probabilità di ogni singolo disco) Se memorizziamo solo una copia di dati, il guasto di un disco provocherebbe la facile perdita di dati. La soluzione al problema consiste nell’introdurre la ridondanza con la quale si memorizzano informazioni supplementari. Il metodo più semplice (ma più costoso) per introdurre la ridondanza è duplicare ogni disco con una tecnica denominata mirroring. Un disco logico consiste quindi in due dischi fisici e ogni scrittura viene effettuata su entrambi i dischi: se uno dei due viene a mancare, i dati potranno essere letti dall’altro. I dati saranno persi solo se il secondo disco si guasta prima che il disco n° 1 venga sostituito. Se il tempo medio al guasto di un singolo disco è 100 000 ore e il tempo medio di riparazione è 10 ore, il tempo medio alla perdita dei dati di un sistema di dischi in mirror (supponendo che i guasti sui due dischi siano indipendenti) è 100 0002/ 2 x 10 = 57000 anni ! Bisogna tenere presente, però, che il presupposto di indipendenza dei guasti dei dischi non è valido. Livelli di RAID RAID livello 0 : si riferisce agli array di dischi senza alcuna ridondanza RAID livello 1: si riferisce al mirroring di dischi RAID livello 2: organizzazione a codice di correzione di errore RAID livello 3: organizzazone con parità bit per bit RAID livello 4: organizzazione con parità a livello di blocco RAID livello 5: parità distribuita a livello di blocco RAID livello 6: ridondanza P+Q RAID0 può essere utilizzato per migliorare le prestazioni in un ambiente con alto tasso di I/O. Se vengono utilizzati 4 dischi per un RAID0, ne servono 8 uguali per un RAID1. Negli altri casi si utilizzano tecniche di rilevazione di errore e correzione. In RAID2 il numero di dischi ridondanti è proporzionale al logaritmo del numero di dischi di dati. Struttura dei dischi pag. 5 di 5