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