Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Il controller pu essere
inserito o nel bus, con
uninterfaccia standard(USB,
PCI ecc), oppure sulla
periferica stessa, in questo
caso in dispositivo ha una
sola interfaccia. NB le
interfacce che collegano
dispositivo e controller sono
standardizzate e i
dispositivi vengono fatte in
modo che vadano bene con
quelle interfacce
Come agisce? Il lavoro del controller convertire flussi di bit in blocchi di
byte pronti per essere spediti.
I bus di memoria sono hanno una certa velocit, quindi non ha senso collegare
tutti i dispositivi al bus(hanno velocit differenti), solitamente si hanno pi
bus di memoria.
Solitamente abbiamo:
La mode line specifica se lindirizzo nella date line si riferisce alla memoria
o a porte di I/O, per scrivere in mode line usiamo:
1. IN/OUT(per le porte di I/O)
2. IN/MOV(per la memoria)
Illustrazione 1
DMA
Abbiamo un interrupt controller su un chip della scheda madre che specifica cosa
fare dopo un interruzione; Ogni dispositivo dotato di un interrupt
handler(implementato tramite interrupt Vector). Il segnale cos lanciato
intercettato dal controller, se non ci sono altri interrupt in attesa lo
processa immediamente; se arrivassero 2 interrupt contemporaneamente uno con
priorit pi alta, si processa prima quello con priorit pi alta, laltro
dispositivo sospeso. Per gestire linterrupt il controller assegna un numero
sulle numero alle linee di indirizzi il cui dispositivo vuole attenzione e
sottopone un segnale per interrompere la CPU. Il numero sulla linea degli
indirizzi usato come un indice allinterno del vettore degli
interrupt(interrupt handler) per prelevare un nuovo contatore di programma(punta
alla procedura di gestione degli interrupt).
I/O programmato
come I/O programmato solo che lavora il DMA e non la CPU(pi lento della CPU)
il driver avvia
loperazione sullhardware
e aspetta linterrupt
linterrupt handler
sveglia il driver quando
loperazione stata
completata
Il software deve
specificare il gestore
dellinterruzione. Quando linterrupt handler viene mandato in esecuzione deve:
1. salvare lo stato della CPU
2. viene eseguito un content switch, per caricare il codice di gestione del
device
3. viene effettuato il reset dellinterrupt, si notifica al device che
linterruzione stata gestita e pu riprendere a funzionare
4. esegui codice gestione
5. sveglia driver
6. scheduler()
Funzione driver:
while(true){
ricevi_istruzione()\\bloccante
verifica_parametri()\\controlla che i parametri per loperazione
\\siano corretti
genera_comandi()\\comandi macchina
if(busy)\\accoda_richiesta
else esegui()
pool o block()}
I driver possono appoggiarsi ad altri driver, devono quindi:
1. esportare delle funzionalit
2. importare delle funzionalit
Interfacciamento uniforme
Naming uniforme
Buffering
Illustrazione 6: buffering
il buffer utile anche in output non solo in input. Es un processo vuole fare
loutput di n caratteri, Il sistema ha due possibilit:
1. blocca lutente finch il buffer non pieno, potrebbe richiedere molto
tempo
2. rilascia il processo utente, nel mentre gestisce linput output e lutente
pu fare altro,come fa il processo utente a sapere quando il processo
stato completato? Signal, o interrupt software(programmazione molto
complicata)
Una soluzione usare un buffer kernel(Illustrazione 6 c, ma al contrario, cio
quando il buffer utente pieno copio nel buffer kernel)
Problema: se i dati sono messi nel buffer troppe volte, abbiamo un calo di
prestazioni, Es: Illustrazione 7
un utente fa una
chiamata di sistema per
scrivere nella rete, il
kernel copia il
pacchetto nel buffer
kernel e sblocca il
processo utente; il
driver copia il
pacchetto al controller
per loutput(copia nel
controller perch
altrimenti non possiamo
garantire che il
pacchetto giunga a
velocit uniforme, per
Illustrazione 7 via dei vari cycle
steling ecc ) il resto
si vede dal disegno, tutte queste copie sequenziali rallentano di molto.
Gli errori sono molto frequenti nella gestione delle periferiche abbiamo:
1. rottura delle periferiche, creano errori di lettura scrittura(es: leggere
su un settore del disco danneggiato)
2. errori di programmazione(se ne occupa il driver, e se non sa cosa fare
SIDSO):
un processo richiede qualcosa di impossibile, scrittura su dispositivo
di input
scrittura su un indirizzo del buffer non valido ecc
3.
Alcuni dispositivi come il lettore CD possono essere usati solo d aun processo
alla volta. Il sistema operativo deve esaminare le richieste per lutilizzo del
dispositivo e accettarle o rifiutarle a seconda che il dispositivo sia
disponibile o meno, come?
1. Richiedere ai processi di fare la open direttamente sui file speciali, e
la chiusura di tali dispositivi comporta il rilascio del file
2. un tentativo di acquisizione di un dispositivo in uso blocca il chiamante
invece che fallire(i processi bloccati finiscono in una coda)
I dispositivi potrebbero avere dimensione dei blocchi molto diverse tra di loro,
ma come fa il sistema a richiedere un blocco se non conosce la dimensione? Se ne
occupa il software indipendente dal dispositivo, fornendo blocchi logici di
dimensione equivalente(magari combinando pi blocchi), e successivamente si
occuper di convertire i blocchi logici in fisici, a seconda del dispositivo
Sebbene il software di I/O risieda nel sistema operativo, una piccola parte
composta da librerie connesse al di fuori del kernel, normalmente le chiamate di
sistema sono eseguite da funzioni di libreria es: write, ma ci sono funzioni che
vengono eseguite totalmente in modalit utente es: printf/scanf
stesso discorso spooling
esistono molti tipi di disco, i pi comuni sono i dischi rigidi magnetici, con
medesima velocit di lettura e scrittura ; abbiamo anche dischi ottici e infine
dischi a stato solido.
Dischi magnetici
Per leggere una certa traccia(di un disco) dobbiamo spostare il braccio avanti
e indietro, quando sposto una testina sposto anche tutte le altre testine nella
pila di dischi, per cui quella che creiamo una geometria a cilindro.
Detto ci, quando vogliamo individuare in modo univoco un settore all'interno di
un hard disk dobbiamo individuare la traccia sulla quale il settore giace,
quindi spostiamo il braccio su quella traccia. In realt non individuiamo una
traccia ma un cilindro di tracce(inteso come tracce verticali)
(Cylinder). All'interno di quel cilindro ci interessa sapere quale piatto e
faccia dei dischi(NB i dischi hanno 2 facce) contiene la traccia, la
individuiamo con la testina (Head). Una volta individuata la
traccia individuiamo il settore. I settori hanno un identificatore numerico che
locale alla traccia nella quale si trovano, quindi va individuato anche il
settore (Sector).
CHS
c=10;h=8;s=6
gli indirizzi sono assegnati dal bios, per evitare che il programmatore dovesse
occuparsi della formattazione del disco.
il settore 0 riservato. Questo ci permette di calcolare la capacit massima:
Allepoca per molti dischi utilizzavano ancora i vecchi CHS quindi per poter
utilizzare linterfaccia ATA sulle macchine CHS si prendeva il minimo tra i due
quindi: c=10 h=4 s=6 ottenendo una capacit di indirizzamento di soli 512MB
c= LBA /(Nh*Ns)
h=(LBA/Ns)%Nh
s=(LBA%Ns)+1
Illustrazione 9: man mano che ci allontaniamo dal centro i settori diventano pi grossi, e la
velocit angolare aumenta, il ch ci consente di avere pi settori per traccia, il tutto si realizza
utilizzando una geometria virtuale del disco che viene presentata al sistema operativo, il controller
rimapper poi la richiesta di (c,h,s) nella testina e settori reali.
Testo 2: si introducono le geometrie virtuali perch il numero di settori per disco non sempre lo
stesso(vedasi testo di sopra)
I dischi moderni sono molto veloci. Il disco SAS (Serial Attached SCSI) o SATA
(Serial Advanced Technology Attachment)
si differisce non dall'interno, ma dall'interfaccia esterna. Se prendo un SSD
con un'interfaccia lenta pi di una certa velocit non potr avere.
L'interfaccia attualmente pi veloce la SAS con stato solido interno, che
opera a 12 Gbit/s = 1,5GB/s. Ma anche le altre memorie hanno continuato a
velocizzarsi. Le RAM pi veloci al momento sono le DDR3, a 3000 hz, che
trasferiscono dati a 24 GB/s. I dischi di punta sono 15 volte pi lenti della
memoria normale. Questo un problema perch ogni volta che cerchiamo di leggere
dati da un dispositivo di memoria di massa la CPU deve fermarsi per un mucchio
di tempo, ci inventiamo dei congegni (DMA,ecc.) per ridurre il disagio. Nei casi
migliori la CPU dovr aspettare un tempo di 15 volte pi lenta rispetto alla
RAM.
Raid(array ridonandante di dischi economici)
Come rendiamo i dischi pi veloci? Si basa sulla stessa idea con cui si sono
rese le CPU pi veloci, cio il parallelismo, rispetto ai vecchi SLED
Raid Livelli(guardare quaderno)
lidea alla base dei RAID installare un contenitore pieno di dischi accanto al
computer a questo punto sostituiamo la scheda controller dei dischi con un
controller RAID
RAID 0
Consideriamo cosa vuol dire mettere insieme i 4 dischi facendoli vedere come un
disco unico. Ci vuol dire che perch il sistema funzioni correttamente ciascuno
dei 4 dischi deve essere funzionante, quindi la probabilit che il sistema si
guasti data dalla probabilit che si guasti il primo oppure il secondo, oppure
il terzo oppure il quarto. I dischi si guastano indipendentemente l'uno
dall'altro, quindi la probabilit data da P1 + P2 + P3 + P4 = 0,0002, con il
reciproco pari ad un MTTF pari a 5000. Si passa da un disco che si rompeva
dopo 20.000 ore ad uno che si rompe dopo 5.000 ore, molto meno affidabile.
Inoltre i sistemi operativi che chiedono un settore alla volta non sfruttano il
parallelismo
RAID 1
Per ovviare ai problemi visti in precedenza adottiamo la tecnica del mirroring,
cio copie speculari dei dati, dato un gruppo di n dischi li divido in n/2
dischi, per ciascun disco dichiaro un secondario, cos se un disco si rompe il
disco continua a funzionare, la tolleranza ai guasti del raid1 pi alta del
raid0, si possono rompere fino a n/2 dischi, e il sistema continua a funzionare.
Si fa striping a livello dei singoli bit, cio si decide l'unita elementare, nel
nostro esempio mezzo byte, e si distribuiscono i bit sui dischi
i tre bit rimanenti sono utilizzati per il codice di hamming che ne garantisce
l'affidabilit.
Per ottenere prestazioni migliori potrei scegliere come dimensione della strip
32 bit, come le parole di memoria questo portebbe ad avere un totale di 38
dischi.
RAID 3
Il problema che il bit di parit non consente di correggere gli errori, posso
solo rivelarli, ma se si rompe un disco possiamo ricostruire l'informazione
guardando il bit di parit, se si rompono due dischi non posso pi recuperare
nulla.
Un altro problema dovuto al fatto che sulla singola richiesta vado molto
velocemente, per il throughput basso, poich per una singola richiesta devo
utilizzare tutti i dischi, quindi le richieste si accodano. Capacit totale=
C(N-1), dove C la capacit di un disco e N-1 il numero di dischi. Il problema
vero di questa soluzione che l'unit fondamentale dei dischi il settore 512
byte, per ogni settore devo portare in memoria 512 * 8 bit; il che una
procedura molto molto lenta.
RAID 4
Illustrazione 11: si sfrutta la propriet che un valore in XOR con se stesso si annulla
Se si rompono due dischi non gi pi possibile corregere
Prestazioni
Lettura:
Scrittura:
Le operazioni di scrittura interessano anche il disco di parit, poich devo
aggiornare le informazioni in esso contenute
1. Intera stripe, nessun problema, il controller ha in memoria tutte le
strip, e pu facilmente calcolare le informazioni di parit
2. Strip, in controller avr in memoria soltanto le informazioni riguardanti
la strip, dovrei impegnare gli altri dischi nella lettura delle strip
mancanti, il che portebbe a uno svantaggio
Possiamo sfruttare una propriet dello XOR per non dover ripescare ogni
volta tutte le strip
3. Pnew=Pold XOR Di(new) XOR Di(old), ricava da Pold(x) XOR Pnew(x) XOR
Pold(x) = Dinew(x) XOR diold(x) XOR Pold(x)
RAID 5
Si utilizza una tecnica basata sul modulo l'informazione di parit rispetto alla
stripe i dev'essere memorizzata in (N+i)%N; Una distribuzione del genere detta
left-symmetric, esistono altre distribuzioni della parit.
Recupero dati
RAID 6 e p+q
Il raid 6 costa di pi in caso di guasta e devo fare 6 piccole letture per ogni
small write.
Formattazione dei dischi
Illustration 13
Illustration 12: Formato dei settori
Problema
Supponiamo di voler leggere 18 settori a partire dal settore 0 della traccia pi
interna, la lettura dei primi 16 settori avviene tramite la rotazione del disco
mentre per posizionarci sulla nuova traccia, dove si trova il settore 17,
abbiamo bisogno di una seek, mentre effettuiamo il seek il settore 0 passato
sotto la traccia e cos dobbiamo aspettare un intera rotazione del disco per
posizionarci al settore 0
Screw
Dopo la formattazione i settori, solitamente, sono allineati radialmente, ci,
che facciamo invece spostare di un certo offset(chiamato cylinder skew) il
settore 0 di ciascuna traccia rispetto alla traccia precedente; In questo modo
possiamo leggere pi tracce senza perdere dati,lidea chiara, mentre faccio la
seek il disco ruota e quando la testina si sar posizionata sar sul settore 0.
ES:
Tsettore = Ttraccia/SettoriTraccia=6ms/300=0,02ms
Byte per traccia 300 * 512 = 153.600 bytes. Tuttavia so che una traccia
loperazione di copia nel buffer interno, controllo ECC e copia in memoria porta
via molto tempo, supponendo di voler leggere + settori con un buffer interno di
1 settore, mentre faccio i controlli sul primo settore gli altri scorrono sotto
la testina e non faccio in tempo a leggerli per il prossimo
Per risolvere il problema utilizziamo la numerazione interlacciata(interliving)
Grandezza sfasamento:
Interliving = Tecc/Tsettore
ES calcolo sfasamento
Tecc = 12 ns
Tsettori= Ttraccia/NsettoriTraccia
Ttraccia = 1
settore= 1024byte
velocit di rotazione = 15k BPM
settori per traccia = 1000
Ttraccia = 1/(15k/60)=4ms
Tsettore=4ms/1000 = 4ns
I=12ns/4ns=3
VtrasferimentoDati=(BpT/(Ttraccia))/1000(MB)
Gli ultimi due dipendono dalla geometria del disco mentre il tempo di seek
dipende dal numero di settori su tracce diversi. Esistono meccanismi per ridurre
il tempo di seek(algoritmi di scheduling del braccio del disco), lidea che il
driver calcoli il cilindro su cui sono memorizzati i settori per cui arrivano
richieste e passi al controller gli indirizzi dei settori da leggere(riordinando
le richieste)
Algoritmi di scheduling del braccio
Se il driver del disco accetta una sola richiesta alla volta, e le esegue nello
stesso ordine c ben poco da ottimizzare, ma normalmente i driver tengono
traccia in una tabella indicizzata per numero di cilindro, di tutte le richieste
per ciascun cilindro; attraverso lutilizzo di questa tabella possiamo
migliorare FCFS, riordinando le richieste in modo da eseguire pochi seek.
11-1(10)+1-36(35)+36-16(20)+16-34(18)+34-9(25)+9-12(3)=111
Serve tutte le richieste fino alla fine, poi torna indietro senza servire
richieste(arriva al cilindro 0) e poi si sposta nuovamente in avanti