Evoluzione S.O. La 1. 2. 3. gestione dell' I/O in un calcolatore può essere gestita : A controllo di programma Con le interruzioni Con la tecnica Direct Memory Access Gestione I/O a controllo di programma interfaccia CPU interfaccia BUFFER STATO CONTROLLO dispositivo L'interfaccia, da un lato, colloquia con la cpu comportandosi come una piccola memoria ; dall'altro interagisce con un dispositivo esterno di I/O. L'interfaccia appare al programmatore come un insieme di registri di tre categorie. I registri buffer che servono per lo scambio di dati tra il processore (CPU) e il dispositivo esterno tramite l'interfaccia; il registro di stato che dà informazioni sulle condizioni interne dell'interfaccia (tipicamente indica se è in corso un trasferimento tra interfaccia e dispositivo esterno); i registri di controllo che stabiliscono le modalità di funzionamento dell'interfaccia medesima, fra quelle possibili. L'interfaccia può essere montata sia nello spazio di memoria sia nello spazio di I/O. (tipicamente nello spazio di I/O). Gestione I/O con interrupt E’ il dispositivo di I/O che richiama l’attenzione della CPU attraverso una segnalazione hardware chiamata interrupt. Pag. 1 di 13 Evoluzione S.O. Gestione I/O con DMA interrupt CPU Disco Comando input Copia blocco controllore DMA RAM 1 La cpu richiede un copia blocco con comando input al DMA 2 La copia del blocco avviene senza intervento della cpu 3 L'interrupt del DMA sancisce la fine della Copia Pag. 2 di 13 Evoluzione S.O. SISTEMI OPERATIVI Sistema operativo come macchina estesa L'architettura della maggior parte dei computer a livello del linguaggio macchina (set di istruzioni, organizzazione della memoria, I/O e struttura del bus) è primitiva ed estremamente sgradevole da programmare, specialmente per quanto riguarda l'input/output. Ciò che il programmatore desidera ed un utilizzatore ancora di più è avere a che fare con una astrazione semplice e di più alto livello. Il sistema operativo è il programma che nasconde i dettagli dell'hardware e fornisce una machina estesa o macchina virtuale. Utente finale Programmatore Programmi applicativi Sistema operativo Progettista S.O. Hardware Sistema operativo come gestore delle risorse Il concetto di sistema operativo che fondamentalmente offre una interfaccia comoda corrisponde ad una visione top-down o dall'alto verso il basso. Una visione alternativa dal basso verso l'alto (bottom up) è quella di considerare il sistema operativo come gestore di tutti i componenti di un sistema complesso. I computer sono costituiti da processori, memorie, timer, dischi, interfacce di rete, stampanti ecc. Secondo questa visione alternativa il compito di un sistema operativo è quello di fornire un utilizzo controllato del processore, della memoria , dei dispositivi di I/O. Una definizione più comune afferma che il sistema operativo è l’unico programma che è sempre in funzione (normalmente chiamato kernel o nucleo) nel computer, mentre tutto il resto è classificabile come programmi di sistema e programmi applicativi. Stabilire ciò che fa parte di un sistema operativo è divenuto sempre più importante. ( Nel 1998 il Dipartimento della Giustizia degli Stati Uniti ha portato in tribunale Microsoft, affermando che essa aveva inserito troppe funzionalità nel proprio sistema operativo, escludendo così dalla competizione i venditori di programmi applicativi. Pag. 3 di 13 Evoluzione S.O. Evoluzione dei sistemi operativi Prima generazione (valvole e pannelli di collegamento) Sui primi computer non esisteva un sistema operativo; l'operatore interagiva direttamente con l'hardware. Le macchine erano controllate da una console costituita da indicatori luminosi, interruttori a levetta, qualche forma di dispositivo di input e una stampante. Seconda generazione transistor Semplici sistemi batch Poiché le prime macchine erano molto costose era della massima importanza utilizzarle al meglio. Per migliorare l'utilizzo delle macchine, si sviluppò il concetto di sistema operativo batch (a lotti). L'idea centrale alla base del sistema batch è quella di avere una porzione di software nota come monitor. Ciascun programma è costruito in modo che, alla fine della elaborazione, ritorni il controllo al monitor che, automaticamente , inizia a caricare il programma successivo. Nastro in ingresso Nastro di sistema Nastro di uscita Il nastro in ingresso contiene i programmi da eseguire letti da un lettore di schede perforate. Il nastro di uscita con i risultati delle elaborazioni viene portato alla stampa. Spooling Un miglioramento nelle prestazioni dei sistemi batch si ebbe con l’introduzione della tecnica dello spooling. Tutti i job di un batch venivano preventivamente caricati su disco in modo tale che, durante le loro esecuzioni, la CPU leggesse i dati e producesse i risultati operando solo col disco (molto più veloce dei lettori di schede e della stampante). Mentre il calcolatore eseguiva i programmi di un batch, operando in DMA, venivano contemporaneamente caricati sul disco i job del batch successivo e, in parallelo, venivano stampati i risultati del batch precedente prelevandoli ancora dal disco. Pag. 4 di 13 Evoluzione S.O. disco stampante CPU e memoria Lettore di schede Memoria Monitor (Sistema Operativo batch) Elaborazione delle interruzioni Driver dei dispositivi Interprete del linguaggio di controllo Confine di separazione Area del programma utente Terza generazione : circuiti integrati Sistemi batch multi programmati Anche con la serializzazione automatica dei job fornita da un semplice sistema batch, il processore rimane spesso inattivo poiché, in confronto alla cpu , i dispositivi di I/O sono lenti. Per rendersi conto dei vantaggi della multiprogrammazione si può considerare l' esempio di un computer con 256 K parole di memoria utilizzabile dagli utenti, un disco, un terminale ed una stampante. Tre programmi, JOB1,JOB2 e JOB3 con gli attributi elencati in tabella, sono pronti contemporaneamente per l'esecuzione. Job 1 Job 2 Partizioni di memoria Job 3 Sistema operativo Pag. 5 di 13 Evoluzione S.O. Tipo di job Durata Memoria richiesta Ha bisogno del disco Ha bisogno di un terminale Ha bisogno di una stampante JOB1 Calcolo pesante 5 min 50K no no no JOB2 I/O pesante 15 min 100K no si no JOB3 I/O pes. 10 min 80K si no si In un semplice ambiente batch questi job saranno eseguiti in sequenza: JOB1 finisce dopo 5 minuti, JOB2 dopo 20 minuti e JOB3 dopo 30 minuti dal momento in cui erano pronti per l'esecuzione. Se tali job vengono eseguiti concorrentemente, in un sistema operativo multiprogrammato, poiché la competizione per accedere alle risorse è modesta, tutti e tre possono essere eseguiti in un tempo pari alla loro durata. Entro 15 minuti tutti e tre i job sono completati. Sistemi time-sharing I sistemi in multiprogrammazione a lotti hanno fornito un ambiente in cui la varie risorse del sistema (CPU,memoria,periferiche) venivano utilizzate in modo efficiente, ma non offrivano alcuna possibilità di interazione tra l’utente e il computer. Nei sistemi time-sharing la CPU esegue parecchi programmi contemporaneamente commutando tra di essi, ma la commutazione è così frequente che gli utenti possono interagire con ogni programma mentre è in esecuzione. Il time-sharing richiede un sistema operativo interattivo, che fornisca comunicazione diretta tra utente e computer. L’utente da istruzioni direttamente al sistema operativo o a un programma, utilizzando una tastiera e aspetta dei risultati immediati sul proprio terminale. Il tempo di risposta dovrebbe quindi essere breve, tipicamente meno di un secondo. I terminali collegati al sistema possono essere tanti, anche centinaia. I sistemi time-sharing devono anche fornire un file-system che risiede in un insieme di dischi. L’idea del time-sharing fu introdotta negli anni Sessanta ma per la loro complessità sono divenuti comuni negli anni Settanta. Quarta generazione :sistemi desktop ( personal computer) I primi sistemi operativi per PC non erano ne multiutente ne multitasking, funzionalità oggi offerte dai PC. Tuttavia, a differenza dei sistemi multiprogrammati e time-sharing il cui scopo principale consiste nel massimizzare l’utilizzo della CPU e delle periferiche, i sistemi operativi per PC devono massimizzare la comodità e prontezza di risposta:( interfacce più amichevoli , interfacce grafiche (GUI Graphical User Interface). Le scelte progettuali sono quindi diverse anche se i sistemi operativi di questi computer hanno beneficiato sotto diversi aspetti dello sviluppo dei sistemi operativi per mainframe. Pag. 6 di 13 Evoluzione S.O. Sistemi multiprocessore Pressoché tutti i moderni sistemi operativi -tra cui Windows 2000, Windows XP, MacOS X , Linux, Solaris una versione commerciale di UNIX prodotta dalla Sun Microsystem – forniscono supporto SMP (sistema multiprocessore simmetrico). In tali sistemi tutti i processori sono allo stesso livello e utilizzano una memoria comune.Incrementando il numero di processori si tende a ottenere una maggiore quantità di elaborazione in minor tempo. L’incremento di velocità con N processori non è però N volte. Quando più processori cooperano in modo parallelo a un lavoro si verifica un certo sovraccarico per far funzionare correttamene tutte le parti. Sistemi distribuiti Reti si computer Sistemi client-server Sistemi cluster Analogamente ai sistemi paralleli i sistemi cluster mettono assieme parecchie cpu per eseguire le elaborazioni richieste; diversamente dai sistemi multiprocessore, però, i sistemi cluster sono composti da due o più computer accoppiati tra di loro. Sistemi in tempo reale Un sistema in tempo reale (real time)viene usato quando è indispensabile completare la computazione o il trasferimento di dati entro un tempo prefissato; spesso sono dedicati per supportare il controllo di un’apparecchiatura dedicata. Sistemi per esperimenti scientifici, sistemi medicali per acquisizione di immagini, sistemi di controllo industriale, sistemi per l’automazione della casa(domotica), sistemi per il controllo dei motori a iniezione delle automobili, sono tutti sistemi in tempo reale. Sistemi palmari I sistemi palmari comprendono i personal digital assistant (PDA)quali il Palm,i Pocket-PC e i telefoni cellulari. Programmi di sistema I programmi di sistema forniscono un ambiente opportuno per lo sviluppo e la esecuzione di programmi. Forniscono: Gestione dei file Supporto ai linguaggi di programmazione Caricamento ed esecuzione dei programmi Comunicazioni Forse il più importante programma di sistema per un sistema operativo è l’interprete dei comandi, la cui principale funzione è di ottenere ed eseguire il comando successivo specificato dall’utente. Struttura del sistema operativo Pag. 7 di 13 Evoluzione S.O. Una struttura semplice Alcuni sistemi commerciali non hanno strutture ben definite; spesso hanno avuto origine come sistemi piccoli, semplici e limitati, per poi crescere al di là dello scopo originario. L’MSDOS ne è un esempio. Nell’MS-DOS i livelli di funzionalità non sono ben separati. Ad esempio, i programmi applicativi possono accedere alle risorse I/O di base per scrivere direttamente sullo schermo e sui dischi. programma applicativo programma residente di sistema La struttura di MS-DOS driver dei dispositivi in MS-DOS driver dei dispositivi nel BIOS in ROM File di sistema: command.com (interprete dei comandi) msdos.sys io.sys (config.sys, autoexec.bat) Un altro esempio di struttura limitata è l’originario sistema operativo UNIX consistente in due parti separabili: il nucleo (kernel) e i programmi di sistema. Programmi applicativi Programmi di sistema Kernel Hardware Le chiamate di sistema definiscono l’interfaccia dei programmi applicativi ( API Application Program Interface). Pag. 8 di 13 Evoluzione S.O. Visione più dettagliata del kernel UNIX Programmi utente Librerie Livello utente Livello kernel Interfaccia per le chiamate di sistema Comunicazioni Sottosistema dei file Controllo dei Schedulatore processi Buffer Gestione memoria Carattere Blocco Driver dei dispositivi Controllo dell’hardware Livello kernel Livello dell'hardware Hardware La struttura stratificata Un sistema può essere reso modulare in molti modi. Il primo è rappresentato dalla struttura stratificata in cui il sistema operativo viene decomposto in un certo numero di strati o livelli. Lo strato inferiore è l’hardware (livello 0) ; quello più elevato (livello N) è l’interfaccia utente.Il sistema operativo OS/2 discendente di MS-DOS è stato implementato in questo modo. L’approccio a strati trova il suo logico sbocco nel concetto di macchina virtuale ( Sistema operativo VM per sistemi IBM) I microkernel (client-server) Man mano che UNIX si espandeva il suo kernel diveniva grande e difficile da gestire; si pensò di modularizzare il suo nucleo usando il metodo del microkernel. Questo metodo struttura il sistema operativo rimuovendo tutte le componenti non indispensabili dal kernel e implementandole come programmi di sistema. Il risultato è un kernel più piccolo. Il kernel deve Pag. 9 di 13 Evoluzione S.O. fornire funzionalità di comunicazione fra il programma client e i fari servizi che sono in funzione attraverso la tecnica dello scambio di messaggi. processo processo client client Processi server file server memory server Nucleo microkernel La struttura modulare Forse la migliore metodologia di progetto di un sistema operativo coinvolge l’uso di tecniche di programmazione orientate agli oggetti per creare un kernel modulare. In questo caso, il kernel possiede un gruppo di componenti base e si collega dinamicamente ai servizi addizionali sia al momento del boot, sia durante l’esecuzione. Una tale strategia è comune nelle moderne implementazioni di Unix, quali Solaris, Linux e MacOS X. Driver del dispositivo Classi di schedulazione e del bus File system Kernel Moduli vari Formati eseguibili Chiamate di sistema caricabili Il risultato finale assomiglia a un sistema a strati, poiché ogni sezione ha interfacce protette e definite; è però piu flessibile perché ogni modulo può richiamare qualunque altro modulo. Inoltre l’approccio è simile al metodo del microkernel in quanto il modulo primario ha solo funzioni basilari e sa come caricare e comunicare con gli altri moduli, ma è più efficiente, perché i moduli non hanno bisogno di richiedere l’invio di messaggi per la comunicazione. Pag. 10 di 13 Evoluzione S.O. Processi Un concetto chiave in tutti i sistemi operativi è quello di processo. Un processo è fondamentalmente un programma in esecuzione. Associato a questo processo c'è il suo spazio di indirizzamento cioè una lista di locazioni di memoria compresa tra un minimo ed un massimo che il processo può usare per letture e scritture. Lo spazio di indirizzamento contiene il programma eseguibile, i dati del programma e il suo stack. Associato al processo vi sono inoltre i valori assunti da una serie di registri come il program counter, il puntatore allo stack, nonché tutte le altre informazioni necessarie all'esecuzione del programma. Se il sistema operativo prevede la multiprogrammazione ogni processo può essere in esecuzione, bloccato o pronto. 1. In esecuzione o running ( il processo stà effettivamente utilizzando la cpu) 2. Pronto o Ready ( il processo è eseguibile ma temporaneamente sospeso per consentire l'esecuzione di un altro processo. 3. Bloccato ( il processo è impossibilitato a proseguire fino al verificarsi di un evento esterno) esecuzione 2 1 3 Bloccato Pronto 4 1 Attesa evento (I/O) 2 Termine del quanto di tempo assegnato 3 Lo schedulatore lo sceglie 4 Avviene l'evento (I/O) atteso Il sistema operativo si interfaccia con i programmi applicativi attraverso le chiamate di sistema. Le chiamate di sistema fondamentali per la gestione dei processi sono quelle che si occupano della creazione e della terminazione dei processi. Si consideri un esempio tipico in ambiente Unix . Un processo chiamato interprete dei comandi o shell legge comandi da un terminale. L'utente ha appena eseguito un comando per richiedere la compilazione di un programma. La shell deve quindi creare un nuovo processo che eseguirà il compilatore. Quando la compilazione ha termine il processo eseguirà una chiamata di sistema per terminare. Se un processo può creare uno o più altri Pag. 11 di 13 Evoluzione S.O. processi ( chiamati child o processi figli) e questi a loro volta possono creare processi figli si arriva rapidamente ad una struttura ad albero. A B D C E figli di A figli di B Processi correlati, che devono cooperare per conseguire il loro scopo, necessitano spesso di comunicare l'uno con l'altro e di sincronizzare le loro attività. Questa comunicazione viene chiamata comunicazione interprocesso. Altre chiamate di sistema possono essere usate per richiedere più memoria, rilasciare memoria inutilizzata, attendere la terminazione di un processo figlio, sovrascrivere il programma corrente con uno diverso. A volte c'è bisogno di comunicare informazioni ad un processo in esecuzione che non è in attesa di riceverle. Per esempio un processo può richiedere al sistema operativo di essere avvertito dopo un determinato numero di secondi dello scadere di un certo tempo. Dopo aver impostato questo timer il programma può continuare tranquillamente le sue elaborazioni. Quando il numero specificato di secondi è trascorso il sistema operativo invia un segnale (signal) al processo. Il segnale fa sì che il processo sospenda l'esecuzione normale, salvi i suoi registri nello stack, ed inizi ad eseguire una speciale procedura di gestione dei segnali. Quando il gestore dei segnali termina, il processo in esecuzione viene ripristinato nello stato in cui si trovava prima del segnale. I segnali sono l'analogo software delle interruzioni hardware e possono essere generati da un certo numero di cause oltre che la scadenza di un timer. Molte eccezioni, intercettate dall'hardware come l'esecuzione di una istruzione illegale o l'uso di un indirizzo non valido, sono convertite in segnali diretti al processo responsabile. I processi sono caratterizzati da un uid (identificatore di utente) che lo ha lanciato. Un processo figlio ha lo stesso uid del suo genitore. Chiamate di sistema per la gestione dei processi La fork è l'unico mezzo per creare un nuovo processo. Essa crea una copia esatta del processo originario, compresi i descrittori dei file, i registri. Dopo il fork il processo originario e la copia (il genitore e il figlio) prendono la loro strada. Al momento della invocazione della fork tutte le variabili hanno gli stessi valori, ma dal momento in cui si effettua la copia dei dati le modifiche su uno dei due non interferiscono sull'altro. ( il codice non modificabile viene condiviso tra genitore e figlio) Pag. 12 di 13 Evoluzione S.O. La chiamata fork restituisce un valore che è 0 nel figlio e uguale all'identificatore del processo figlio (pid) nel padre. Usando il valore restituito i due processi possono individuare il figlio ed il genitore. Uno schema di shell while (TRUE) { read_command(command,parameters); if (fork() != 0) { /* codice del genitore*/ waitpid(-1, &status, 0); /* attende la terminazione del figlio */ } else { /* codice del figlio*/ execve(command, parameters,0); /* esegue il comando */ } } Pag. 13 di 13