1. Introduzione
1. Dispositivi Fisici
Sono composti da un Unità Centrale chiamata CPU (Central Processing Unit), dalla memoria e dai
dispositivi Input/Output (dispositivi di immissione ed emissione dei dati).
2. Sistema Operativo
3. Programmi Applicativi
4. Utenti
Tramite l’utilizzo dei programmi applicativi il sistema operativo controlla e coordina l’utilizzo efficiente
dei dispositivi fisici definendo un ambiente nel quale i programmi applicativi possono collaborare e
lavorare in modo utile.
La CPU e i controllori di dispositivo accedono in modo concorrente alla memoria tramite cicli d’accesso
sincronizzati tramite la presenza di un controllore di memoria.
Controllore di Memoria
Memoria
Inizializzare i diversi componenti del sistema, dai registri della CPU ai controllori dei diversi
dispositivi, fino al contenuto della Memoria centrale.
Caricare nella memoria il Sistema Operativo
Avviare l’esecuzione del Sistema Operativo il quale avvia l’esecuzione del primo processo di
elaborazione (es: init) e si mette in attesa di eventi.
Un dispositivo fisico
In questo caso il segnale inviato alla CPU viene chiamato segnale d’interruzione o più brevemente
interrupt. Questo segnale viene inviato tramite il bus (canale di comunicazione) dal controllore del
dispositivo fisico o da altri elementi del sistema.
Un programma
In questo caso il segnale inviato alla CPU viene chiamato segnale d’eccezione o più brevemente
exception (o trap). Questo segnale viene inviato da un programma in esecuzione quando si
verifica un evento eccezionale che può essere:
- un errore
- una specifica istruzione, detta chiamata di sistema (system call), definita da un programma di
un utente che deve eseguire una funzione del sistema operativo
load : Quando la RAM deve, in modo esplicito, trasferire il contenuto di una parola in uno dei
registri della CPU.
Store: Quando la CPU deve, in modo esplicito, copiare il contenuto di uno dei registri nella
locazione di memoria specializzata della RAM.
Quando la CPU deve eseguire un istruzione, in modo implicito, la preleva dalla RAM (fetch) in modo
automatico e la trasferisce nel registro di istruzione.
In linea teorica, si vorrebbe che sia i programmi che i dati trattati potessero risiedere in modo
permanente nella RAM ma questo non è possibile perché la capacità della RAM non è sufficiente per
contenere in modo permanente tutti i dati e i programmi richiesti e perché la RAM è un
dispositivo di memorizzazione volatile, sicché perde il proprio contenuto quando si spegne il
sistema di calcolo.
Per queste ragioni per conservare le informazioni in modo permanente vengono utilizzate memorie
secondarie. Il dispositivo comunemente impiegato per questo scopo è l’unità a disco magnetico che
rappresenta un sistema di memorizzazione non volatile.
Anche un disco RAM può essere progettato per essere non volatile ma durante il solito funzionamento
il disco RAM memorizza i dati in un capiente vettore DRAM (che è volatile) ma potrebbe contenere in
posizione nascosta un disco rigido magnetico e un alimentatore per batteria.
CACHE
MEMORIA CENTRALE
Disco RAM
Questi dispositivi di
memorizzazione
Dischi MAGNETICI sono meno veloci
ma anche meno
costosi.
Dischi OTTICI
Nastri MAGNETICI
NON VOLATILI
Il controllore si occupa di trasferire i dati dal dispositivo alla memoria di transito e viceversa. La
comunicazione con il sistema operativo è possibile grazie alla presenza dei driver del dispositivo che
fungono da interfaccia con il resto del sistema.
Un’operazione comune si svolge nel seguente modo:
1. Il driver del dispositivo carica i registri interessati situati all’interno del controllore
2. Il controllore esamina il contenuto di questi registri per individuare l’azione da intraprendere
3. Il controllore trasferisce i dati dal dispositivo I/O al proprio buffer locale
4. Il controllore informa il driver di aver terminato l’operazione segnalando un evento (interrupt)
5. Il driver trasferisce il controllo al sistema operativo restituendo i dati o un puntatore ad essi se
l’operazione è di lettura altrimenti restituisce informazioni sullo stato.
Questa tipologia di approccio è possibile solo in caso di trasferimento di piccole quantità di dati, ma in
caso di trasferimenti massicci, per evitare un sovraccarico, è utile usare una tecnica di Accesso Diretto
alla Memoria (DMA).
Il DMA non prevede l’intervento della CPU per il trasferimento dei dati ma prevede il trasferimento di
blocchi di dati individuati con dei puntatori. Le interruzioni avvengono solo per ogni blocco e non
per ogni byte e la CPU rimane libera per altri compiti.
Economia di scala
Consentono un risparmio generale rispetto a sistemi dotati di una singola unità di elaborazione.
Incremento dell’affidabilità
Le funzioni sono distribuite quindi un guasto non bloccherebbe l’intero sistema ma semplicemente
la parte adibita al compito non più esplicabile. I Sistemi Multiprocessore continuano ad offrire i
servizi dei dispositivi ancora in funzione (degradazione controllata) e molto spesso risultano
tolleranti ai guasti continuando la loro attività.
Ci sono due tipologie di sistemi multiprocessore che hanno due tipologie di elaborazione differente:
Multielaborazione Asimmetrica
Ogni unità di elaborazione ha un compito specifico. C’è un unità di elaborazione principale che
controlla il sistema e le altre unità di elaborazione.
Multielaborazione Simmetrica
Ogni processore è abilitato al compimento di tutte le operazioni del sistema. Ogni processore è
uguale ad un altro (Solaris). Grazie a questo modello ogni processo è eseguibile
contemporaneamente a uno o altri processi senza causare un calo delle prestazioni.
È inoltre da evidenziare una delle ultime innovazioni chiamate server blade che contengono nello
stesso contenitore fisico le schede del processore, dell’I/O e della rete. In questa tipologia di sistema
ogni scheda madre (ospitante una CPU) avvia ed esegue in modo indipendente il proprio sistema
operativo che può essere anche multiprocessore.
Asimmetriche
In questo caso un calcolatore rimane in uno stato di attesa attiva mentre un calcolatore esegue le
applicazioni. Il calcolatore che rimane in attesa attiva non fa altro che controllare l’altro calcolatore
che sta eseguendo le applicazioni. Se l’ultimo presenta problemi allora il calcolatore che controlla
diventano server attivo.
Simmetriche
In questo caso due o più calcolatori eseguono le applicazioni e allo stesso tempo si controllano
l’uno con l’altro. Questo porta ad una maggiore efficienza ma ci vogliono più applicazioni da
eseguire.
MULTIPROGRAMMAZIONE
La multiprogrammazione è quel meccanismo che consente di tenere costantemente occupata la
CPU e i dispositivi I/O aumentando così la percentuale di utilizzo della stessa.
Il funzionamento della multiprogrammazione prevede che:
Nella memoria principale ci siano un numero di lavori (chiamati job) che devono essere eseguiti;
Il Sistema Operativo sceglie uno di questi lavori contenuti nella memoria ed inizia l’esecuzione;
Il Sistema Operativo riceve una segnalazione di un evento;
Il Sistema Operativo passa ad un altro lavoro e lo esegue;
Una volta terminata l’attesa del lavoro il Sistema Operativo ne riprende l’esecuzione.
Memoria Centrale
0 Mb --
-- Job 1
--
-- Job 2
-- Job 3
--
-- Job 4
--
--
--
--
Job 5
--
Job 6
512 Mb --
Con la multiprogrammazione finché ci sono lavori da svolgere la CPU non rimane mai inattiva. Nella
multiprogrammazione il numero di processi, istante per istante, effettivamente in esecuzione non può
eccedere il numero di processori disponibili. La multiprogrammazione è utilissima per la gestione delle
risorse del sistema ma non consente un’interazione con l’utente.
TIMESHARING
Per questo motivo la multiprogrammazione si è estesa nel timesharing o multitasking che consente
agli utenti di interagire con il proprio processo come se fosse l’unico presente ed in esecuzione sul
sistema. Questa illusione viene ottenuta eseguendo frequentemente la commutazione da un processo
ad un altro. Infatti il timesharing viene anche definito partizione del tempo di elaborazione perché la
CPU esegue più lavori commutando le loro esecuzioni con una frequenza tale da permettere a
ciascun utente l’interazione con il proprio programma durante la sua esecuzione.
La CPU dedica istanti di tempo ad ogni lavoro e al termine del lasso di tempo dedicato ad un lavoro si
dedica all’esecuzione per un brevissimo lasso di tempo di un altro lavoro. Inoltre il Sistema Operativo
ad ogni input dell’utente deve rispondere con output in tempi velocissimi.
Dato che la memoria centrale non ha una capienza tale da contenere tutti i lavori esiste una partizione
del disco magnetico chiamata job pool che contiene tutti i processi (job) che devono essere caricati
nella memoria centrale.
Per selezionare quali tra questi processi deve andare in esecuzione (soprattutto nel caso in cui la
capienza della memoria centrale è quasi piena) viene eseguita una job sheduling (pianificazione dei
lavori).
Una volta caricato in memoria i processi selezionati essi sono pronti per l’esecuzione. A questo il
sistema deve decidere quali tra questi devono essere eseguiti e per farlo deve pianificare la CPU tramite
un’operazione denominata sheduling della CPU.
Quando un sistema è basato su Timesharing il sistema deve garantire tempi di risposta accettabili e per
farlo utilizza una tecnica chiamata swapping (avvicendamento) che consente di scambiare
l’esecuzione tra i processi presenti in memoria centrale e quelli presenti sul disco.
Lo stesso risultato è ottenibile grazie alla memoria virtuale che consente di eseguire i lavori anche se
non sono caricati interamente in memoria così da non limitare programmi con dimensioni maggiori ad
una memoria fisica minore.
Oltre questo un Sistema O perativo basato su Timesharing deve:
Fornire e gestire un file system che deve essere contenuto in un insieme di dischi
Proteggere le risorse ad utenti non autorizzati
Fornire la comunicazione e la sincronizzazione tra i processi
Modalità Utente
In questo tipo di modalità viene eseguito il codice definito dall’utente. Il bit di modalità assume
valore “1” quando si sta eseguendo il sistema in questa modalità. In questo caso il bit stabilisce che
l’istruzione si sta eseguendo per conto dell’utente (applicazioni dell’utente).
si passa dalla Modalità Utente (bit = 1) alla Modalità di Sistema (bit = 0) quando si verifica
un’interruzione o un’eccezione.
La doppia modalità (dual mode) è necessaria per garantire protezione al sistema e per evitare istruzioni
di macchina che possono causare danni allo stato del sistema.
Il livello di protezione è possibile ottenerlo stabilendo quali sono le istruzioni privilegiate che il
Sistema Operativo deve gestire solo in Modalità di Sistema. Nel caso in cui queste istruzioni vengano
richiamate in Modalità Utente il Sistema Operativo solleva un eccezione tranne se le chiamate sono
System Call (Chiamate di Sistema). Quindi un’applicazione utente può richiedere l’esecuzione di
istruzioni privilegiate solo ed esclusivamente tramite le System Call.
un’istruzione scorretta o non consentita; Inoltre in questo caso il S.O. provvede ad abortire l’esecuzione
del programma.
TIMER VARIABILE
Esso contiene un generatore di impulsi e un contatore. Il contatore assume un determinato valore,
assegnatogli dal Sistema Operativo. Questo valore viene decrementato ogni qual volta il generatore
invia un impulso. Quando il contatore assume un valore maggiore di 0, il Sistema Operativo decide di
concedere altro tempo al programma altrimenti se il contatore assume un valore pari a 0 viene
generata un’interruzione che il Sistema Operativo gestirà come errore fatale chiudendo il programma
che l’ha generata.
Il Sistema Operativo si occupa di gestire molte attività connesse ai processi. Le principali sono le
seguenti:
La Memoria Centrale è l’unico dispositivo di memorizzazione a cui la CPU può accedere in modo
diretto. I dati presenti in Memorie Secondarie devono prima passare dalla Memoria Centrale per essere
gestiti dalla CPU.
La CPU per eseguire delle istruzioni relative a programmi, queste stesse istruzioni devono essere
presenti nella Memoria Centrale ed ogni programma che deve essere eseguito deve essere associato a
relativi indirizzi. Al termine del programma viene liberato lo spazio relativo alla memoria occupata così
da poter rendere possibile l’esecuzione del programma successivo.
I file vengono catalogati in una Memoria Secondaria che è necessaria per predisporre di una capienza
maggiore e di una memorizzazione temporanea. La maggior parte dei moderni sistemi di calcolo
impiega i dischi come principale mezzo di memorizzazione secondaria. Il Sistema è responsabile di una
serie di attività relative a questi dischi che si possono schematizzare nei seguenti tre punti:
Ci sono altre tipologie di memorie che vengono definite Memorie Terziarie (CD, DVD, Supporti di
memorizzazione rimovibili). Il Sistema Operativo ha il compito di gestire anche questi ultimi.
1.18 Cache
Generalmente le informazioni sono mantenute temporaneamente nella Memoria Centrale. Quando
bisogna accedere ad un’informazione si effettua un controllo per verificare se la stessa informazione è
già presente in un dispositivo di memorizzazione denominato cache. Nel caso in cui l’informazione è
presente la si preleva dalla cache è la si adopera, altrimenti la si preleva dalla memoria centrale, la si
copia nella cache (perché si presuppone che questa informazione la si utilizzerà in altre situazioni) e la
successivamente la si adopera .
Anche i registri della CPU possono essere considerati come una cache ad alta velocità per la memoria
centrale. La cache è utile per aumentare notevolmente le prestazioni di un sistema ma questo è
possibile solamente grazie ad una buona progettazione.
Anche la Memoria Centrale può essere considerata come una cache per la Memoria Secondaria perché i
dati contenuti nella Memoria Secondaria devono essere trasferiti nella Memoria Centrale per poter
essere utilizzati e nella Memoria Centrale devono essere contenuti per poter essere copiati nella
Memoria Secondaria.
Si possono distinguere 4 livelli principali in un Sistema che possono essere definiti come cache:
Livello 1 2 3 4
In questo tipo di architettura a livelli, organizzata in modo gerarchico, potrebbe accadere che gli stessi
dati sono mantenuti contemporaneamente in diversi livelli del sistema di memorizzazione. Nel
momento in cui si effettua una modifica in un file questa viene ripercossa gerarchicamente tra tutti i
livelli. La difficoltà sta proprio nel fare in modo che processi concorrenti possano accedere ad
informazioni che risultano sempre aggiornate perché le modifiche sono riflettute in tutti i dispositivi di
memorizzazione (o cache) collegati (Registri, Cache, Memoria Centrale e Dischi). Questa risulta una cosa
semplice ed intuitiva nell’esecuzione di un singolo processo ma meno in sistemi strutturati su
Timesharing. Questa situazione è nota come coerenza della cache e di solito si risolve ad un livello più
basso di quello del sistema operativo ossia nell’architettura del sistema.
addirittura assente. Essi funzionano solitamente con sistemi operativi real-time che prevedono il
rispetto di vincoli di tempo e cambiano il loro stato in base al cambiamento di sensori, pulsanti o
altro. In altri casi il sistema operativo non è neanche presente.
Sistemi Multimediali
Sono sistemi operativi progettati appositamente per la riproduzione, l’acquisizione e tutti le
tipologie di utilizzo di video, musica e immagini.
Sistemi Palmari
Sono i palmari, i tascabili e i cellulari i componenti di questa categoria. Lo sviluppo di un sistema
operativo relativo a questa categoria è molto rognoso in quanto c’è minor Memoria Centrale, c’è
una CPU lenta ( per diminuire i costi) e la visualizzazione delle finestre sullo schermo e molto più
piccola.