SISTEMI OPERATIVI Introduzione Evoluzione delle tipologie Funzionalità tipiche del Sistema Operativo Introduzione Sappiamo che un sistema di elaborazione può essere suddiviso, in prima approssimazione, in due componenti: l’hardware e il software. Con il termine hardware si intende essenzialmente l’insieme dei costituenti fisici di un computer: circuiti integrati, fili, alimentatori, tubi a raggi catodici e altri dispositivi di questo genere. Con il termine software si intende una grandissima categoria di programmi e applicazioni, senza i quali un computer, secondo la definizione dell’autorevole professor Tanenbaum, non sarebbe altro che un “ammasso di ferraglia”. E’ il software, infatti, che consente ad un calcolatore di memorizzare ed elaborare informazioni, di inviare e ricevere e-mail da Internet, di far girare un gioco d’avventura, di eseguire tutta una serie di compiti, più o meno complessi, che lo rendono utile e, a volte, indispensabile. Classificazione del software Software Software di sistema Sistema operativo Programmi di utilità Software applicativo Editor, fogli di calcolo, browser, …….. Il sistema operativo è un insieme organizzato di programmi che assolve a due funzioni fondamentali: semplifica l’uso delle risorse da parte dell’utente agendo da intermediario tra utente e il computer stesso controlla tutte le risorse dell’hardware in modo efficiente ed “equo” L’utente “vede” una macchina pronta ad interagire con lui, cioè gli viene presentata una interfaccia, che può essere testuale o grafica. Il sistema operativo propone un'astrazione della macchina fisica, dell’hardware, cioè una macchina virtuale con cui l’utente dialoga. 1 Valutazione delle prestazioni di un SO CPU activity: rapporto tra il tempo in cui la CPU opera e il tempo totale in cui il sistema funziona Throughput (produttività): misura quanto lavoro si può svolgere in una unità di tempo; ad esempio quante istruzioni al secondo o quanta attività della CPU viene dedicata all’utente misurata in un millisecondo Se molti utenti sono connessi al sistema la CPU activity sarà alta ma la produttività bassa a causa della quantità esigua di risorse destinate a ciascuno. I processi Un processo è un insieme formato da un numero finito di azioni da eseguire in sequenza e dai dati che le azioni elaborano. Il processore è l’oggetto che fa evolvere il processo. L’esecuzione di un programma genera almeno un processo formato dalla sequenza delle operazioni del programma stesso. In memoria centrale si possono trovare processi in esecuzione, pronti, in attesa di I/O Nelle memorie di massa si trovano i processi parcheggiati. Stati possibili di un processo •Parcheggio: attende di essere caricato in memoria centrale •Pronto: attende che gli venga assegnata la CPU •Esecuzione: è in evoluzione perché gli è stata assegnata la CPU •Attesa: richiede una operazione di I/O su una periferica •Terminazione: è stato completato e può essere tolto dalla memoria centrale. Il sistema operativo genera a partire dall’hardware, una gerarchia di macchine virtuali, che viene spesso rappresentata con il modello onion skin (a buccia di cipolla). Il sistema operativo è visto come una successione di strati costruiti sopra l’hardware. Ogni strato è una macchina virtuale Modello Onion Skin UTENTI INTERPRETE DEI COMANDI ↓ FILE SYSTEM ↓ GESTIONE DELLE PERIFERICHE ↓ GESTIONE DELLA MEMORIA ↓ NUCLEO (KERNEL) ↓ HARDWARE 2 Una classificazione dei S.O. •Un sistema è detto monoprogrammato quando la sua memoria centrale contiene in un dato istante, codice proveniente da un solo programma dell’utente. •La multiprogrammazione è una tecnica di avanzamento di più processi da parte di una sola CPU, apparentemente simultanei, basata sulla assegnazione della stessa risorsa in tempi diversi. La multiprogrammazione-1 L’obiettivo da raggiungere è il massimo rendimento della macchina grazie all’impiego dei tempi morti della CPU, per svolgere altri lavori. Una frazione del tempo recuperato è impiegata dal sistema per l’attività di gestione. Si applica il time sharing: una risorsa è gestita in time sharing ( a partizione di tempo) quando il suo uso è concesso per un tempo che non può superare il massimo; questo intervallo è il time slice. Se la CPU è gestita in time sharing, viene assegnata ad un processo fino a che •Il processo termina •Il processo richiede l’uso di altri dispositivi •Scade il time slice La multiprogrammazione-2 Quando accade uno di questi eventi il controllo della CPU passa al sistema operativo che decide a quale tra i vari programmi in memoria centrale spetti il time slice. Il modo in cui il SO prende queste decisioni è un esempio di politiche di gestione. Il tempo necessario alla decisione è detto tempo di riassegnamento. La politica più semplice è il round robin, in cui il programma a cui è stata tolta la risorsa viene messo in fondo ad una coda di attesa. Si possono anche usare meccanismi di priorità •Sistemi a “lotti” o batch (1955-60) •I sistemi a lotti multiprogrammati •I Sistemi time sharing •Sistemi per Personal Computer •I Sistemi Paralleli (multiprocessori) •I Sistemi distribuiti •I Sistemi Real Time L’evoluzione dei S.O. I sistemi batch Eseguivano un programma alla volta senza nessuna interattività. L’unica forma di concorrenza tra diverse attività era il cosiddetto spooling, ovvero la possibilità di sovrapporre l’output di un programma con il calcolo di quello successivo e l’input di un terzo ancora .. (un esempio di questa classe era l’IBM 7094 con SO IBSYS). I sistemi a lotti multiprogrammati-1 I costi elevatissimi dei calcolatori imposero di ridurre la quantità di tempo nel quale la CPU rimaneva inattiva. Per questo si iniziarono ad usare “pool” di programmi che si alternavano in esecuzione per mantenere la CPU occupata; In questi sistemi si realizza per la prima volta la cosiddetta “virtualizzazione dei dispositivi” ovvero l’utilizzo di aree di memoria su disco sia per la lettura che la scrittura che consentivano al processore di non essere vincolato alla lentezza dei dispositivi. Un esempio notevole di questa classe è stato l’IBM OS/360. 3 Si presentano per la prima volta due nuove problematiche: •lo scheduling dei job per decidere quale job caricare in memoria •scheduling del processore per decidere quale tra i job “pronti” mandare in esecuzione. Altre due funzioni rese necessarie dalla multiprogrammazione sono: •la protezione reciproca dei processi utente da eventuali interazioni non desiderate; •la gestione della memoria per ottimizzarne l’utilizzo viste le dimensioni generalmente limitate; Sistemi time-sharing •Il time sharing (detto anche multitasking) è una estensione della multiprogrammazione che introduce l’interattività, i sistemi TS commutano i programmi in esecuzione frequentemente consentendo all’utente di interagire con un linguaggio di comandi, editors, etc. •Problemi Fondamentali: Gestione della concorrenza, protezione, schedulazione della CPU, prevenzione di situazioni di stallo, memoria virtuale. •Nota bene: i problemi dei SO TS sono i problemi dei SO moderni!! •Primi Esempi di sistemi TS sono il CTSS (MIT) progettato nei primi anni 60 e il MULTICS (MIT, Bell e GE) sviluppato nella seconda meta degli anni ‘60. Per arrivare a sistemi TS commerciali come la versione TSO del OS 360 dobbiamo invece arrivare ai primi anni 70 I Sistemi per Personal Computer •I SO per PC nascono negli anni 60 con forti limitazioni dovute alle scarse potenzialità hardware. Generalmente non supportavano la multiprogrammazione e non offrivano alcuna forma di protezione. •Con l’evoluzione incredibile di questi sistemi si e’ verificato uno slittamento delle caratteristiche incluse nei SO nati per mainframes verso i SO usati minicomputers (es. MULTICS nato per GE --> Unix progettato per PDP-11), •Molte caratteristiche di Unix sono poi migrate ai sistemi per PC (microcomputers) più diffusi come: Windows NT, IBM OS/2 o Macintosh OS. •Questo processo continua oggi con le caratteristiche più avanzate come il supporto alle architetture multiprocessore e alle reti. I limiti tra le diverse classi di architetture tendono a sfumare. I Sistemi Paralleli (multiprocessori) •Mentre i sistemi classici sono sequenziali, cioè sono dotati di una sola CPU, che svolge una singola azione alla volta, nei sistemi paralleli il singolo processo elaborativo è scomposto in una serie di processi portati avanti contemporaneamente da più processori. •Esempi di SMP sono l’Ultra80, una workstation che può contenere sino a 4 processori SPARC, il server 10000 Starfire che può contenere sino 64 processori SPARC. I Sistemi distribuiti •In questi sistemi più calcolatori operano, senza condividere clock o memoria, connessi mediante reti di diversa natura (LAN,WAN etc.). Le principali motivazioni per i sistemi distribuiti sono: •la condivisione delle risorse quali files, dispositivi, CPU •l’incremento delle prestazioni •Per ottenere un miglioramento delle prestazioni sono fondamentali le politiche di distribuzione e bilanciamento del carico •I SO distribuiti devono fornire semplificazioni nell’utilizzo delle risorse remote , la realizzazione di forme efficienti e sicure di comunicazione. Sistemi Real Time •In un sistema real time è necessario che le funzioni di sistema siano completate entro limiti di tempo predeterminati. Sono indispensabili per diverse applicazioni “critiche” come i processi di controllo industriale, esperimenti, sistemi di sicurezza etc. •Si distinguono due tipi di sistemi: 4 –hard real time: utilizzano dispositivi dedicati con memorie ROM, sono gli unici veramente utilizzabili in compiti critici quali esperimenti, controllo di satelliti etc. –soft real time: offrono privilegi ai task che sono segnati come real time nello scheduling ma non offrono garanzie sui tempi di completamento (es. Unix, Mach, NT). Vediamo brevemente la struttura del modello Onion Skin Il nucleo (o kernel) Il nucleo è la parte del SO più vicina alla macchina ed è strettamente dipendente dall’’hardware. Le sue funzioni fondamentali sono: •Avvio e terminazione dei processi •Assegnazione della CPU ai diversi processi •Sincronizzazione tra i processi •Sincronizzazione dei processi con l’ambiente esterno Le norme che regolano le assegnazioni sono dette politiche di scheduling. Tra esse la più semplice è il round robin che prevede una coda di processi in attesa. Si può affinare questa politica organizzando i processi pronti su diverse code, corrispondenti alle diverse priorità Il gestore dei processi (scheduler), è anch’esso un processo con priorità massima, così come il processo che si occupa della gestione delle interruzione deve avere priorità maggiore rispetto agli altri. Con interruzione si intende la segnalazione al processore che è accaduto un evento di più alta priorità che deve essere servito: la sequenza normale degli eventi deve essere temporaneamente sospesa. Si può trattare di una interruzione esterna (ad es. immissione di un dato) o interna come il verificarsi di un errore di esecuzione (ad es. una divisione per zero) La gestione delle interruzioni si accompagna necessariamente alla multiprogrammazione La Gestione della Memoria Al momento dell’esecuzione ogni programma deve risiedere, almeno in parte, nella memoria centrale. Visto che la multiprogrammazione e il Time Sharing provocano frequenti alternanze tra i processi in esecuzione la gestione efficiente della memoria è fondamentale per l’efficienza del sistema di calcolo. In particolare il SO deve: • tenere traccia dell’occupazione della memoria in modo efficiente per poter prendere le decisioni sulla gestione in modo rapido; • scegliere di volta in volta quale processo caricare con lo scopo di minimizzare il numero di movimenti; • poter allocare e deallocare dinamicamente dello spazio in modo efficiente in modo da poter aumentare il numero di processi che possono risiedere in memoria contemporaneamente. Gestione della memoria Le partizioni La memoria centrale è divisa in un certo numero di locazioni, una parte del quale è stabilmente occupata dal S.O. Nelle locazioni restanti sono caricati i vari processi. Partizioni fisse: gli indirizzi liberi sono divisi in blocchi di dimensioni fisse: una tabella contiene le informazioni relative ad ogni blocco. Quando si richiede l’esecuzione di un programma, il S.O. consulta la tabella e lo carica in un blocco libero, quando un programma termina il S.O. libera il blocco corrispondente. Partizioni variabili: non si impone un insieme fisso di partizioni ma si caricano i programmi ovunque ci sia spazio libero sufficiente, seguendo vari criteri per scegliere il blocco migliore. Questo metodo sfrutta meglio la memoria a prezzo di un maggiore carico di lavoro del sistema operativo. 5 Gestione della memoria - La memoria virtuale Se i programmi sono molto grandi e non possono essere caricati completamente in memoria centrale si usa la memoria virtuale. Viene caricata in memoria solo una parte di ciascun programma, lasciando il resto in memoria di massa, caricando altre parti solo quando servono e liberando memoria quando non servono più. La memoria centrale virtualmente disponibile diventa così maggiore. Ovviamente la memoria virtuale impone un rallentamento nell’esecuzione dovuto ai trasferimenti di codice dal disco. L’operazione relativa allo spostamento di processi dalla memoria al disco e viceversa prende il nome di swapping. La gestione della memoria virtuale si attua con La paginazione: ogni programma è diviso in blocchi di uguali dimensioni detti pagine logiche, la memoria centrale è divisa in pagine fisiche delle stesse dimensioni. Vengono caricate le pagine logiche quando servono nelle pagine fisiche libere. La segmentazione: è una tecnica analoga alla precedente solo che la suddivisione del programma è effettuata in base a criteri logici e può essere controllata dal programmatore. La Gestione delle periferiche Il terzo livello del S.O. deve definire dispositivi virtuali tali che: •Rendano disponibili le capacità della periferica nascondendo il modo in cui essi colloquiano con il processo. •Gestire i più comuni problemi che possono succedere (errori di trasmissione, periferiche disattivate). Attraverso questo modulo inoltre il sistema mette a disposizione di più utenti una pluralità di periferiche virtuali attraverso lo spooling (SPOOL=Simultaneous Peripheral Operation On Line), grazie al quale più processi possono usare la stessa periferica contemporaneamente . Nei sistemi multiutente è frequente il caso in cui siano collegati più terminali che stampanti; perciò se più utenti chiedono contemporanemente l’accesso alla stessa stampante il sistema si trova in una situazione di conflitto. La situazione si risolve generando gli output prima su disco (file di spool) in aree riservate ai vari utenti e lanciandone successivamente la stampa di uno per volta. Un processo di sistema, lo spooler, gestisce i trasferimenti da disco all’opportuna periferica. Il file system Il file system virtualizza le memorie di massa. Tutto ciò che viene registrato su memorie di massa è un file: testo, programma, comando, suono, immagine… Sui file si opera come con gli archivi cartacei, creandone di nuovi, distruggendoli se non servono più, aggiungendo, eliminando, modificando record. Il file system permette al programmatore e all’utente di riferirsi ai file senza preoccuparsi della registrazione fisica dei dati su un supporto. Il file system permette di riferirsi alle informazioni usando identificatori e non indirizzi fisici, usando le tabelle dei descrittori che contengono informazioni su ogni file, come il nome del file, la sua posizione, la data di creazione, il numero di record contenuti, la dimensione del record, le modalità di accesso. Il file system viene generalmente organizzato in una struttura ad albero, per mezzo di contenitori chiamati directory, che possono raccogliere al loro interno file e altre directory. La direttrice root non è contenuta in altre direttrici ed è allocata in una posizione nota al sistema. La direttrice corrente è quella presente in memoria centrale e i file in essa contenuti sono identificati dal loro nome. Per individuare file di altre direttrici si dovrà invece indicare il pathname, cioè il nome completo che elenca tutti i nodi che uniscono la directory corrente con il file desiderato. Il pathname è assoluto se comincia dalla root, relativo se comincia dalla directory corrente. 6 Riassumendo, tra i compiti principali di un file system troviamo: •Implementare vari tipi di file •Consentire la condivisione dei file •Garantire un buon livello di protezione •Permettere il maggior numero possibile di funzioni sui file •Gestire in modo efficiente ma trasparente per l’utente le aree di memoria raggiungendo un compromesso tra esigenze contrapposte, come ridurre lo spazio occupato e diminiure il tempo di accesso. L’interprete dei comandi E’ l’ultimo strato, quello a diretto contatto con l’utente. Praticamente è un programma che riceve in input le richieste di esecuzione di operazioni, espresse usando il linguaggio comandi. Si è evoluto con l’evolversi dei sistemi operativi. Fondamentalmente è di due tipi: testuale e grafico. Esempi tipici di interpreti sono le shell testuali di Unix e MS-DOS e le interfacce grafiche di sistemi come Macintosh OS e Windows. ___________________________ La protezione e la sicurezza La multiprogrammazione e la multiutenza impongono che le risorse utilizzate dai processi e lo stesso S.O. siano protetti da interazioni non desiderate, attacchi o tentativi di accaparramento. Ogni S.O. utilizza un certo modello di protezione per stabilire chi può accedere a cosa, tale modello utilizza come soggetti i processi limitandone il potere di inferenza con vari meccanismi, ad esempio: •controllo dei diritti di accesso dei processi ai files; •operazioni di I/O solo tramite chiamate di sistema e non a controllo di programma (evita per esempio l’aggiramento della protezione sui files!!); •Gestione a quanti di tempo della CPU per impedirne l’accaparramento da parte dei processi Qualche definizione Fat: File Allocation Table, indica la tabella usata da alcuni sistemi (ad es. DOS) per tenere traccia dei vari files sul disco. NTFS: file system avanzato per la gestione dei file in Windows NT. Multitasking: esecuzione contemporanea di più applicazioni da parte di uno stesso sistema Multiutente: sistema di elaborazione in grado di servire più utenti nello stesso tempo Portabilità: indica la caratteristica di un S.O. di funzionare su diverse piattaforme hardware BIOS: Basic Input Output System. E’ un software memorizzato su un particolare chip . Si occupa di interfacciare la CPU ed i vari componenti hardware. Il BIOS originariamente era contenuto nella memoria ROM (Read Only Memory) ossia in un tipo di memoria accessibile unicamente in lettura e non in scrittura. Pertanto era impossibile da modificare o da sovrascrivere. Era quindi impossibile cancellare il BIOS per errore. Oggi non e' piu' cosi, in quanto il BIOS e' aggiornabile con le nuove versioni che vengono prodotte, pertanto non e' contenuto nella memoria ROM ma in particolari memorie di tipo FLASH che permettono di aggiornare il BIOS via software, utilizzando cioè uno specifico programma di aggiornamento. I dati di configurazione usati dal BIOS sono modificabili dall'utente usando l'apposito menu, raggiungibile premendo un tasto o una sequenza di tasti particolari all' accensione della macchina. In fase di avvio d il BIOS effettua tre fasi di controlli che sono, rispettivamente: 1. autodiagnostica (controllo dello stato della RAM) 2. controllo della presenza di hardware collegato al PC (fase poco visibile all'utente) e abilitazione di quello collegato e acceso 7 3. caricamento della parte residente del Sistema Operativo (bootstrap) nella memoria RAM Il programma di configurazione - eseguito ad ogni avvio - controlla che quanto memorizzato come configurazione della macchina sia presente e funzionante e, in caso contrario, si arresta segnalando errori con una serie di beep. Interrupt: Interruzione. Segnale tramite il quale le schede di espansione e gli altri componenti hardware richiedono la CPU. Ogni componente dovrebbe utilizzare un proprio interrupt. Interruzione interna: interruzione generata all'interno di un programma. IRQ: Abbreviazione di Interrupt ReQuest. Un IRQ e' una linea hardware attraverso la quale una periferica puo' inviare un interrupt alla CPU 8