:: Sistemi Operativi - Riassunto del capitolo 2 ::
Torna alla pagina di Sistemi Operativi
Capitolo 2 - Architettura del computer
2.1 Funzionamento del computer
Un computer general-purpose (cioè adatto a fare un po' tutto) ha:
- CPU
- Dispositivi di controllo
- Memoria condivisa
Ogni dispositivo di controllo gestisce una periferica specifica.
Sono tutti su un bus condiviso.
Tutti, CPU e dispositivi, agiscono in modo concorrente per rubarsi a vicenda l'accesso alla memoria => occorre un controller della memoria per gestire gli accessi.
Per partire quando si dà corrente occorre un programma di bootstrap
- semplice
- in genere in una ROM con indirizzo noto, così la CPU sa dove andare a pescarlo.
Eventi = segnalati da interruzioni (interrupt).
Gli eventi che le generano possono essere
- provenienti dall'hardware
- provenienti dal software (chiamate di sistema = system call = monitor call)
Sistemi operativi moderni = guidati dalle interruzioni
Eventi = segnalati da interrupt o da eccezioni (trap), che sono interruzioni generate dal software (divisioni per zero, accessi non validi alla memoria).
Per ogni interrupt, c'è una routine che lo deve gestire => il controllo deve passare a questa routine => per sapere quale routine assegnare a quale int, c'è una tabella.
Gestire un interrupt = salvare l'indirizzo dell'istruzione che ha chiamato l'interrupt nello stack, assieme a program counter e a registri => dopo aver gestito l'interrupt, si riprende come se non fosse successo niente.
Chiamata di sistema = un processo utente chiama una funzione del SO => in genere si usa una trap.
2.2 Struttura dell'I/O
Controller della periferica = mantiene dati nel buffer locale. Responsabile dello spostamento di dati tra periferiche.
2.2.1 Interruzioni di I/O
Iniziare un'operazione IO:
- CPU: carica i registri appropriati nel controller del dispositivo
- Controller: in base ai valori, decide che azione intraprendere
- Controller: finita l'operazione, genera un'int e avvisa la CPU che ha finito
Dopo che è iniziata, l'operazione di I/O può essere:
- sincrona: quando finisce l'I/O, il controllo torna al processo che chiamò l'I/O
- asincrona: non si aspetta che l'op finisca, e si fanno altre cose nel frattempo.
Attesa della rispsota dell'I/O, alternative:
- Wait = istruzione che alcune CPU hanno per dormire mentre attendono I/O.
- wait loop: un loop che chiama se stesso fino a che non arriva un int.
I/O sincrono: posso gestire una chiamata I/O alla volta perché aspetto che finisca => no I/O concorrente.
I/O asincrono: meglio, ma devo tener traccia delle molte richieste contemporanee => tabella di stato del dispositivo che indica
- tipo
- indirizzo
- condizione
del dispositivo. Se il dispositivo è impegnato, allora salvo la richiesta nella tabella => più processi che vogliono accedere allo stesso dispositivo sono messi in una coda di attesa.
Arriva un interrupt:
- la CPU deve determinare quale periferica lo generò
- la CPU cerca nella tabella di stato del dispositivo e vede se far partire il dispositivo con un altra richiesta
Se dal dispositivo arriva qualcosa che un processo attendeva, posso ridare il controllo a questo processo.
Kernel buffer = dispositivo per salvare i segnali in input prima che qualcuno li richieda (eg buffer della tastiera).
La routine di gestione dell'interrupt salva tutti i registri che la CPU stava utilizzando, così poi può riprendere da dov'era.
Vantaggio dell'I/O asincrono = più efficienza, perché mentre un I/O avviene, la CPU fa altro <= in genere l'I/O è molto più lento della CPU.
2.2.2 Trasferimenti in DMA
Dispositivo ad alta velocità = trasmette veloce quasi quanto la CPU => gli interrupt sarebbero troppo frequenti.
=> DMA: direct memory access. Il controller del dispositivo imposta il conroller DMA e trasferisce blocchi di dati direttamente tra sé e la memoria, senza intervento della CPU => un solo interrupt per blocco.
Ocio: cmq il DMA compete con la CPU per l'accesso alla memoria.
2.3 Struttura della memoria
Programmi dei computer: per essere eseguiti devono stare nella memoria centrale (RAM).
RAM = sequenza di parole, ognuna con il proprio indirizzo.
Ciclo di esecuzione di un'istruzione in Von Neumann:
Situazione ideale = tutti i programmi da eseguire in RAM, per velocità. Ma:
- RAM in genere troppo piccola
- Se spengo, la RAM si cancella
=> esiste una memoria secondaria.
2.3.1 Memoria Centrale
Memoria centrale = l'unica cui la CPU accede direttamente => ai dischi eg non accede direttamente, perché non può usare indirizzi delle parole nei dischi come usa invece gli indirizzi di memoria.
Spazio di indirizzamento = insieme degli indirizzi di memoria cui la CPU può accedere.
Accesso comdo all'I/O = I/O a memoria mappata, in cui alcuni blocchi dello spazio di indirizzamento sono mappati non nella memoria centrale, ma in registri del controller del dispositivo => utile per dispositivi rapidi eg schede video.
Per spedire dati la CPU:
- scrive quei dati nel registro dei dati
- attiva un bit nel registro di controllo per segnalare che il byte è stato messo
Il dispositivo:
- prende il byte
- azzera il bit nel registro di controllo per segnalare che il byte è stato preso.
I/O programmato: è la CPU che ciclicamente controlla lo stato del bit nel registro di controllo.
I/O guidati da interrupt: è il dispositivo che genera un interrupt dicendo che ha trasferito il byte.
Accesso ai registri della CPU: si ottiene in un clock.
Accesso alla memoria: si ottiene in più clock => rallenta il tutto => occorre della cache per cercare di velocizzare questo possibile collo di bottiglia (si vedrà poi).
2.3.2 Dischi magnetici
Memoria secondaria di grandi dimensioni.
Composti da:
- piatti magnetici
- braccio
- testina in fondo al braccio
Un piatto è diviso in tracce circolari.
Una traccia è divisa in settori.
Cilindro = insieme delle tracce che stanno sotto il braccio (vedi immaginetta sul libro...)
Tasso di trasferimento = ritmo con cui i dati vanno da disco a processore.
Tempo di posizionamento = somma del tempo richiesto per
- spostare il braccio sul cilindro desiderato
- far ruotare il piatto sotto la testina.
Caduta della testina: essa atterra sul piatto e lo distrugge.
I/O bus = cavi per collegare dischi al computer (EIDE, SCSI, ATA).
I trasferimenti sono gestiti da controller:
- un controller presso il computer
- un controller presso il disco, dotato di cache interna.
2.3.3 Nastri magnetici
Accesso lento e sequenziale => ideale per backup, non per accesso diretto.
2.4 Gerarchia di memorizzazione
Vedi il libro per la piramide. Il succo è che più la memoria è veloce, più è costosa. L'ideale è trovare un compromesso tra velocità d'accesso e quantità di memoria. Per questo c'è la cache.
2.4.1 Caching
Caching = memorizzazione temporanea di informazioni in dispositivi veloci.
Quando si accede ad un sistema di memorizzazione (uno qualsiasi), i dati vengono prima copiati nella cache, che è veloce e vicina al processore, e da lì vengono acceduti.
Gestione della cache = in hw o in sw.
Politiche di aggiornamento = se sono buone, ho 80-99% di accessi in cache.
Nella gerarchia di memorizzazione, un tipo di memoria più in alto può fare da cache per memorie più in basso.
2.4.2 Consistenza
Struttura gerarchica usata come cache => stessi dati che appaiono in modi diversi in due livelli diversi => devo renderli consistenti.
Sistemi con un solo processo: allo stesso dato accede lo stesso processo => accede sempre al livello più alto possibile => non è un problema.
Sistemi multitasking: allo stesso dato possono accedere processi diversi => necessario sincronizzare le copie dei dati disponibili ai vari processi.
Sistemi multiprocessore: l'aggiornamento della cache di un processore deve riflettersi nella cache dell'altro processore => coerenza della cache in genere gestita in hw.
Modi per garantire coerenza = capitolo 16.
2.5 Protezione hardware
Primi tempi: quando il system admin si connetteva, faceva quello che voleva.
Monitor residente: i primi SO installati, che governavano l'hw.
Poi: condivisione risorse tra diversi utenti => multiprogrammazione => un processo può causare errori sia un un altro processo, che nel monitor (SO) stesso.
2.5.1 Funzionamento in modalità differenziate
Voglio funzionamento corretto => proteggere i processi e il SO da altri processi => protezione per ogni risorsa condivisa.
2 modalità separate:
- user mode = modalità utente
- supervisor | monitor | system | privileged mode = modalità di sistema
Bit di modalità: dice in che modalità sto.
Avvio: computer in modalità di sistema, poi si caricano i processi dell'utente.
Trap o interrupt: computer passa in modalità di sistema.
Istruzioni privilegiate = eseguibili solo in modalità di sistema => chiamata di sistema da parte di un processo utente per chiedere al SO di fare cose privilegiate.
Chiamata di sistema = trattata come un interrupt software => SO controlla che i parametri siano legali, esegue e ritorna.
Se c'è la modalità di sistema in hardware, i programmi che la violano sono trovati automaticamente dall'hw, il quale invierà una trap al SO => possibile terminazione anomala del processo (eventuale dump).
2.5.2 Protezione dell'I/O
Il funzionamento anomalo del sistema si può avere con:
- chiamate a I/O illegali
- accesso a locazioni di memoria proprie del SO
- rifiuto di un processo di lasciare il processore ad altri
=> tutte le op. I/O sono definite privilegiate => se un utente vuole usare l'I/O deve passare attraverso le chiamate di sistema.
Se un processo utente diventa attivo in modalità supervisore, può fare danni => virus che sfruttano errori di programmazione del SO per abusarne.
2.5.3 Protezione della memoria
- Proteggere la memoria usata dal SO
- Proteggere la memoria usata da un processo
=> i non autorizzati non devono leggere fuori dai loro confini
Confini di memoria => indirizzo di partenza della memoria valida è contenuto nel registro base, indirizzo finale nel registro limite => ogni processo ha i suoi confini => l'hw controlla ogni accesso in memoria per vedere se è legale.
Registi base e limite sono caricabili solo dal SO.
2.5.4 Protezione della CPU
Il SO deve mantenere il controllo: se un processo prende il sopravvento, il SO scompare
Temporizzatore: un clock che interrompe il computer dopo un tot di tempo.
Uso comune del temporizzatore: si definisce un quanto di tempo della durata di N millisecondi => alla scadenza una interrupt ferma il processore e trasferisce il controllo al SO, che opera un cambio di contesto (cap 4).
2.6 Strutture di rete
Due tipi:
- LAN = Local Area Network
- WAN = Wide Area Network = reti geografiche (città diverse etc.)
=> differenze in hw, protocolli, efficienza etc.
2.6.1 Reti locali
LAN = nate inizio anni 70 come sostituto dei grandi mainframe => più economico avere piccoli computer in rete ed autonomi che uno ciccione centrale.
LAN = poca distanza => cavi veloci ed affidabili.
Gateway = punti di accesso ad altre reti.
Lo schema più usato è Ethernet per la connessione fisica => non è centralizzata, ma è un bus ad accesso multiplo in "autogestione" => scala facilmente.
2.6.2 Reti geografiche
Vasta area => bassa velocità, meno affidabilità rispetto alle LAN.
Computer connessi molto diversi.
Reti locali raggruppate in reti regionali => router per connettere più reti regionali nella rete mondiale.
Altri tipi di accesso: telefono (56K e DSL), fibra ottica, wireless.
Torna alla pagina di Sistemi Operativi