Riassunto - Cap.1 - Libro \"Sistemi operativi. Concetti ed esempi\" - Abraham Silberschatz; Peter Baer Galvin; Greg Gagne PDF

Title Riassunto - Cap.1 - Libro \"Sistemi operativi. Concetti ed esempi\" - Abraham Silberschatz; Peter Baer Galvin; Greg Gagne
Author Run Salerno
Course Sistemi Operativi
Institution Università degli Studi di Salerno
Pages 6
File Size 100.5 KB
File Type PDF
Total Downloads 88
Total Views 163

Summary

Riassunto - Cap.1 - Libro "Sistemi operativi. Concetti ed esempi" - Abraham Silberschatz; Peter Baer Galvin; Greg Gagne...


Description

Capitolo 1 Un sistema operativo è un insieme di programmi che gestisce gli elementi fisici di un calcolatore; fornisce una piattaforma ai programmi applicativi r agisce da intermediario fra l’utente e la struttura fisica del calcolatore. Alcuni SO si progettano x essere di uso agevole, essere agevoli o x possedere entrambe le qualità. In ragione alla sua complessità, un SO deve essere costruito gradualmente x parti. 1.1 Che cosa è un SO Un sistema di calcolo si può suddividere in 4 elementi: -

Dispositivi fisici: costituiti da CPU, memoria e dispositivi I/O; Programmi applicativi: definiscono il modo in cui si usano queste risorse x la risoluzione dei problemi degli utenti; Utenti: coloro che utilizzano il calcolatore; SO: controlla e coordina l’uso dei dispositivi da parte dei programmi applicativi.

In poche parole, un sistema di calcolo si può considerare come l’insieme dei suoi elementi fisici, programmi e dati e il SO offre gli strumenti x impiegare correttamente tali risorse fornendo un ambiente nel quale i programmi possono lavorare in modo utile. Il calcolatore vede il SO come un assegnatore di risorse. Infatti esso le gestisce e le assegna ai programmi e agli utenti in modo tale che il sistema di calcolo operi in modo equo ed efficiente. Un SO è il solo programma che funziona sempre nel calcolatore (kernel). 1.2 Organizzazione di un sistema di calcolo Un calcolatore è composto da CPU e da un certo numero di controllori di dispositivi connessi attraverso un canale di comunicazione detto bus che permette l’accesso alla memoria condivisa dal sistema. I controllori si occupano di un particolare tipo di dispositivo e insieme alla CPU operano in modo concorrente contendendosi i cicli di accesso alla memoria (anch’essa gestita da un controllore di memoria). L’avviamento del sistema richiede la presenza di uno specifico programma detto bootstrap program contenuto in tipi di memoria chiamati firmware (ad esempio la ROM). La funzione principale di questo programma consiste nell’inizializzare i diversi componenti del sistema. Esso deve caricare nella memoria il SO e avviarne l’esecuzione, perciò individua e carica nella memoria il kernel del SO. Quest’ultimo avvia l’esecuzione del primo processo e attende il verificarsi di qualche evento. Un evento si segnala con l’interruzione dell’attuale sequenza d’esecuzione della CPU che può essere causata da un dispositivo fisico (interruzione) o da un programma (eccezione). Ogni qualvolta riceve un segnale di interruzione, la CPU interrompe l’elaborazione corrente e trasferisce immediatamente l’esecuzione a una locazione fissa della memoria. Questa locazione avrà l’indirizzo iniziale della procedura di servizio x quel determinato segnale di interruzione. Una volta completata la procedura richiesta, la Cpu riprende l’elaborazione precedentemente interrotta. Un segnale di interruzione deve causare il trasferimento di controllo all’appropriata procedura di servizio all’evento a esso associato. La gestione di un’’interruzione deve essere rapida perciò si può usare una tabella di puntatori alle specifiche procedure, mantenuta nella memoria bassa. L’architettura di gestione delle interruzioni deve salvare l’indirizzo dell’istruzione interrotta, questa operazione è possibile in quanto l’indirizzo viene salvato nella pila (stack) del sistema. Terminato il servizio dell’interruzione, l’indirizzo di ritorno salvato nello stack viene caricato nel program counter contenente l’indirizzo della prossima istruzione da eseguire.

Per essere eseguito, un programma deve risiedere in memoria centrale (RAM). Infatti quest’ultima è l’unica area di memoria di grandi dimensioni direttamente accessibile dalla CPU. La CPU preleva automaticamente dalla memoria centrale le istruzioni da eseguire. La tipica sequenza d’esecuzione di un’istruzione (architettura di von Neumann) comincia con il prelievo (fetch) di un’istruzione dalla memoria centrale e il suo trasferimento nel registro d’istruzione; quindi si decodifica (decode) l’istruzione e la si esegue (execute). Una volta terminata l’esecuzione dell’istruzione il risultato si può scrivere in memoria. In teoria si vorrebbe che programmi che i dati risiedessero in RAM ma ciò non è possibile in quanto la RAM non è sufficiente a contenere il tutto e inoltre è una memoria volatile. Proprio x queste motivazioni si utilizzano le memorie secondarie che memorizza in modo permanente le grandi quantità di dati. Una grande percentuale del codice di un SO è dedicato alla gestione dell’I/O. Come detto in precedenza, un calcolatore è composto da CPU e controllori di dispositivi connessi da un bus. Ciascun controllore deve occuparsi di un dispositivo. Esso dispone di una memoria interna di transito (buffer) e di alcuni registri specializzati. Il controllore è responsabile del trasferimento dei dati tra i dispositivi a esso connessi e il proprio buffer. I SO possiedono x ogni controllore un driver di dispositivo che si coordina col controllore e funge da interfaccia con il resto del sistema. Per avviare un’operazione di I/O, il driver carica i registri interessati all’interno del controllore, quest’ultimo trasferisce i dati dal dispositivo al buffer sito al proprio interno; una volta finito il trasferimento, il controllore informa il driver tramite un’interruzione; il driver passa il controllo al SO restituendo i dati. Questa operazione è possibile se i dati sono di piccole quantità. Nel caso in cui ci debbano essere trasferimenti massicci di dati si utilizza il DMA (accesso diretto alla memoria). Una volta impostati i buffer, i puntatori e i contatori necessari all’I/O, il controllore trasferisce un intero blocco di dati dalla propria memoria buffer direttamente in memoria centrale e viceversa, liberando la CPU che può fare altro. 1.3 Architettura degli elaboratori I sistemi dotati di un’unica CPU vengono detti monoprocessori, mentre i sistemi che dispongono di più CPU in stretta comunicazione che condividono il bus, i cicli di clock e talvolta dispositivi di memoria e periferici vengono detti multiprocessori. Tali sistemi godono di 3 vantaggi: 1) Maggiore produttività (troughput): Aumentando il numero di CPU è possibile svolgere un lavoro maggiore in minor tempo. 2) Economia di scala; 3) Incremento dell’affidabilità: Se le funzioni possono distribuirsi tra adeguatamente tra più CPU, un guasto di di alcune di loro non blocca il sistema ma lo rallenta. Esistono due tipi di sistemi multiprocessori, alcuni impiegano la multielaborazione asimmetrica mentre altri quella simmetrica. Nella prima, ogni singola CPU esegue un compito specifico dove vi è una CPU principale che controlla il sistema. Nella seconda, ogni processore è abilitato al compimento di tutte le operazioni del sistema. Nei primi si ha una organizzazione gerarchica che è assente nei secondi. Il vantaggio offerto dalla multielaborazione simmetrica è che i processi sono eseguibili contemporaneamente senza causare cali di prestazioni. Infine vi sono i cluster di elaboratori che sono basati sull’uso congiunto di più CPU ma risiedenti su 2 o più calcolatori collegati fra loro attraverso una LAN. Essi possono essere strutturati sia in modo asimmetrico che simmetrico.

1.4 Struttura del SO Il SO costituisce l’ambiente esecutivo dei programmi. Fra le più importanti caratteristiche dei SO vi è la multiprogrammazione che consente si aumentare la percentuale di utilizzo della CPU, organizzando i lavori in modo tale da mantenerla in continua attività. L’idea su cui si basa questa tecnica consiste nel tenere in memoria centrale diversi lavori; tale insieme di lavori (job pool) è generalmente un sottoinsieme dei lavori presenti. Il SOne sceglie uno tra quello contenuti in memoria e inizia l’esecuzione: a un certo punto potrebbe trovarsi nell’attesa di qualche evento, in questi casi la CPU rimarrebbe inattiva. Mentre nei sistemi dotati di multiprogrammazione, il SO passa semplicemente a un altro lavoro e lo esegue. Quando il primo lavoro ha terminato l’attesa. La CPU ne riprende l’esecuzione. Un sistema con multiprogrammazione fornisce un ambiente in cui le risorse del sistema vengono utilizzate in modo efficiente. Il time-sharing è un’estensione logica della multiprogrammazione, la CPU esegue più lavori commutando le loro esecuzioni con una frequenza tale d permettere a ciascun utente l’interazione col proprio programma durante la sua esecuzione. Un programma caricato in memoria e predisposto x la fase di esecuzione viene chiamato processo. Un processo impegna la CPU x un breve lasso di tempo prima di terminare. Il time-sharing e la multiprogrammazione richiedono la contemporanea presenza di più processi in memoria. Siccome la Ram non è abbastanza capiente d x ospitare tutti i processi, questi risiedono in una area di memoria detta job pool contenente tutti i processi in attesa della propria parte di memoria centrale. Se alcuni processi sono pronti x essere trasferiti in RAM ma lo spazio disponibile non è sufficiente ad accoglierli tutti, il sistema deve effettuare una scelta chiamata job schedulino. Quando il sistema carica quel processo in RAM è perché deve essere eseguito. In un sistema basato sulla partizione del tempo di elaborazione, il SO deve garantire tempi di risposta accettabili, ciò è possibile grazie allo swapping o avvicendamento che consente di scambiare i processi dal disco alla RAM e viceversa. Un metodo più comune x ottenere il medesimo risultato è la memoria virtuale che consente l’esecuzione di lavori anche se non sono caricati interamente in memoria. Inoltre questi sistemi devono fornire un file system residente in un insieme di dischi. 1.5 Attività del SO I moderni SO sono guidati dalle eccezioni. Quasi sempre sono o le interruzioni o le eccezioni a segnalare un evento. Un segnale di eccezione indica che si è verificata un’interruzione generata da un programma dovuta a un errore. La struttura di un SO è definita proprio in quanto esso è guidato dalle interruzioni. A ciascun tipo di interruzione corrispondono singoli segmenti di codice che determinano la reazione all’interruzione. Un SO progettato in maniera soddisfacente deve evitare che un programma viziato da errori possa indurre a un’esecuzione scorretta di altri programmi. Per garantire il corretto funzionamento del sistema sono necessarie due diverse modalità: modalità utente e modalità di sistema. Per indicare la modalità attiva la CPU deve essere dotata di un bit di modalità: di sistema (0) o utente (1). Questo bit consente di stabilire se l’istruzione corrente si esegue x conto del SO o x conto di un utente. All’avviamento dei sistema il bit è posto in modalità di sistema. Si carica il SO che provvede all’esecuzione dei processi utenti in modalità utente. Ogni volta che si verifica un’interruzione si passa dalla modalità utente a quella di sistema. La duplice modalità di funzionamento consente la protezione del SO dal comportamento degli utenti e viceversa. Questo livello di protezione si ottiene

definendo come istruzioni privilegiate le istruzioni macchina che possono causare danni allo stato del sistema. Poiché la CPU consente l’esecuzione di queste istruzioni solo in modalità di sistema se si tenta di fa eseguire queste istruzioni in modalità utente, la CPU non la esegue ma la tratta come istruzione illegale e lancia un eccezione. Quindi in sintesi, all’inizio il controllo appartiene al SO (mod. sistema); nel momento in cui il controllo passa a un programma si entra nella mod. utente ed infine il controllo ripassa al SO o tramite interruzione o eccezione o chiamata di sistema. Le chiamate di sistema sono strumenti con cui un programma utente richiede al SO di compiere operazioni a esso riservate [syscall]. Quando un programma utente richiede una chiamata di sistema, questa viene gestita dalla CPU come un’interruzione. Il controllo passa, tramite il vettore delle interruzioni, all’apposita procedura di servizio presente all’interno del SO e si pone il bit di modo in modalità sistema. Il sistema esamina l’istruzione che ha causato l’eccezione al fine di stabilire la natura della chiamata di sistema mentre un parametro definisce il tipo di servizio richiesto dal programma utente. Ulteriori informazioni possono essere copiate nei registri o sulla pila. Il sistema verifica la correttezza e la legalità dei parametri, soddisfa la richiesta e restituisce il controllo all’istruzione immediatamente successiva alla syscall. Occorre assicurare che il SO mantenga il controllo dell’elaborazione, cioè che un programma non entri in ciclo infinito. A tale scopo si può usare il timer, programmabile affinchè invii un segnale di interruzione alla CPU a intervalli di tempo specificati che possono essere fissi o variabili. Prima di restituire all’utente il controllo dell’esecuzione, il sistema assegna un valore al timer, se esso esaurisce questo intervallo genera un’interruzione che causa il passaggio del controllo al SO che può decidere come gestirlo. La presenza di un timer garantisce che nessun programma possa essere eseguito troppo a lungo. 1.6 Gestione dei processi Un programma fa qualcosa solo se la CPU esegue le istruzioni che lo costituiscono. Un processo si può considerare come un programma in esecuzione e x svolgere i propri compiti necessita di alcune risorse. Queste risorse possono essere assegnate al momento della sua creazione oppure durante l’esecuzione stessa. A differenza del programma che è un’entità passiva, un processo è un’entità attiva. L’esecuzione di un processo deve essere sequenziale: la CPU esegue le istruzioni del processo una dopo l’altra. Il SO è responsabile delle seguenti attività connesse alla gestione dei processi: -

Creazione e cancellazione dei processi utente e sistema; Sospensione e ripristino dei processi; Fornitura di meccanismi x la sincronizzazione dei processi; “ “ “ x la comunicazione tra porocessi; “ “ “ x la gestione delle situazioni di stallo (deadlock).

1.7 Gestione della memoria Affinchè la CPU possa gestire i dati di un disco, occorre che essi siano trasferiti prima in memoria centrale attraverso le richieste di I/O generate dalla CPU, viceversa la CPU può eseguire istruzioni solo se si trovano in memoria. X eseguire un programma è necessario che questo sia associato a indirizzi assoluti e sia caricato in memoria. Durante l’esecuzione del programma, la CPU accede alle proprie risorse e ai dati in memoria generando indirizzi assoluti. Quando il programma termina si dichiara disponibile il suo spazio di memoria. Il SO è responsabile delle seguenti attività connesse alla gestione della RAM:

-

Deve tener traccia di quali parti della memoria sono usate e da chi; Deve decidere quali processi e dati debbano essere caricati in memoria o trasferiti; Assegnare o revocare lo spazio di memoria a seconda delle necessità.

1.8 Gestione della memoria di massa Il SO associa i file a supporti fisici e vi accede tramite dispositivi di memorizzazione delle info. I calcolatori possono registrare info su molti mezzi fisici diversi quali nastri magnetici, dischi magnetici e ottici. Un file è una raccolta di info correlate e definite dal loro creatore. Il SO realizza il concetto astratto di file gestendo i mezzi di memo di massa e i dispositivi che li controllano. I file generalmente sono organizzati in directory. Il SO è responsabile delle seguenti attività connesse alla gestione dei file: -

Creazione e cancellazione di file; “ “ di directory; Fornitura delle funzioni fondamentali x la gestione di file e directory; Associazione dei file ai dispositivi di memo secondaria; Creazione di copie di riserva (Backup) dei file sui dispositivi di memo non volatili.

Siccome la memoria centrale è troppo piccola x contenere tutti i dati e tutti i programmi e il suo contenuto viene perso se si spegne il sistema, il calcolatore deve disporre di memorie secondarie a sostegno della RAM (solitamente sono i dischi). Il SO è responsabile delle seguenti attività x la gestione dei dischi: -

Gestione spazio libero; Assegnazione dello spazio; Scheduling del disco.

Le info solitamente sono conservate in un’unità di memoria come la RAM; al momento del loro uso vengono copiate in memorie veloci che si chiamano cache. Data la capacità limitata di questi dispositivi, la gestione della cache è un importante problema di progettazione. Il trasferimento dati tra la cache e i registri CPU e svolto dall’architettura del sistema diversamente il trasferimento dei dati dai dischi alla memoria di solito è gestito dal SO. 1.9 Protezione e sicurezza Se diversi utenti usufruiscono dello stesso elaboratore che consente la simultanea esecuzione di processi multipli, l’accesso ai dati deve essere disciplinato da regole. Per protezione si intende ciascuna strategia di controllo dell’accesso alle risorse possedute da un elaboratore, da parte di processi o utenti. Queste strategie devono fornire le specifiche dei controlli da attuare e gli strumenti x la loro effettiva applicazione. La protezione può migliorare l’affidabilità rilevando errori nascosti. Anche se posto a protezione, un sistema può rimanere esposto ad accessi abusivi. E’ compito della sicurezza difendere il sistema da attacchi provenienti da attacchi interni o esterni (da virus e worm). 1.10 Sistemi distribuiti Per sistema distribuito si intende un insieme di calcolatori posti a distanza e con caratteristiche eterogenee interconnessi da una rete x consentire agli utenti l’accesso alle varie risorse disponibili dei singoli sistemi. L’accesso a una risorsa condivisa aumenta la velocità di calcolo, la disponibilità dei dati e il grado di affidabilità. Una rete si può considerare come un canale di comunicazione tra due o più sistemi. I sistemi distribuiti si basano sulle reti x realizzare le proprie funzioni. Esse differiscono x i protocolli usati e si

classificano in base alle distanze dei nodi: una LAN comprende nodi all’interno della stessa stanza, una WAN si estende a gruppi di edifici, città, ecc.. mentre le MAN collegano edifici di un’intera città. Le varianti più importanti dei sistemi distribuiti sono: i sistemi client/server e i sistemi peer to peer. Nei primi i server elaborano richieste x conto dei client fornendo un’interfaccia e restituendo agli stessi i risultati delle richieste inoltre i server offrono anche un’interfaccia al file system che consente al client creazione, aggiornamento, lettura e cancellazione file. Nei secondi tipi di sistema non vi è distinzione tra client e server infatti tutti i nodi vengono considerati “pari” e ciascuno può fungere sia da client che da server. Per entrare a fa parte di un sistema P2P un nodo deve in primo luogo unirsi ai suoi omologhi e una volta entrato a far parte della rete, può fornire servizi o richiederne dai suoi omologhi....


Similar Free PDFs