:: Sistemi Operativi - Riassunto del capitolo 2 ::
Torna alla pagina di Sistemi Operativi
Un computer general-purpose (cioè adatto a fare un po' tutto) ha:
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
Eventi = segnalati da interruzioni (interrupt). Gli eventi che le generano possono essere
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.
Controller della periferica = mantiene dati nel buffer locale. Responsabile dello spostamento di dati tra periferiche.
Iniziare un'operazione IO:
Dopo che è iniziata, l'operazione di I/O può essere:
Attesa della rispsota dell'I/O, alternative:
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
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:
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.
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.
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:
=> esiste una memoria secondaria.
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:
Il dispositivo:
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).
Memoria secondaria di grandi dimensioni. Composti da:
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
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:
Accesso lento e sequenziale => ideale per backup, non per accesso diretto.
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.
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.
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.
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.
Voglio funzionamento corretto => proteggere i processi e il SO da altri processi => protezione per ogni risorsa condivisa.
2 modalità separate:
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).
Il funzionamento anomalo del sistema si può avere con:
=> 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.
=> 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.
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).
Due tipi:
=> differenze in hw, protocolli, efficienza etc.
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.
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.