Organizzazione di un semplice calcolatore con architettura convenzionale Processore Parte Controllo Periferiche Parte Operativa Disco Tastiera Video Interfaccia Interfaccia Interfaccia Disco Tastiera Video Memoria ALU Principale Registri Bus Software di base Software di sistema: sistema operativo compilatori, interpreti programmi di utilità Il sistema operativo: insieme di programmi interagenti che operano sull’hardware per fornire agli utenti ed ai programmi applicativi un insieme di funzionalità ad un livello di astrazione elevato che faciliti l’uso e la gestione delle risorse e ne regolamenti l’impiego prevenendo i conflitti. Compito del sistema operativo: presentare all’utente un sistema esteso più semplice da usare e programmare Evoluzione dei sistemi operativi tradizionali ( sistemi a singolo processore) e processo di adattamento alle caratteristiche dell'hardware alle tipologie di utenza alle applicazioni richieste ed utilizzate dall'utenza Primo tentativo di relizzare un calcolatore digitale Charles Babbage matematico inglese (1792-1871) si cimenta nella prima vera impresa di realizzare un autentico calcolatore digitale. Nonostante le risorse fisiche ed economiche investite nella impresa il tentativo abortisce in quanto la tecnologia del tempo non è adeguata a supportare la realizzazione delle parti meccaniche necessarie con la precisione richiesta La prima generazione (1945-1955): valvole e schede a spinotti Howard Aiken e John von Neumann (Advanced Study di Princeton) Eckert e Mauchley (Università della Pennsylvania) ed altri negli anni 40 realizzano le prime macchine di calcolo basate su valvole elettroniche Le dimensioni sono enormi e la capacità di calcolo irrisoria La programmazione è realizzata in linguaggio macchina assoluto Sono sconosciuti i linguaggi di programmazione ed i sistemi operativi Un primo miglioramento è rappresentato dall'avvento delle schede perforate su cui sono scritti i programmi che passano a sostituire le schede di spinotti La seconda generazione (1955-1965): transistor e sistemi batch L'introduzione dei transistor cambia negli anni 50 in modo radicale la situazione rendendo possibile la realizzazione dei primi calcolatori affidabili e pertanto commercializzabili (ma a costi elevatissimi) che offrono la ragionevole certezza all'acquirente che avrebbero funzionato abbastanza a lungo Si differenziano le funzioni degli operatori del settore: progettisti, costruttori, operatori programmatori e personale della manutenzione I comandi del sistema operativo i programmi i dati di ingresso che caratterizzano un singolo lavoro (job) vengono raggruppati in lotti (memorizzati prima su schede perforate, poi su nastri e successivamente su disco) e accodati in attesa di essere eseguiti. Un programma di supervisione gestisce il caricamento e l'attivazione dei programmi da eseguire per completare il lotto, riducendo così le interazioni con l'utente I linguaggi utilizzati sono principalmente il FORTRAN e l'assembler, mentre i sistemi operativi tipici sono FMS (fortran Monitor System) e IBSYS il sistema operativo dell'IBM per il 7094 Fondamentalmente in questo periodo ciascuna casa produttrice ha due linee distinte di prodotti incompatibili tra loro: grossi calcolatori per calcoli numerici scientifici ed ingegneristici e calcolatori per uso commerciale utilizzati principalmente da banche assicurazione etc. La terza generazione (1965-1980): circuiti integrati e multiprogrammazione La tecnologia dei circuiti integrati anche se a bassa scala di integrazione porta a produrre sistemi con costi notevolmente ridotti, prestazioni decisamente superiori, adatti sia alle grandi elaborazioni scientifiche che a quelle di carattere commerciale Sono gli anni dei sistemi IBM della famiglia 360 macchine diverse quanto a prezzo e prestazioni, ma compatibili a livello software; pertanto, almeno nelle intenzioni dei progettisti, i sistemi operativi (OS/360 e successivi) ed il software in generale dovrebbe essere utilizzabile sia sui piccoli sistemi che sulle grosse macchine della stessa famiglia. Con risorse hardware più potenti si pone il problema di ottimizzarne l'utilizzo: vengono introdotti ed utilizzati sistemi operativi multiprogrammati: più programmi contemporaneamente in memoria e la risorsa CPU, mentre un job completia operazioni di ingresso/uscita, attribuita ad un job diverso La richiesta della utenza di tempi di risposta più veloci rispetto a quelli ottenibili con la gestione a lotti porta alla tecnica del timeharing (condivisione di tempo), variante della multiprogrammazione: ogni utente ha a disposizione un terminale in linea attraverso il quale usufruisce di un servizio interattivo veloce (sistemi timesharing CTSS sviluppati da MIT e sistema MULTICS di MIT Bell e General Electric) L'avvento dei minicalcolatori (dal PDP-1 fino al PDP11) e la presenza di tali macchine in ambienti scientifici, dato il costo contenuto, porta a tentativi di scrivere versioni ridotte del sistema operativo MULTICS che culmineranno nel sistema operativo Unix (marchio registrato della AT&T) La quarta generazione (1980-1990): i personal computer Con lo sviluppo dei circuiti LSI (Large Scale Integration), chip contenenti migliaia di transistor su un centimetro quadrato di silicio, sorge l'era del calcolatore personale. Il microprocessore rende possibile al singolo individuo di avere il suo calcolatore personale. Personal computer più potenti prendono il nome di workstation Un PC non è molto diverso dal punto di vista dell'architettura da un minicalcolatore della classe del PDP-11, ma certamente vi è molta differenza dal punto di vista dei costi. La presenza di strumenti di calcolo in ambienti di non addetti ai lavori stimola l'introduzione di software user friendly cioè rivolto ad utenti che né conoscono nè sono motivati ad imparare alcunché di calcolatori. I due sistemi operativi che dominano la scena dei calcolatori personali in questi anni sono MS-DOS della Microsoft (per PC-IBM e su macchine che utilizzano come processore l' Intel 8088 e successori) e Unix (dominante su macchine non Intel e su workstation specie quelle equipaggiate da chip RISC ad alte prestazioni) Requisiti di un sistema operativo: efficienza: utilizzo ottimale delle risorse del sistema quali cpu interattività: interazione diretta con l’utente con tempi di risposta accettabili sincronizzazione/cooperazione: L'utilizzo efficiente della risorsa CPU induce alla decomposizione di alcuni problemi in un insieme di attività interagenti che vanno sincronizzate, sia nel caso di interazione implicata da motivi di cooperazione, sia nel caso di interazione dovuta a competizione nell'uso risorse condivise Architettura tradizionale di un sistema operativo Nucleo Gestore Memoria Gestore periferiche File System Shell Programmi di utilità Organizzazione a strati, o a buccia di cipolla. Ogni strato definisce una macchina virtuale che realizza funzionalità sempre più potenti e mette a disposizione degli strati superiori (più esterni) una macchina un poco più astratta e semplice da usare Ogni macchina virtuale ha il compito di gestire risorse specifiche fornendo meccanismi logici di accesso che ne regolamentino l'uso e ne mascherino i limiti. Le politiche di gestione delle risorse sono separate dai meccanismi che garantiscono la correttezza logica delle operazioni garantendo così una maggiore flessibilità al processo di ottimizzazione delle prestazioni del sistema. Strati dai livelli più bassi ai livelli più alti della gerarchia di livelli: Il nucleo: Implementa il processo (programma in esecuzione e dati ad esso associati) e fornisce agli strati superiori la visione di più unità di elaborazione virtuali legate ciascuna di esse ad un processo attivo. Il gestore della memoria: Introduce per ogni programma uno spazio virtuale di indirizzamento prescindendo dalla effettiva zona di memoria fisica corrispondente: protegge i dati e le istruzioni dei programmi, maschera la collocazione fisica dei dati, permette la parziale sovrapposizione degli spazi di memoria associati ai vari programmi riducendo la ridondanza delle informazioni Il gestore delle periferiche: Astrae le periferiche mascherando all’utente le caratteristiche fisiche dei dispositivi utilizzati per I/O consentendo quindi di ignorare sia i problemi di indirizzamento che di sincronizzazione. Il gestore dei file o file system: Organizza una particolare periferica, la memoria di massa, in file identificati da un nome e accessibili da comandi di alto livello rendendo trasparente sia l’allocazione che l’accesso alla memoria stessa. L’interprete dei comandi ed i programmi di utilità: Sono visibili direttamente all’utente. L’interprete dei comadi interpreta ed esegue i comandi provenienti da tastiera: lettura del programma da eseguire, allocazione della memoria per la sua esecuzione, caricamento del programma e dei dati, creazione ed attivazione del processo corrispondente. I programmi di utilità consentono di ottimizzare e facilitare l’uso da parte degli utenti e del gestore del sistema.: compilatori, debugger, backup, ottimizzatori dello spazio su disco, editor etc. L’avvento di dispositivi di puntamento ed interfacce grafiche ha sostituito una sequenza di comandi immessi da tastiera tramite un immagine: icona, selezione esecuzione Il supporto di rete: un sistema operativo in grado di supportare il collegamento in rete di più calcolatori fornisce un ambiente operativo in cui viene perso il concetto di localizzazione delle risorse a vantaggio della possibilità di condividere dati, periferiche ed unità di calcolo Il nucleo Il nucleo interagisce direttamente con l'hardware ed è responsabile dell'esecuzione dei programmi della risposta ad eventi esterni generati dai diversi dispositivi periferici La principale astrazione realizzata dal nucleo: il processo Processo: un programma in esecuzione insieme ai propri dati ed a tutte le informazioni necessarie per la sua esecuzione (contenuti dei registri, file aperti etc). Il processo è una entità dinamica Nel caso di una sola cpu di momento in momento un solo processo è in esecuzione ed il nucleo simula il parallelismo tra i processi. Ogni volta che un processo non è in grado di evolvere (per esempio è in attesa che si completi una operazione di I/O ) si sospende in attesa di un evento e ridiventa pronto quando si verifica l’evento atteso. Dalla creazione alla sua terminazione il processo transita attraverso un insieme di stati descritti dal grafo delle transizioni di stato L'entità processo è fondamentale nei sistemi operativi multiprogrammati: più programmi di utente risiedono in memoria in aggiunta al sistema operativo ( a differenza dei sistemi uniprogrammati). L'obiettivo ottimizzazione dell'utilizzo della cpu è conseguito con la sospensione del processo in esecuzione quando non è in grado si evolvere (ad es. perché in attesa del completamento di una operazione di I/O) e con la schedulazione per l'esecuzione di un altro processo pronto. nei sistemi a partizione di tempo (unix, windows 95 98 Nt), affermatisi con l'avvento di sistemi di elaborazioni in cui l'interazione con l'utente è realizzata tramite terminale. L' obiettivo di garantire a ciascun utente connesso tramite terminale tempi di risposta ragionevoli (sistemi operativi multiutente) è conseguito impedendo che la cpu sia monopolizzata dall'esecuzione di solo programma. Il tempo viene, pertanto, suddiviso in unità di tempo elementare (quanti), ed a ciascun processo è consentito utilizzare la cpu al più per un quanto di tempo, allo scadere del quale la risorsa gli viene sottratta per essere attribuita ad un altro processo pronto. Una politica in genere di tipo round robin consentirà di riprendere l'esecuzione del processo solo dopo che tutti i processi pronti abbiano avuto a loro volta l'attribuzione della risorsa cpu Diagramma delle transizioni di stato di un processo (un sottoinsieme): Selez.proc.pronto Pronto in esecuzione Termine quanto Complet. I/O Richiesta I/O attesa Di momento in momento un solo processo è in esecuzione ed il resto dei processi non terminati appartiene ad uno dei tre insiemi: insieme dei processi pronti costituito da tutti i processi che sono in condizione di continuare l'esecuzione ma aspettano per l'attribuzione della CPU insieme dei processi in attesa di un evento esterno costituito da tutti i processi che non sono in condizione di proseguire l'esecuzione in quanto in attesa che venga completata una operazione di I/O La gestione della memoria centrale Con l'aumentare della sofisticazione del sistema operativo (multiprogrammazione o multiutenza) cresce il numero di processi che dovrebbero contemporaneamente risiedere in memoria principale e di conseguenza cresce la memoria richiesta. Per motivi di costo la memoria di cui si può disporre è comunque limitata e va amministrata tra quella occupata dal sistema operativo e quella residua da destinare alla esecuzione dei programmi. Il gestore della memoria implementa uno spazio di indirizzamento virtuale di dimensioni maggiori della memoria fisica e realizza una serie di meccanismi di protezione che tutelano lo spazio di lavoro attribuito per l'esecuzione di ciascun programma ossia la memoria attribuita a ciascun processo. L'incompatibilità tra dimensione fisica della memoria e spazio complessivo richiesto dai programmi da eseguire e dai loro dati è risolta dal gestore della memoria tramite un insieme di tecniche tra cui 1. La rilocazione: diventa possibile il caricamento di un programma a partire da un indirizzo qualunque della memoria ed anche modificare la memoria attribuita ad un programma durante l'esecuzione del programma stesso in modo completamente trasparente 2. swapping, paginazione e memoria virtuale: consentono di ridurre le richieste di spazio tenendo in memoria soltanto una porzione dei programmi e dei dati 3. segmentazione: consente la condivisione da parte di alcuni processi dell'area di memoria utilizzata per codice Rilocazione del codice Rilocazione statica: all'atto del caricamento in memoria tutti i riferimenti ad indirizzi di memoria generati in fase di traduzione del programma nel linguaggio macchina nell'ipotesi che il programma sia caricato in memoria a partire all'indirizzo zero vengono aggiustati sulla base dell'indirizzo di impianto del programma (indirizzo di memoria a partire dal quale il programma sarà effettivamente caricato in memoria) Rilocazione dinamica: introduzione di un ulteriore registro (registro base) che contiene di momento in momento l'indirizzo di impianto del programma in esecuzione. Prima di realizzare un qualunque accesso alla memoria occorre valutare l'indirizzo fisico corrispondente che si ottiene sommando il contenuto del registro base all'indirizzo logico (quello specificato dal programma nelle ipotesi di indirizzo di impianto zero) Swapping, paginazione e memoria virtuale. Swapping: consente di soddisfare richieste di memoria che complessivamente eccedono la memoria fisica disponibile. Consiste nel trasferire il contenuto di una area di memoria necessaria per l'esecuzione di un programma su memoria di massa liberando così la memoria attribuita al processo (il processo è scaricato su memoria di massa). La scelta di quale processo scaricare dipende da politiche che non sono parte integrante del gestore della memoria, ma che in genere concentrano prioritariamente la scelta tra i processi in attesa. Il diagramma di transizione degli stati conseguentemente viene modificato in quanto esso prevede gli ulteriori stati attesa su disco e pronto su disco e le relative transizioni Paginazione: consiste nel dividere un programma in sezioni di dimensione fissa ed uguali tra loro (pagine logiche) ed organizzando di conseguenza anche la memoria in pagine della stessa dimensione delle pagine logiche (pagine fisiche). Si possono così eseguire programmi di dimensioni maggiori, si ottimizza ulteriormente l'uso della memoria e si possono eseguire programmi con richieste di memoria eccedenti la memoria fisica disponibile (memoria virtuale). Segmentazione La struttura di un programma non è più monolitica, bensì si individuano tre segmenti: dati, codice e pila Diventa possibile consentire a più processi di condividere la stessa area codice (essa è immutabile) e pertanto più esecuzioni dello stesso programma in contemporanea non richiedono duplicazione di codice (programmi rientranti) Principali sistemi operativi per personal computer Microsoft MS-DOS: il sistema operativo per PC IBM e compatibili più usato finchè non è stato quasi totalmente rimpiazzato dalle varie versioni di Windows Interfaccia sintetica: schermo nero, il prompt in un angolo (C:\>indica attesa di comandi) L’interazione è tramite digitazione da tastiera del comando, rispettando una sintassi precisa e richiedendo l’esecuzione del comando tramite il tasto invio Limiti del Dos Richiede una conoscenza dei comandi disponibili e della sintassi È un sistema operativo a 16 bit (usa 16 bit per la rappresentazione dei dati) pertanto ha prestazioni limitate È nato come sistema monoutente in grado di eseguire una sola applicazione alla volta MS-Windows: è una interfaccia grafica utente (GUI) che offre un involucro grafico al Dos I comandi vengono sostituiti da icone (immagini che simboleggiano la funzione) e possono essere mandati in esecuzione tramite mouse o da tastiera Amplia le funzioni del Dos tramite una serie di programmi applicativi Win 95 , 98 2000: è un sistema operativo a 32 bit (quando esegue applicazioni di MS-DOS lavora a 16 bit) L’interfaccia grafica si richiama a quella di Windows e ne introduce alcune migliorie E’ un sistema multitasking (più programmi in esecuzione contemporaneamente) Sono presenti alcune caratteristiche tipiche degli ambienti Unix Possibile eseguire programmi in background Consente il collegamento a macchine connesse in rete con la nostra. Windows NT: Sistema operativo per workstation (stazioni di lavoro con elevate capacità grafiche ed elevata potenza) Incorpora tutte le funzioni di Win95 ed aggiunge la possibilità della multiutenza Usato prevalentemente per computer che operano come server rendendo disponibili file, stampanti, altri dispositivi ad utenti di una rete di computer. Macintosh (ad es. System 8): per macchine Apple Macintosh e PowerPC (contrapposte ai PC IBM e compatibili) che utilizzano processori con caratteristiche diverse dagli Intel (Motorola) Sistema operativo in concorrenza con il Dos con interfaccia grafica che ha anticipato di una decina di anni quella di Win95 Per primo introduce l’uso del mouse Facile da usare L’ incompatibilità con il Dos ne ha impedito una più ampia diffusione UNIX: nasce dalle esigenze di governare grandi elaboratori in multiutenza multitasking e connessione remota. Sviluppato dai laboratori Bell dell AT&T e dalla Berkeley University (inizio anni 70) è stato modificato dai costruttori di computer che hanno dato origine a varie versioni di Unix LINUX (Unix per PC): sistema operativo completo gratuito gestisce: multiutenza esecuzione in background accesso a computer remoti sistema di interfaccia a finestre etc.