Sistema Operativo Software che sovrintende al funzionamento del

dispensa a cura di Alessandro Bellini Sistema Operativo Software che sovrintende al funzionamento del computer eseguendo compiti diversi: 1.
2.
3.
4.
5.
Gestire interazione utente – macchina Fornire un interfaccia alle applicazioni e risorse del computer Gestire la condivisione delle risorse Ottimizzare l’uso delle risorse Fornire servizi allo sviluppo del software e all’amministrazione del sistema. I moderni PC possono funzionare con: Linux, Windows XP, Windows 7, Mac OS X. In tutti questi ambienti è sufficiente un clic su un icona per avviare un esecuzione senza che l’utente sia a conoscenza dei dettagli di ciò che accade. Per l’utente conoscere un sistema operativo significa conoscere quali comandi inviare al sistema per ottenere gli effetti desiderati. Lo scopo dell’interfaccia è quello di nascondere la complessità dell’hardware all’utente ed alle applicazioni software stesse fornendo dei servizi per lo svolgimento dei compiti. La presenza contemporanea di molti utenti richiede di gestire le risorse del sistema in modo da condividerle senza che essi si ostacolino a vicenda. La CPU deve eseguire molti programmi come se ogni utente avesse un computer a lui dedicato. Analoghe considerazioni si possono fare per la memoria centrale e quelle di massa e le periferiche. La memoria centrale deve essere condivisa tra tutti i programmi in esecuzione, impedendo che un programma possa invadere lo spazio di memoria già assegnato ad un altro. Il disco che contiene dati di tutti gli utenti deve essere utilizzato con sicurezza contro i malfunzionamenti o i guasti accidentali e riservatezza delle informazioni memorizzate nei file. Un utente deve avere la garanzia che il contenuto dei file possa essere esaminato e modificato solo dal proprietario e da altri utenti autorizzati. Le unità periferiche devono poter essere utilizzate da tutti senza interferenze. La condivisione delle risorse non solo deve essere possibile ma deve anche essere efficiente. Il sistema operativo deve rispondere a tutti gli utenti in un tempo breve garantendo l’ottimizzazione della condivisione della risorsa. La necessità della condivisione non è limitata alla multiutenza ma è una esigenza anche per i PC. I diversi programmi che possono essere contemporaneamente attivi rappresentano diverse utenze per il sistema operativo. L’esecuzione contemporanea di più programmi di un medesimo utente si dice multitasking. L’esecuzione contemporanea nel caso della multiutenza si dice multiprogrammazione. La gestione e l’amministrazione di un computer è evidente nei grandi sistemi dove è necessario tenere conto dell’utilizzo delle risorse anche per quantificare i costi per l’utilizzo del sistema. Si pensi anche al moderno cloud computing. Gli stessi servizi sono svolti anche dai PC, si pensi a windows che tramite la scheda proprietà di un file fornisce le informazioni sulla dimensione e lo spazio effettivamente occupato su disco, data ed ora di creazione, ultima modifica ed accesso. Il sistema inoltre fornisce servizi per compressione e crittografia. Risorse hardware e software 1 dispensa a cura di Alessandro Bellini Il sistema operativo interagisce direttamente con l’hardware che fornisce come servizio risorse elaborative. Il sistema operativo fornisce a sua volta servizi al software applicativo. Quest’ultimo fornisce servizi agli utenti e utilizza servizi del sistema operativo. Questa visione a strati di un computer ha comunque varie eccezioni. Molti dbms ad esempio non utilizzano servizi del sistema operativo per la gestione dei file di database ma interagiscono direttamente con l’hardware per ottimizzare le prestazioni di sistema. Differenti classi di utenti hanno visioni diverse del computer. I programmatori di applicazioni e i programmatori di sistema interagiscono direttamente con il sistema operativo tramite chiamate di sistema (system calls) : Call Exec(OperazioneRichiesta, Parametri). Esse sono sempre richiamabili dal linguaggio assembler e spesso anche dai linguaggi ad alto livello, sono anche indicate con il termine API (Application Programmer Interface). Con le chiamate di sistema è possibile interagire direttamente con il sistema operativo per richiederne i servizi. I programmatori possono interagire indirettamente con il sistema operativo anche con le istruzioni del linguaggio. Si pensi alle istruzioni di scrittura e lettura da un file che il compilatore traduce nelle relative chiamate di sistema. Gli utenti finali vedono il computer tramite una interfaccia che fornisce l’accesso limitatamente ai comandi di sistema ( mandare in esecuzione una applicazione, visualizzare elenchi di file, copiare e spostare file tra directory) ed alle applicazioni. La shell dei comandi è una interfaccia specifica per i comandi di sistema. Spesso in uno stesso sistema operativo i comandi possono essere inviati da diverse shell ( a caratteri o riga di comando, prompt dei comandi oppure grafica). La shell è eseguita al di sopra del sistema operativo perciò può essere considerata software di sistema. Nei moderni sistemi operativi per PC l’interazione con l’utente avviene con modalità grafica. Osserviamo infine che il sistema operativo è composto di una parte centrale detto nucleo o kernel ovvero un programma sempre in esecuzione in memoria centrale. Il sistema operativo è eseguito in modalità riservata. Il processore è in questo caso abilitato ad eseguire ogni istruzione comprese le più pericolose e delicate per il funzionamento del computer. In modalità utente il processore può eseguire invece un insieme ristretto di istruzioni macchina. L’architettura dei processori 80386 e superiori definisce quattro livelli di privilegio, detti anelli, per la protezione del codice e dei dati di sistema dalla sovrascrittura involontaria o non autorizzata da parte di codice con livelli di privilegio inferiori (Intel Protection). Il livello di privilegio 0 è detto modalità kernel, il livello 3 è la modalità utente. Windows 98 e NT utilizzano solo gli anelli 0 e 3. Ambiente mono programmato: questo è il caso in cui viene eseguito un programma per volta in successione. La CPU ha in questo caso molti tempi morti, in quanto ogni programma ha interazioni penalizzanti con le periferiche e in questi tempi la CPU resta in stato di attesa. Un esempio è il sistema operativo MS‐DOS . MS‐DOS è monoutente ed è un ambiente single tasking. Ambiente multi programmato: L’esigenza di sfruttare il tempo CPU trova una risposta nei sistemi multi programmati. La CPU passa ad eseguire altri programmi durante i tempi morti di attesa del completamento dell’ I/O di un programma. La probabilità che tutti i programmi siano in fase di I/O 2 dispensa a cura di Alessandro Bellini è bassa e perciò viene ridotto il tempo in cui la CPU resta inattiva. Una gestione efficace della multiprogrammazione richiede però servizi forniti da hardware specifici che rispondono a precise esigenze: •
•
•
•
•
Implementare politiche di protezione della memoria per evitare interferenze tra programmi contemporaneamente in esecuzione Controllare che un programma in esecuzione non monopolizzi il sistema a scapito di altri Limitare l’intervento della cpu nelle operazioni di lettura scrittura dei dati grazie al DMA Gestire le interruzioni Implementare la tecnica di spooling nelle operazioni di I/O La protezione della memoria richiede ad esempio i registri limite che delimitano lo spazio di memoria occupato da un programma P1. Il sistema operativo prima di mandare in esecuzione P1 carica gli indirizzi limite con valori opportuni, durante l’esecuzione l’hardware controlla che gli indirizzi generati da P1 rientrino nei valori limite pena l’interruzione del programma e il ritorno del controllo al sistema operativo. Il controllo sulla monopolizzazione richiede l’uso di un timer che avverta il sistema operativo quando scade il tempo limite prefissato. Il DMA è un dispositivo in grado di gestire il trasferimento dei dati da memoria a periferica senza coinvolgere la CPU. L’azione del DMA è iniziata dal processore che lo informa su origine e destinazione e quantità dei dati da trasferire e poi delega a questo il compito del trasferimento. Il DMA lavora cioè in parallelo alla CPU. Al termine viene inviato un segnale al processore. In un sistema multi programmato i programmi eseguono operazioni di I/O in parallelo e si devono evitare le interferenze, per esempio le righe di stampa di un programma si sovrappongono a quelle di un altro. La tecnica dello spooling che prende il nome da Simultaneous Peripheral Operation On Line permette di risolvere il problema (anni 60): 1‐ I programmi scrivono i loro dati in appositi file su disco. L’output non è più inviato al dispositivo fisico ma a porte virtuali assegnate e gestite dal sistema operativo. 2‐ Quando un programma termina l’esecuzione il sistema operativo invia l’intero output alla periferica. La scrittura sulla periferica è gestita dal sistema operativo mettendo i coda gli output dei vari programmi. Gestione del tempo CPU Un programma che usa molto la CPU e occupa poco tempo per operazioni di I/O si dice CPU bound. Il comportamento opposto è detto I/O bound. Nella multiprogrammazione quando un programma prende possesso della CPU lo mantiene sino alla prossima operazione I/O o fino alla fine. In questo modo sono privilegiati i programmi CPU bound. Un programma per gestire tastiera e video ha moltissime operazioni di I/O e quindi verrebbe interrotto molte volte obbligando l’utente che opera al terminale ad avere lunghi periodi di attesa, nei quali la CPU è occupata a terminare l’esecuzione dei programmi CPU bound. Per evitare queste situazioni il sistema operativo deve interrompere l’esecuzione di un programma per mandare in esecuzione un altro. 3 dispensa a cura di Alessandro Bellini Ci sono diverse strategie di interruzione che possono essere adottate. Priorità – Ai programmi viene assegnata una priorità che misura l’importanza e l’urgenza della esecuzione. I programmi sono eseguiti in ordine di priorità. Quando un utente manda in esecuzione un nuovo programma il sistema operativo ne controlla la priorità e nel caso interrompe il programma in esecuzione per far partire la nuova richiesta. Quando un programma si ferma per I/O viene mandato in esecuzione il programma con priorità più elevata. Time sharing – In questo caso esiste un tempo massimo concesso per l’esecuzione di un programma detto time slice. Ogni programma è considerato ugualmente importante e sono eseguiti ciclicamente. Quando un programma viene interrotto da I/O oppure perché ha superato il time slice viene messo alla fine della coda di attesa. Questa tecnica prende il nome di Round Robin. Nei sistemi operativi attuali vengono utilizzate entrambe le tecniche inoltre il sistema operativo modifica la priorità dei programmi in base al loro comportamento. Ad esempio Windows NT è multitasking e multiutente. Una applicazione scritta per windows è costituita da uno o più processi. Un processo è un programma in esecuzione. Un processo dispone di un intervallo di indirizzi e di risorse assegnate; nel contesto del processo vengono eseguiti uno o più thread. Un thread è l’unità base alla quale il sistema operativo destina tempo di elaborazione, è l’unità di codice più piccola programmabile per l’esecuzione. Un thread viene eseguito nell’ intervallo di indirizzi del processo e utilizza le risosrse del processo. MS‐DOS e i programmi windows a 16bit dispongono di un solo thread per processo. Un programma per windows a 32bit può disporre di più thread per processo. Esistono due tipi di multitasking: preemptive e cooperative. Un ambiente di tipo cooperative come Windows 3.1, l’utilizzo del processore non viene mai tolto arbitrariamente ad un task: il task stesso deve consentire il rilascio del controllo prima che sia possibile eseguire un qualsiasi altro task. Windows NT usa il preemptive: il sistema operativo può assumere il controllo del processore senza la collaborazione del task. Il processo di assunzione del controllo è detto prelazione o preemption. I programmi eseguiti in un sistema operativo con multitasking cooperative devono contenere gli elementi di codice necessari per trasferire il controllo del processore ad intervalli frequenti altrimenti può determinarsi un blocco. Per i thread i livelli di priorità vanno da 0 a 31. Il thread con priorità più alta utilizza il processore per una partizione di tempo( time slice). La priorità di ciascun thread è determinata dai seguenti criteri: classe di priorità del relativo processo, livello di priorità del thread all’interno della classe di priorità del relativo processo. Il livelli di priorità di windows sono suddivisi in due classi: Tempo reale è utilizzata per attività critiche del sistema operativo (priorità da 16 a 31); in genere questa classe di priorità non è utilizzata per le applicazioni. Priorità variabile (livelli di priorità da 0 a 15) consentono di determinare la priorità di utilizzo del processore da parte delle applicazioni. 4 dispensa a cura di Alessandro Bellini Un processo può avere i seguenti livelli di priorità: basso ‐ Avvia l’applicazione con valore di priorità 4 normale ‐ Avvia l’applicazione con valore di priorità 7 alto ‐ Avvia l’applicazione con valore di priorità 13 tempo reale ‐ Avvia l’applicazione con valore di priorità 24 Simmetric Multi Processor I sistemi operativi attuali devono poter gestire il funzionamento di più processori. In questi sistemi il parallelismo nell’esecuzione è reale e non solo simulato per effetto della multiprogrammazione. In un sistema SMP ci sono diversi processori che accedono alla stessa memoria. Tutte le CPU hanno il medesimo ruolo e i programmi in esecuzione compresi i processi del sistema operativo sono eseguiti su uno qualsiasi dei processori disponibili (da cui il termine simmetrico). In alternativa è il metodo master‐slave in cui un processore è dedicato al sistema operativo che controlla il funzionamento e distribuisce il lavoro agli altri. Funzioni e struttura del Sistema Operativo Si è detto che un sistema operativo si prefigge obiettivi di convenienza, efficienza, versatilità e ottimizzazione. Le principali risorse che devono essere gestite sono: •
•
•
•
Il sistema operativo deve assegnare il processore ai programmi in attesa di esecuzione operando opportune scelte Il sistema operativo deve essere in grado di allocare porzioni di memoria ai programmi Il sistema operativo opera trasferimenti di dati I/O richiesti dai programmi e ne controlla l’avvenuta esecuzione Il sistema operativo deve fornire servizi per la gestione dei file dove gli utenti memorizzano le informazioni Nella gestione delle risorse, il sistema operativo dispone di apposite strutture dati e di programmi per i seguenti compiti: •
•
•
Il sistema operativo deve conoscere se ci sono processori liberi e se c’è abbastanza memoria libera per allocare il programma in memoria. Devono esserci strutture dati che descrivono in modo aggiornato lo stato delle risorse. Il sistema operativo deve avere una politica per operare le scelte nell’allocazione delle risorse. Può sottrarre memoria ad un programma per concederla ad un altro oltre alle tecniche basate su priorità e time slice. Il sistema operativo deve poter allocare e togliere risorse, deve avere caratteristiche hardware e software per poter interrompere un programma e far riprendere l’esecuzione successivamente. 5 dispensa a cura di Alessandro Bellini Il sistema operativo è perciò un software di grande complessità. Un utile modello concettuale che può rappresentare la gestione di risorse è il modello a strati. L’intero sistema è visto come una serie di livelli: 1‐
2‐
3‐
4‐
5‐
6‐
Hardware Gestione dei processi e del processore Gestione della memoria Gestione dei dispositivi Gestione delle informazioni Shell per gestire utenti ed applicazioni L’idea generale alla base di una organizzazione a livelli è la seguente: •
•
•
Ogni livello assolve a compiti specifici, utilizzando i servizi offerti dal livello inferiore e fornendo servizi al livello superiore Ogni livello è visto come una macchina virtuale in grado di fornire servizi Ogni livello opera sulla macchina virtuale del livello inferiore e costruisce una macchina virtuale più potente al livello superiore Nei sistemi operativi più moderni esiste un microkernel che si occupa solo di funzioni essenziali: gestione del processore,delle interruzioni e della comunicazione tra processi. Tutte le altre funzionalità sono trattate alla stregua delle applicazioni in un unico livello esterno al microkernel. In questi sistemi solo il livello del microkernel opera in modalità riservata. In questo modo si realizzano sistemi operativi più semplici e flessibili (smartphone). La manutenzione e l’evoluzione di questi sistemi risulta più semplice perché l’aggiornamento può limitarsi alla sostituzione di alcune applicazioni. Le diverse componenti del sistema operativo comunicano tra loro con messaggi e risultano quindi più adatti per i sistemi operativi distribuiti. Classificazione dei sistemi operativi Vediamo adesso di creare una classificazione del poliedrico universo dei sistemi operativi. In base alla modalità in cui possono funzionare si possono classificare in: •
•
Single user, single task: sono detti sistemi monoprogrammati o dedicati. La gestione delle risorse è semplice in quanto possono essere assegnate ad un solo programma monoutente. Si deve gestire solo la contemporanea attività del sistema operativo è necessario quindi qualche meccanismo per impedire al programma utente di accedere all’area riservata al sistema operativo. Il servizio più importante in questo tipo di sistemi operativi è la gestione dei file. Single user, multitasking: sono detti sistemi multi programmati e permettono all’utente di avviare più applicazioni contemporaneamente sfruttando meglio le risorse del sistema. La gestione delle risorse in questo caso è abbastanza complessa; il sistema operativo deve controllare che ogni processo possa ottenere tutte le risorse di cui ha bisogno senza interferire con gli altri processi in esecuzione e senza invadere le altrui zone di memoria. Una evoluzione dei sistemi multitasking sono i sistemi multithreading. I programmi che usano più di un thread necessitano di una precisa programmazione che indichi quali parti 6 dispensa a cura di Alessandro Bellini •
•
•
•
del codice possono essere eseguite virtualmente in parallelo. La gestione delle risorse in sistemi a più thread è complessa in quanto si deve non solo garantire la contemporaneità dei processi ma anche la condivisione tra i thread delle zone di memoria dei singoli processi. Multiuser: permettono l’uso della stessa macchina a più utenti. Ogni utente inizia una sessione di lavoro collegandosi con un proprio account e può svolgere quelle attività preventivamente autorizzate da un amministratore. La gestione delle risorse è analoga ai sistemi multitasking. Il processore viene assegnato a turno ai vari utenti (time‐sharing). Sistemi Real Time: sono usati per il controllo di processi industriali; in genere non interagiscono con l’utente ma con appositi sensori che controllano l’evoluzione del processo stesso. In questa tipologia la cosa più importante è il tempo di risposta che deve in genere essere rapida. La funzione principale di questi sistemi è la gestione degli interrupt che segnalano il verificarsi degli eventi da controllare. Sistemi Virtual Machine: in questo caso ogni utente o processo può usare un computer virtuale in cui l’hardware è simulato e diverso da quello fisicamente disponibile; in alcuni casi possono essere simulati anche più sistemi operativi. Sistemi operativi di rete: permettono lo scambio tra computer delle informazioni. Non vanno confusi con sistemi multiuser infatti permettono ad un solo utente di usare il computer mentre gli altri utenti con i loro sistemi operativi si collegano attraverso la rete per usare informazioni o programmi che si trovano sul disco di quel computer. Valutazione delle prestazioni di un sistema operativo Esistono due parametri che misurano l’efficienza di un sistema operativo: la percentuale di attività cioè il rapporto (TempoUtente + TempoDi Sistema) /TempoTotale che valuta quanto è sfruttato il processore e quanto rimane inattivo ed il throughput che indica il rapporto tra il numero dei processi eseguiti ed il tempo totale. In condizioni ottimali deve essere alto. Un parametro negativo è rappresentato dall’overhead di sistema, valutato dal rapporto tra il tempo impiegato dal processore per compiere attività di gestione e il tempo totale in cui il sistema è funzionante. Linux è un sistema multiutente,multitasking e multithreading; Dos è un sistema Single user e single task; Windows è un sistema operativo multitasking ma non è multiutente, Windows NT, 2000 e XP sono multithreading; le versioni server stesse sono sistemi operativi di rete in cui il solo utente del sistema è l’amministratore; gli accessi al sistema attraverso la rete sono visti come processi dell’amministratore in una logica client/server. 7