Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
FONDAMENTI DI INFORMATICA
Prof. Lorenzo Mezzalira
Appunti del corso di Fondamenti di informatica
Fascicolo integrativo - 4 -
Supporto di esecuzione dei programmi
Tipi di sistemi operativi
Parallelismo di esecuzione
Esecuzione in tempo reale
Esecuzione ciclica guidata dal tempo
Esecuzione dei processi guidata dagli eventi
1 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
SERVIZI PER L’ESECUZIONE DI PROGRAMMI
Utente 1
Utente 2
Compilatore
Editor
Utente 3
Utente 4
Base di dati
Excel
Programmi applicativi
Sistema operativo
CPU Memorie Interfacce
Hardware
Fig. – Struttura funzionale di un sistema di calcolo multiutente
I compiti di un sistema operativo sono:
 fornire servizi all’utente tramite l’interprete comandi (shell)
 fornire un supporto di esecuzione dei programmi mediante le primitive di sistema
Il supporto all’esecuzione viene fornito con due categorie di servizi:
 gestione delle risorse interne al sistema di elaborazione
 gestione delle comunicazioni con l’esterno tramite le unità periferiche
La gestione delle risorse interne al sistema riguarda tipicamente le seguenti funzioni
 gestione della memoria di lavoro, eventualmente a più livelli (memoria virtuale, memoria
cache), con relativi registri della CPU per accedere ai vari segmenti di memoria.
 gestione delle temporizzazioni (orologio/calendario, Real Time Clock, ecc.)
 gestione dei file e delle memorie di massa
 gestione delle interazioni e comunicazioni tra i programmi o processi in esecuzione
La gestione delle unità periferiche di comunicazione col mondo esterno è sostanzialmente
basata su una collezione di driver ognuno dei quali presenta una serie di servizi.
Un driver è il software di gestione di una periferica, che comprende le strutture dati e le funzioni
che si fanno carico dei meccanismi, talora anche piuttosto complessi, per la corretta gestione delle
operazioni con quella periferica.
Tipici servizi sono ad esempio:




inizializzazione di HW e SW
impostazione delle modalità operative
operazioni di input/output
informazioni sullo stato della periferica
2 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Struttura tipica dei sistemi operativi
Generalmente i sistemi operativi sono realizzati con una struttura a strati sovrapposti, con
funzionalità gerarchiche a partire dal livello di gestione dell’hardware fino alle funzioni di alto livello
proposte all’operatore e all’esecuzione dei programmi.
Gli strati inferiori contengono le funzioni che gestiscono i dettagli dei meccanismi di basso livello,
mentre gli strati superiori utilizzano le funzioni messe a disposizione dallo strato inferiore per
realizzare funzioni più complesse e con crescente astrazione dai meccanismi dell’hardware.
A livelli decrescenti verso l’hardware una stratificazione potrebbe essere la seguente:
Window system
gestione delle finestre su video
Shell
gestione operatore con interprete comandi
Network stack
gestione dei protocolli di scambio messaggi in rete
File system
gestione dei file
I/O system
gestione delle funzionalità di I/O
Pager – swapper
gestione della memoria di lavoro, virtuale e cache
Scheduler
assegnazione della CPU ai processi
Device drivers
gestione dei meccanismi hardware di interfaccia
I livelli inferiori costituiscono il cosiddetto nucleo (kernel) del sistema operativo.
Processi
I processi sono dei programmi in esecuzione, composti da




codice eseguibile (linguaggio macchina)
area di memoria per i dati sui quali opera l’esecuzione del codice
area di memoria per lo stack (per la gestione dei sottoprogrammi)
contesto – contenuto dei registri e stato della CPU (PSW = Processor Status Word)
Classificazione dei sistemi di elaborazione in base alle modalità di
esecuzione dei processi e di interazione con l’operatore





Monoprogrammato monoutente (Personal Computer anni ‘80)
Esecuzione a lotti (batch – centri di calcolo)
Multiprogrammato monoutente (Personal Computer)
Multiprogrammato multiutente time-sharing
Multiprogrammato real-time (automazione di macchine)
3 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Monoprogrammato monoutente
L’utente interagisce con il calcolatore e può comandare l’esecuzione di un programma alla volta,
cioè solo quando l’esecuzione di un programma è terminata se ne può lanciare un altro. Gestione
interattiva relativamente semplice.
Esecuzione sequenziale a lotti (batch)
L’utente non interagisce direttamente con il calcolatore, ma affida ad un operatore il compito di
eseguire i programmi di interesse. Questi sono eseguiti uno alla volta in sequenza. Modalità di
esecuzione in disuso. Gestione semplice.
Esecuzione multiprogrammata a lotti (batch)
Come nel caso precedente, ma ci possono essere diversi processi in esecuzione
contemporaneamente, che si avvicendano nell’uso di risorse come vari tipi di memoria di massa,
stampanti, linee di comunicazione, ecc. Questa gestione, tipica dei centri di calcolo con notevoli
risorse, è relativamente complessa, ed ha come obiettivo principale il massimo sfruttamento
delle risorse, quindi il massimo throughput.
Multiprogrammato multiutente time-sharing
Diversi utenti, ognuno dotato di un proprio terminale di interfaccia, interagiscono con il sistema di
calcolo che è in grado di eseguire contemporaneamente i vari processi richiesti dagli utenti. In
questi sistemi lo scopo è di fornire un servizio soddisfacente per gli utenti.
Multiprogrammato monoutente (PC)
Un solo utente interagisce direttamente con il calcolatore e può lanciare l’esecuzione di diversi
programmi con i quali interagisce per fornire dati e comandi. Lo scopo principale è avere
un’interfaccia operatore di facile uso (user friendly).
Multiprogrammato real-time
Il sistema è in grado di eseguire diversi processi contemporaneamente, facendo in modo che
l’esecuzione rispetti precisi vincoli temporali riguardo agli istanti di attivazione e soprattutto di
emissione dei risultati delle elaborazioni. Caratteristica essenziale è il rispetto delle scadenze
(deadline).
I processi sono spesso interagenti e cooperanti tra loro.
Il caso tipico è costituito dalle applicazioni di automazione di macchine e processi fisici. In questo
caso lo scopo principale è quello di garantire il rispetto dei vincoli temporali.
Gli obiettivi di un sistema di elaborazione possono quindi essere svariati e concomitanti, come ad
esempio:






semplicità ed economia
massimo sfruttamento di alcune risorse (stampanti, dischi)
massimo throughput di elaborazione
adeguatezza alle esigenze di una multiutenza
rispetto di vincoli temporali nelle interazioni con l’esterno
massima affidabilità
4 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
La “personalità” del sistema,
 sia rispetto all’interazione con l’operatore
 sia rispetto alle funzioni offerte ai programmi applicativi,
dipende notevolmente dal tipo di macchina virtuale che il sistema operativo implementa sulla
macchina fisica.
Il SW applicativo infatti si appoggia (in genere) al supporto del S.O.
Meccanismi specifici dei sistemi operativi multiprogrammati



Esecuzione in modo utente e modo supervisore (modo sistema) privilegiato
Rilocazione degli indirizzi di memoria nei processi per poterli caricare ed eseguire in
diverse posizioni in memoria di lavoro, dove c’è spazio al momento del lancio iniziale
(creazione) del processo.
Aree di stack utente separate per i vari processi e area di stack di sistema
Esecuzione in modo utente e supervisore




Nel modo utente la CPU può eseguire solo un sottoinsieme delle istruzioni.
Sono tipicamente istruzioni privilegiate, eseguibili solo in modo supervisore, le istruzioni di
I/O e le istruzioni di modifica dei registri base delle aree di memoria.
Il passaggio da modo utente a modo supervisore avviene automaticamente quando la CPU
esegue una istruzione di chiamata di sistema, detta SVC = Supervisor Call.
Il tentativo di eseguire in modo utente un’istruzione privilegiata comporta l’interruzione
dell’esecuzione del processo e la cessione del controllo al sistema operativo.
NECESSITÀ DI PARALLELISMO (Per l’elaborazione in tempo reale)
Il carico di lavoro di un sistema di elaborazione che debba interagire in tempo reale con fenomeni
esterni è scomponibile in:



attività costituite da azioni periodiche (campionamenti, monitoraggio, regolazioni, ecc.)
azioni aperiodiche (generalmente risposte ad eventi sporadici)
attività di sottofondo (non real-time – stampe, interazioni con operatore, ecc.).
Eventi periodici
Sono eventi per cui ogni istanza di evento si verifica sempre alla stessa distanza temporale
dall’istanza precedente. Sono quindi eventi che si verificano con regolarità in modo
predicibile.
Eventi sporadici
Sono eventi che si verificano in modo imprevedibile, a maggiore o minore distanza
temporale rispetto all’evento precedente.
Chiamiamo scopo temporale ST di un'azione l'intervallo di tempo tra l'istante in cui si
verifica l'evento che consente o richiede l'esecuzione dell'azione (triggering event) e
l'istante di tempo (deadline) in cui tale attività deve essere, completata.
5 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Lo scopo temporale è scomponibile in due componenti temporali:


TLatenza = tempo di attesa inerte
TEsecuzione = tempo dedicato ad effettiva elaborazione
ST = TLatenza + TEsecuzione
Definizione:
LATENZA = tempo che un’azione, pronta per l’esecuzione, trascorre senza poter procedere
nell’esecuzione a causa della temporanea non disponibilità di qualche risorsa (in genere la CPU)
che è attualmente assegnata ad altre azioni (in genere più prioritarie).




La latenza entra in gioco quando ci sono i momenti di sincronizzazione tra produttore di
uno stimolo ed esecutore delle operazioni di risposta allo stimolo.
La latenza è molto variabile di volta in volta, generalmente in modo casuale.
La latenza minima è nulla, e si verifica quando in occasione dello stimolo l’esecutore trova
tutte le risorse già disponibili.
La latenza massima (caso peggiore) si verifica quando lo stimolo arriva in un momento di
uso intenso delle risorse.
Nei sistemi correttamente progettati la latenza massima di ogni azione ha un limite
superiore compatibile con i tempi di risposta (deadline) di quell’azione. Quando invece la
latenza massima è arbitrariamente lunga si parla di starvation (lett. morte per inedia). In
questo caso un’azione rimane indefinitamente in attesa di esecuzione perchè altre azioni
monopolizzano l’uso delle risorse.
Il tempo di esecuzione (netto) è in genere più prevedibile di quanto non sia il tempo di latenza,
ma anch’esso potrà variare nelle varie istanze di esecuzione, in dipendenza dei dati da trattare,
come la quantità di elementi significativi di un array, il numero di cicli necessari per arrivare alla
soluzione, ecc.
PARALLELISMO
Chiamiamo concorrenti attività le cui azioni hanno scopi temporali che presentano
sovrapposizioni (overlapping), in contrapposizione al termine sequenziali che designa
azioni con scopi temporali senza intersezioni.
Un'elaborazione ad attività concorrenti non è necessariamente di tipo real-time. E’ realtime solo un'elaborazione in cui l'inizio e/o la fine di alcuni o tutti gli scopi temporali delle
azioni è vincolata da specifiche temporali.
Chiamiamo processo sequenziale un'attività internamente sequenziale e caratterizzata da un
proprio contesto, cioè l'insieme delle risorse ad essa allocate ed i rispettivi stati.
Le risorse possono essere
attive (processori di vari tipi) e
passive (periferiche, memoria, dati, ecc.).
6 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
I sistemi di elaborazione in tempo reale devono essere dotati di una capacità di parallelismo tra
diverse elaborazioni, cioè la capacità di iniziare e completare in tempo utile (rispettando i vincoli
temporali - deadline) una nuova azione anche se altre sono già in corso (sovrapposizione di scopi
temporali di diverse azioni). La necessità di parallelismo deriva dal fatto che si richiede una
corretta e tempestiva interazione del sistema di elaborazione con diversi fenomeni esterni
(fenomeni fisici, operatori umani, altri calcolatori) che evolvono in parallelo tra loro.
Chiamiamo:

TDi la durata dello scopo temporale dell'azione i-esima (esprime la rapidità di risposta
richiesta al sistema di elaborazione dallo stimolo i-esimo) detta DEADLINE.

TEi il massimo tempo di esecuzione netto dell'azione i-esima (esprime la velocità
offerta dal sistema di elaborazione). E’ il tempo necessario per l’esecuzione con tutte le
risorse disponibili ed in assenza di interruzioni, cioè senza latenze.
PARALLELISMO FISICO
Un totale parallelismo reale (o fisico) tra le varie azioni è ottenibile solo se sono
disponibili tante risorse processori quante sono richieste dalle diverse attività
potenzialmente concomitanti. Questa situazione è detta anche multiprocessing.
In questo caso le latenze dei processi di elaborazione sono sempre nulle, infatti i
processori dedicati alle singole azioni sono immediatamente disponibili ad eseguirle
quando si verificano le richieste (eventi trigger).
Questo parallelismo implica un'assegnazione (scheduling) spaziale delle attività alle varie CPU.
Ogni CPU rimane inattiva (idle) per tutto il tempo in cui non è richiesto lo svolgimento di azioni
dell'attività assegnatale, e ciò può portare ad uno scarso sfruttamento di tali risorse. Quindi
generalmente non si adotta una configurazione come questa, che possiamo considerare “a risorse
illimitate”.
Un'applicazione non è fisicamente realizzabile, neppure con un sistema a parallelismo fisico, se
per almeno un'azione i-esima si ha:
TEi > TDi
che corrisponde ad un tempo di elaborazione maggiore del tempo di risposta disponibile, cioè
potenza di calcolo insufficiente per l’algoritmo adottato, rispetto alle prestazioni temporali richieste.
In questo caso occorre ridurre TEi, e ciò si ottiene individuando un algoritmo più efficiente per
l’azione i-esima oppure utilizzando un processore con maggiore “potenza di calcolo”, cioè più
veloce.
PARALLELISMO VIRTUALE
Molto interessante è il parallelismo virtuale (o logico) che è ottenibile con l'assegnazione nel
tempo delle (scarse) risorse alle azioni in corso, durante intervalli di tempo interni ai rispettivi scopi
temporali.
Questa modalità di esecuzione viene detta multitasking = multiprogrammazione.
7 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
In altre parole, una singola CPU potrà essere dedicata nel tempo ad eseguire ora una e ora
un’altra tra le diverse azioni di cui è stata richiesta ed è “in corso” (cioè è dentro lo scopo
temporale) l’esecuzione.
Questo approccio consente generalmente un migliore sfruttamento delle risorse (tipicamente la
CPU) rispetto al parallelismo esclusivamente fisico, ma richiede uno scheduling temporale, cioè
l’adozione di una politica di scelta a quali azioni dedicare la CPU in quali intervalli di tempo,
preservando la correttezza di esecuzione, ed una relativamente complessa gestione del passaggio
dall’esecuzione di un’azione ad un’altra.
Con questa esecuzione multiprogrammata il tempo di elaborazione di un’azione corrisponde a
tempo di latenza per tutte le altre azioni “triggerate”, che quindi in quel momento hanno scopo
temporale sovrapposto.
Per valutare il carico di lavoro della CPU in presenza di richieste di eseguire un certo numero di
azioni, ognuna con la sua periodicità TAi, si è introdotto il coefficiente di utilizzazione del
processore:
U  1
n
TEi
TAi
n = numero di azioni potenzialmente richieste al processore
TEi = tempo (max) di esecuzione netto dell'azione i-esima
TAi = intervallo (min) tra le successive attivazioni dell'azione i-esima.
La realizzabilità fisica con un solo processore impone che sia U < 1 che è condizione
necessaria, ma non sufficiente (dipende dalle politiche di scheduling), perchè possano essere
rispettati tutti i vincoli temporali richiesti per una elaborazione real-time.
 Per il carico di lavoro imposto da eventi periodici i valori TAi corrispondono ai periodi dei
rispettivi eventi,
 Per le componenti del carico di lavoro imposte da eventi sporadici si può parlare di utilizzazione
"media" o "di picco" a seconda che per i vari TAi si adottino i valori medi o minimi (tempo morto)
di ripetizione del corrispondente evento sporadico.
Purchè il coefficiente di utilizzo della CPU sia
U<1
e lo scheduling temporale sia tale da contenere l'esecuzione di ogni azione all'interno del proprio
scopo temporale, l'effetto complessivo osservabile è "equivalente" a quello ottenibile da
diversi processori con esecuzione fisicamente in parallelo.
Consideriamo temporalmente equivalenti i sistemi in cui ogni azione rispetta il vincolo
temporale della propria deadline (cioè è temporalmente corretta).
Questa equivalenza è lecita in quanto le specifiche temporali richieste alle elaborazioni
riguardano solo certi momenti delle elaborazioni ed in particolare quasi sempre riguardano solo
l'operazione conclusiva di emissione del risultato finale.
8 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Esempio di esecuzione di azioni con scopi temporali sovrapposti.
La sospensione dell’esecuzione di un’azione per passare ad eseguire un’altra azione (più
prioritaria) è detta preemption.
Preemption di A1
Scopo temporale Azione A1
Esec. Azione A1
Latenza di A1
Esec. Azione A1
Deadline di A1
t
Scopo temp. A2
Azione A2
Deadline di A2
t
Evento E2 trigger
dell’Azione A2
Evento E1 trigger
dell’Azione A1
In questa situazione se l’esecuzione di A2, “triggerata” quando è già in corso A1, fosse stata
rimandata alla conclusione di A1 (quindi senza preemption), A2 non avrebbe rispettato la sua
scadenza.
Si noti l’importanza di un opportuno scheduling temporale e della preemption.
La scala dei tempi rispetto a cui si giudica l'equivalenza temporale delle elaborazioni è quella degli scopi
temporali, più grossolana di quella dei tempi di esecuzione di singole istruzioni della CPU. Questa
differenza consente la virtualizzazione del parallelismo, intercalando opportunamente le esecuzioni delle
azioni concorrenti.
Potremmo dire che la CPU, pur con la sua esecuzione strettamente sequenziale, grazie alla sua elevata
velocità di elaborazione, rispetto ai fenomeni con cui interagisce, riesce a “tenere a bada” svariati di questi
fenomeni che evolvono contemporaneamente.
Naturalmente, come già rilevato, se il carico di lavoro della CPU supera complessivamente il valore unitario
è inevitabile dover ricorrere ad un sistema più veloce o con più processori.
Il parallelismo virtuale presenta una particolare importanza anche nei sistemi multiprocessore (nei
quali si può adottare un parallelismo “misto”) principalmente per i seguenti motivi:
 diventano sempre più economici processori molto più potenti di quanto sarebbe richiesto dalla
maggior parte delle singole attività e che quindi sarebbero poco sfruttati assegnando loro una
singola attività;
 le attività assegnate ad uno stesso processore sono favorite nelle reciproche sincronizzazioni
e comunicazioni in termini di semplicità ed efficienza, rispetto a quelle assegnate a processori
diversi.
9 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
MODELLI IMPLEMENTATIVI DI PARALLELISMO VIRTUALE
Per ottenere una corretta esecuzione di azioni che presentano scopi temporali sovrapposti è
necessario organizzare il modo con cui si assegna la CPU alle varie azioni da compiere, cioè alle
varie parti di codice da eseguire.
Si dice “cedere il controllo ad un’azione” l’operazione tramite la quale si attiva il contesto del
programma che esegue quell’azione ed in particolare si carica nel registro PC (Program Counter)
della CPU l’indirizzo dell’istruzione prossima da eseguire, cioè della prima istruzione di un’azione
da iniziare o dell’istruzione da cui riprendere l’azione interrotta per qualche motivo.
Le due tecniche implementative di cessione del controllo alle varie azioni da eseguire sono
presentate sinteticamente e poi nel seguito descritte un po’ più dettagliatamente.
Cessione del controllo guidata dal tempo.
Ciclicamente si cede il controllo alle varie azioni, una dopo l’altra, concedendo ad ognuna il suo
turno di esecuzione. Sarà compito di ogni azione vedere se ci sono o meno operazioni da eseguire
in quel momento. Le parti di codice relative alle varie azioni vengono collocate sequenzialmente
dal programmatore che realizza così un unico processo da eseguire ciclicamente.
Cessione del controllo guidata dagli eventi.
Le azioni sono concretizzate in processi che restano in stato di attesa del loro evento (trigger). Al
verificarsi dell’evento atteso sono collocati nello stato di pronto (ready). Lo scheduler del sistema
operativo decide a quale dei processi nello stato di pronto cedere il controllo di esecuzione.
Esecuzione TIME-DRIVEN = Guidata dal tempo
Chiamiamo
Ii - l’insieme dei valori delle variabili di ingresso, che contengono i valori acquisiti dai segnali del
mondo esterno nell’istante temporale i-esimo Ti.
Oi - l’insieme dei valori delle variabili di uscita, destinati ad essere emessi verso il mondo esterno
nell’istante temporale i-esimo Ti.
Si - l’insieme dei valori di variabili interne (variabili di stato) nell’istante temporale i-esimo Ti.

La funzionalità di un sistema può essere scomposta in un insieme di attività
concorrenti (che operano in parallelo tra loro).

Ogni attività può essere vista come un processo trasformazionale che riceve in
ingresso informazioni dal mondo esterno e (idealmente con continuità) produce in
uscita informazioni e comandi da emettere verso il mondo esterno.

Nella maggior parte delle applicazioni è pensabile che le informazioni in ingresso (Ii) al
sistema di elaborazione siano ottenute mediante una periodica osservazione
(campionamento) di stati continui (analogici) e discreti (digitali).

L’implementazione di ogni attività può essere realizzata da un pezzo di programma (che
descrive un’azione) da eseguire ad ogni campionamento (quindi ripetuta ciclicamente)
per produrre gli effetti richiesti dall’attività.
10 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Con l'approccio time-driven ogni attività viene implementata come un’esecuzione, ripetuta ad
ogni campionamento, di una nuova istanza di una stessa azione che
 utilizza i valori catturati in ingresso (Ii)
ed eventualmente uno stato interno (Si)
 e produce alcuni valori di uscita (Oi)
e l'eventuale nuovo valore dello stato interno (Si+1).
Se si adotta lo stesso periodo di campionamento per tutti gli ingressi, si avrà anche lo
stesso periodo di ripetizione ciclica delle azioni che realizzano le varie attività.
In questo caso (che è quello più usuale):
Il SW applicativo con approccio time-driven consiste in un unico
processo da eseguire ciclicamente con periodo temporale (Tp)
costante, che contiene in sequenza le parti di programma che
realizzano le azioni delle varie attività.
Supponiamo che si debbano eseguire le attività concorrenti A, B e C con lo stesso periodo di
campionamento.
È spontaneo organizzare l'esecuzione delle corrispondenti azioni a, b e c come segue:
- all'istante T0
si utilizzano i valori
per eseguire le azioni
che producono i valori
I0 e S0
a(0), b(0), c(0)
O0 e S1
- all'istante T1
si utilizzano i valori
per eseguire le azioni
che producono i valori
I1 e S1
a(1), b(1), c(1)
O1 e S2
............................................................
-- all'istante Ti
si utilizzano i valori
per eseguire le azioni
che producono i valori
Ii e Si
a(i), b(i), c(i)
Oi e Si+1
Implementativamente


Il programma è costituito dalla sequenza delle operazioni a, b, c
Il verificarsi dell'evento temporale "scadenza dell'istante Ti"
attiva l'esecuzione della sequenza di operazioni:



leggi i valori VARIABILI-IN = Ii con campionamento in ingresso
esegui il programma, cioè le azioni a(i), b(i), c(i)
emetti i valori Oi = VARIABILI-OUT appena calcolati e aggiorna lo stato interno
copiando in S i valori Si+1.
11 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Struttura del programma con esecuzione guidata dal tempo
inizializza i valori delle variabili interne e di stato
inizializza le interfacce verso il mondo esterno
attiva un temporizzatore con periodo Tp
ciclo forever
attendi scadenza del j-esimo periodo Tp(j)
acquisisci i valori in ingresso e assegnali alle variabili VAR-IN
esegui operazioni a
esegui operazioni b
...........
esegui operazioni n
emetti in uscita i valori delle variabili VAR-OUT
aggiorna lo stato interno con lo stato prossimo
fine ciclo
Esempio
Si voglia realizzare un’applicazione che svolge in parallelo tra loro le seguenti attività:
1) – Contare gli oggetti che passando davanti ad una fotocellula portano a livello “ON” un
segnale binario che a riposo è a livello “OFF”. Il conteggio deve iniziare dal momento di
attivazione del sistema. Gli oggetti attivano la fotocellula per tempi > 0,2 s
2) – Emettere un suono con un cicalino al passaggio degli oggetti multipli di 10
3) – Regolare una temperatura accendendo (ON) un elemento riscaldante se essa è
inferiore a SOGLIA e spegnendolo (OFF) se essa è superiore.
4) – Lampeggiare con frequenza di 1 Hz e duty-cycle 60% un LED (indicatore luminoso)
se la temperatura è inferiore di 10 gradi rispetto alla SOGLIA
Pseudocodice del processo time driven
Inizializzazione – eseguita una volta all’accensione del sistema
conta_oggetti = 0
tempo_decimi_sec = 0
fotocellula = OFF
foto_precedente = OFF
LED = OFF
riscalda = OFF
cicalino = OFF
12 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Ciclo ogni 100 ms dettato da timer – porzione con esecuzione time driven
aspetta_timer_100ms ( )
// Acquisizione degli ingressi
fotocellula = acquisisci_foto( )
temperatura = acquisisci_temp ( )
// Esegui le azioni cicliche
azione 1
if (fotocellula == ON e foto_precedente == OFF)
conta_oggetti++
azione 2
if (conta_oggetti modulo 10 == 0 e fotocellula == ON)
cicalino = ON
else cicalino = OFF
azione 3
if (temperatura < SOGLIA)
riscalda = ON
else riscalda = OFF
azione 4
if (temperatura < SOGLIA-10 e (tempo_decimi mod 10) < 6)
LED = ON
else LED = OFF
// Emetti valori in uscita
emetti_suono (cicalino)
emetti_luce (LED)
emetti_caldo (riscalda)
// Aggiorna lo stato interno
tempo_decimi = tempo_decimi + 1
foto_precedente = fotocellula
Torna a ciclo
Questo approccio, di tipo “polling”, è detto "guidato dal tempo" (time-driven) perchè tutte le azioni
sono eseguite solo in base agli eventi temporali periodici che attivano ogni nuovo ciclo,
indipendentemente dal verificarsi di altri eventi interni od esterni, che quindi giocano un ruolo
passivo.
Con l’approccio time-driven è dominante il concetto di stato e il comportamento del
sistema di elaborazione è di tipo trasformazionale.
Con questo approccio gli eventi esterni giocano un ruolo passivo, cioè non provocano
direttamente nessuna azione, ma possono essere rilevati (se necessario) deducendoli dalle
differenze di valori degli stati campionati in ingresso, rispetto ai valori campionati nel ciclo
precedente.
13 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Le eventuali sincronizzazioni di operazioni con eventi esterni sono effettuate secondo la modalità
a controllo di programma.
Lo scheduling delle azioni è statico (off-line), dato che il programmatore, con la stesura del
programma, decide la sequenza di esecuzione delle azioni collocandole nella loro posizione
nell’ambito del ciclo, e non viene quindi effettuata nessuna preemption.
I pregi non trascurabili di questo approccio lo rendono interessante in molte semplici
applicazioni e ne hanno fatto il modello di esecuzione tipico dei PLC (Programmable Logic
Controller)
-- Semplicità: il supporto "run-time" è costituito da un “sistema operativo” molto ridotto che si limita
alle funzioni di lettura degli ingressi, scrittura delle uscite e alla gestione di un temporizzatore di
attivazione ciclica del programma.
-- Predicibilità: i tempi di esecuzione molto regolari rendono facile verificare se il fattore di
utilizzazione del processore è < 1. U =  TEi / Tp
Condizione sufficiente perchè si possa adottare un approccio time-driven con un singolo
processo ciclico è che sia
 TEi < Tp
dove TEi è il tempo netto di esecuzione dell’azione i-esima e
Tp è il periodo di ciclo.
Il tempo di risposta ad una variazione degli ingressi è
Tp < Trisp < 2*Tp
In questo caso per tempo di risposta si intende dopo quanto tempo i valori emessi in uscita
risentono della variazione di qualche valore in ingresso.
14 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Multitasking Event-Driven
In questa modalità di esecuzione multiprogrammata (multitasking) le azioni sono eseguite
ognuna da un processo (detto task o thread) che viene attivato da eventi esterni o da
eventi prodotti da altri processi, o da eventi temporali.
Gli eventi assumono quindi un ruolo attivo
Si parla in questo caso di comportamento reattivo del sistema di elaborazione, perchè al
verificarsi di eventi il sistema reagisce con l’acquisizione dei dati corrispondenti e con
l’esecuzione dei processi che producono le risposte a tali eventi.
Poichè agli eventi sono associate delle informazioni (dati) questo approccio si può
chiamare anche data-driven
Le sincronizzazioni con gli eventi sono tipicamente basate sul meccanismo
dell’interrupt.
Evento -> sync 1° -> ISR -> sync 2° -> Processo
Cioè da un evento con una sincronizzazione di primo livello si attiva l’esecuzione di una
routine di servizio (ISR) e da questa con una sincronizzazione di secondo livello si attiva
l’esecuzione del processo (task) che deve elaborare i dati ricevuti e fornire i risultati di
risposta.
Per garantire il rispetto di vincoli temporali occorre una opportuna politica di scheduling
che assegni la CPU all’esecuzione dei vari processi tenendo conto della loro priorità e
delle loro scadenze temporali.
Questo approccio richiede un sistema operativo più complesso dell’approccio time-driven,
ma è anche più generale, e può adottare accanto a dei task attivati da eventi anche alcuni
task ciclici, cioè con esecuzione di tipo time-driven.
Considerazioni sulle tecniche presentate
L'approccio guidato dagli eventi costituisce il caso più generale (perchè è in grado di
considerare eventi temporali, esterni e interni)
può supportare al suo interno anche sottoinsiemi di attività impostate secondo gli schemi
precedenti (processi time-driven),
fornendo quindi la massima flessibilità progettuale anche se a costo di una problematica
molto più articolata e complessa.
Consente un ottimo sfruttamento del tempo della CPU
In particolare un'applicazione complessa potrà comprendere:
 un sottoinsieme di attività cicliche di controllo e supervisione (trasformazionali) i cui vincoli
temporali consistono sostanzialmente in una attivazione ciclica regolare, adatte ad una
gestione di tipo time-driven;
 alcune attività di tipo reattivo a eventi sporadici e con vincoli temporali sui tempi di
risposta, per cui è conveniente una gestione event-driven;
 attività di sottofondo senza particolari vincoli temporali che utilizzano in modo executiondriven i tempi lasciati liberi dalle attività precedenti.
15 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Modello a Processi Concorrenti
I PROCESSI (Task e Thread) sono attività dotate di contesto (stato interno), che possono
eventualmente anche condividere codice e parte dei dati, e che competono per l'uso di
risorse condivise (CPU, ...)
I processi sono caratterizzati da uno STATO ESTERNO, gestito dal S.O., che può essere:
INESISTENTE
Il processo non esiste nella memoria di lavoro, ma è presente solo come file nella
memoria di massa.
DORMIENTE
(Sleeping)
Il processo è presente nella memoria di lavoro, ma non è ancora stato dotato di un
completo contesto di esecuzione (con stack, descrittore di processo, ecc.)
PRONTO
(Ready)
in latenza
Si è verificato un evento che richiede l’esecuzione del processo, ma al momento la
CPU è occupata nell’esecuzione di un altro processo.
IN ESECUZIONE
(Running)
Modo Utente
Il processo è in esecuzione nelle istruzioni del programma applicativo (scritto dal
programmatore progettista)
Modo Sistema
Il processo sta eseguendo istruzioni di sistema, in seguito ad una Supervisor Call =
invocazione di servizio del sistema operativo.
INTERROTTO
(interrupted)
in latenza
La CPU sta eseguendo una ISR = Interrupt Service Routine come risposta ad una
richiesta di interruzione mentre il processo era in esecuzione.
IN ATTESA
(Waiting)
Il processo, per svolgere le prossime elaborazioni aspetta una scadenza temporale,
oppure dei nuovi dati, oppure che una risorsa (ad es. la memoria di massa) si renda
libera, ecc.
SOSPESO
(Suspended)
Il processo non ha più elaborazioni da eseguire e quindi termina, oppure si è
verificata una condizione di errore che ne impedisce il proseguimento, e quindi
viene terminato di forza dal sistema operativo che è stato attivato dalla “trap”
dell’errore.
16 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
DIAGRAMMA DEGLI STATI DEI PROCESSI
Caricamento in
Memoria
Inesistente
Dormiente
Creazione
Preemption
Occorrenza
di un evento
Pronto
Assegnazione
della CPU
In esecuzione
Ritorno da
interruzione
Utente
Invocazione
di primitiva
Rit. da prim.
non bloccante
Interrotto
Interruzione
Sistema
Rich. di
sospensione
In attesa
d'evento
Rich. di attesa
di risorsa o evento
Eccezione fatale
Sospeso
Transizioni di Stato dei Processi
CARICAMENTO IN MEMORIA
Il codice eseguibile del processo viene scaricato dalla memoria di massa nella
memoria di lavoro
CREAZIONE
Il sistema operativo “prende in carico” il processo, assegnandogli un descrittore
(Task Control Block) che ne descrive le caratteristiche (nome, priorità, aree di
memoria e risorse assegnate, ecc.) e l’evoluzione attraverso i vari stati.
ASSEGNAZIONE DELLA CPU
Ogni volta che la CPU si rende libera lo scheduler sceglie a quale dei processi
pronti assegnarla, portando così quel processo nello stato di esecuzione.
INVOCAZIONE DI PRIMITIVA
Quando un processo in esecuzione ha bisogno di servizi da parte del sistema
operativo invoca la funzione (primitiva) corrispondente, quasi come un
sottoprogramma.
17 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Se il servizio richiesto consiste nell’assegnazione di una risorsa (ad es. un dato o
una periferica) che al momento non è disponibile, la primitiva risulta “bloccante”.
RITORNO DA PRIMITIVA NON BLOCCANTE
Se il servizio richiesto con l’invocazione di una primitiva può essere svolto subito, il
sistema operativo ritorna poi il controllo al processo richiedente.
INTERRUZIONE
In occasione delle richieste di interruzione la CPU sospende l’esecuzione del
processo e passa ad eseguire la ISR (routine di servizio) che costituisce parte del
sistema operativo.
RITORNO DA INTERRUZIONE
In generale terminata l’esecuzione della ISR la CPU viene nuovamente assegnata
all’esecuzione del processo da dove era stato interrotto
PREEMPTION
Nei sistemi operativi real-time è previsto che al termine di una ISR non si torni
necessariamente ad eseguire il processo interrotto, ma se un processo più
prioritario è nello stato “pronto” la CPU verrà ceduta a quest’ultimo processo.
La preemption corrisponde quindi alla “sottrazione” della CPU al processo che la
stava usando prima dell’interruzione.
ECCEZIONE FATALE
E’ il verificarsi di una situazione erronea o comunque non risolvibile, che richiede la
sospensione del processo interessato.
RICHIESTA DI RISORSA O EVENTO
Invocazione, da parte di un processo, di primitive con cui esso chiede al sistema
operativo che gli venga assegnato l’uso di una risosrsa o che il sistema operativo lo
metta in esecuzione in seguito al verificarsi di un evento (tipica sincronizzazione di
secondo livello).
OCCORRENZA DI EVENTO ATTESO
Quando si verifica un evento atteso da un processo (in attesa) o diventa disponibile
una risorsa richiesta, il processo interessato viene messo dal sistema operativo
nello stato di pronto.
RICHIESTA DI SOSPENSIONE
Quando un processo ha terminato definitivamente le sue elaborazioni e non verrà
più richiesta la sua esecuzione, può venire collocato nello stato di sospeso.
Scheduling Temporale
Lo Scheduling è una funzione del Sistema Operativo che sceglie a quale processo
assegnare il controllo della CPU
1.
In seguito ad invocazione di primitive dal processo in esecuzione
2.
In occasione di risposte ad interrupt (tipicamente da RTC = Real Time Clock)
1) – Scheduling di tipo non-preemptive (solo nel caso 1) - Riduce overhead e riduce i
problemi di rientranza - Adatto per real-time lasco, per il quale un’occasionale mancata
deadline con un piccolo ritardo non costituisce un errore “catastrofico”.
2) – Scheduling di tipo preemptive - (nei casi 1 e 2) Gestione a priorità. Richiede:
 Protezione delle regioni critiche
 Accurata verifica della rientranza delle funzioni condivise (Librerie)
 Tutte le gestioni di interruzione devono essere gestite da S.O.
Lo Scheduling preemptive è necessario per poter fornire prestazioni corrette con requisiti
di tempo reale stretto. Infatti con la preemption si evita che un processo a bassa priorità
18 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
possa monopolizzare la CPU, senza rilasciarla ai processi più prioritari che quindi
mancano le loro deadline.
Nota – La rientranza è la caratteristica di un sottoprogramma di poter essere eseguito correttamente anche
quando venga invocato da diversi processi concorrenti. In caso di scheduling preemptive la rientranza è
ovviamente una caratteristica essenziale per le funzioni di libreria che per loro natura sono destinate ad
essere invocate dai vari processi applicativi.
Algoritmi di Scheduling
Nel seguito vengono presentati molto sinteticamente alcuni algoritmi di scheduling temporale
adottabili per un’esecuzione di tipo multiprogrammato.
FIFO – attivazione in ordine cronologico
I processi pronti vengono messi in coda e vanno in esecuzione (ricevono la CPU)
nell’ordine con cui sono diventati pronti (triggerati).
Pro
Semplicità e basso overhead
Evita la starvation dei processi
Contro
Nessuna garanzia di Tempo Reale
Non si privilegiano azioni urgenti
FIXED PRIORITY - Processi con priorità statica prefissata
Quando la CPU si libera viene assegnata a quello, tra i processi pronti, che ha la priorità
più alta.
La priorità di ogni processo viene assegnata come parametro costante dal progettista
programmatore.
Pro
Semplicità
Tiene conto di urgenza e importanza
Contro
Occorre attenta attribuzione delle priorità
Le diverse azioni di un processo sono indifferenziate tra loro come urgenza
Presenta il problema dell'inversione di priorità con l'uso
di risorse condivise tra processi a diversa priorità
EARLIEST DEADLINE FIRST - Priorità dinamica
Dà la precedenza al processo con scadenza (deadline) più vicina
Il S.O. deve conoscere le scadenze delle azioni
SHORTEST SLACK - Priorità dinamica
Dà la precedenza al processo meno dilazionabile
La dilazionabilità (Laxity) è la differenza tra scadenza e
tempo di esecuzione netto ancora mancante.
Il S.O. deve conoscere le scadenze e i tempi di esecuzione netti
19 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Interruzioni: priorità e annidamento
Nell’esecuzione guidata dagli eventi le interruzioni sono il tipico modo con cui la
CPU percepisce gli eventi, quindi il meccanismo delle interruzioni assume un ruolo
fondamentale per la funzionalità dei sistemi operativi multitasking ed eventualmente
anche real-time.
In particolare tutte le interruzioni non dovranno chiamare direttamente le ISR (routine di
servizio), ma cederanno il controllo al sistema operativo che svolgerà le funzioni
necessarie e invocherà l’esecuzione delle ISR appropriate.
INTERRUZIONI NON ANNIDATE
Nelle applicazioni più semplici non si ha annidamento delle interruzioni, cioè quando è in
esecuzione una ISR gli interrupt sono disabilitati ed eventuali richieste pendenti, anche se
più prioritarie, devono aspettare (tempo di latenza) il termine della ISR in esecuzione.
Se non si gestisce l’annidamento delle interruzioni l’efficacia della priorità di un canale di
interrupt per ridurne il tempo di latenza è molto ridotta.
INTERRUZIONI ANNIDATE
L’annidamento delle interruzioni consiste nella gestione delle risposte organizzata in modo
che all’arrivo di una richiesta più prioritaria di quella in corso, quest’ultima venga a sua
volta interrotta per passare all’esecuzione della nuova ISR più prioritaria, terminata la
quale si torna a completare quella che era stata interrotta.
Con le interruzioni annidate si ottiene l’effetto di avere la latenza massima delle richieste di
interruzione dei vari canali decrescente con la loro priorità. Questo aspetto è molto
importante nelle applicazioni con vincoli temporali.
L’annidamento delle interruzioni assegna piena efficacia alla priorità dei vari canali di
interruzione.

CON preemption TUTTI i vettori di interrupt DEVONO passare attraverso la
gestione del Sistema Operativo
20 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
INTERRUZIONI ANNIDATE
PROCESSO
SISTEMA OPERATIVO
IN
ESECUZIONE
ISR DI GESTIONE
INTERRUPT
CODICE APPLICATIVO
ISRi specifica del canale
i-esimo
- interrupt ->
Maschera livelli (HW)
pari e inferiori
Nesting = Nesting + 1
if Nesting = 1
then Salva contesto Processo
Assume contesto Sistema
else Salva registri
Enable Interrupt
- Call ---------------------------------->
Individua causa
Rimuove causa
Servizio
Indicatori o segnali
<-------------------------------- Ret --Disable Interrupt
End Of Interrupt
Nesting = Nesting - 1
if Nesting > 0
then Ripristina registri
Enable Interrupt
<--------------------------------- Ritorno else Scheduling (preemption)
21 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Competizione e Cooperazione
COMPETIZIONE
 Tipica di ambienti GESTIONALI e MULTIUTENTE
 Diversi JOB svolgono compiti tipicamente scorrelati tra loro
 Si tende ad evitare le interferenze tra i Job
 Le PRIMITIVE di coordinamento tra attività sono generalmente invocate internamente
ai servizi del Sistema Operativo
COOPERAZIONE
 Tipica delle applicazioni di AUTOMAZIONE e CONTROLLO
 Diversi TASK concorrono ad una funzionalità organica
 Le Interferenze tra i Task sono evitate per assicurare la correttezza di esecuzione, ma
sono facilitate le interazioni tra processi
 Le PRIMITIVE di sincronizzazione e comunicazione sono invocate anche direttamente
dai processi applicativi per comunicarsi dati e coordinarsi tra loro.
Primitive di S.O. Real-Time
Le primitive sono delle funzioni, come dei sottoprogrammi messi a disposizione dal
Sistema Operativo per svolgere i servizi necessari, o utili, per una corretta ed efficiente
esecuzione dei processi. Le invocazioni di primitive sono anche dette supervisor call.
Le primitive possono essere:
 Invocate esplicitamente dai processi
 Invocate da istruzioni macchina generate dai compilatori nella traduzione di costrutti
di alto livello
 Invocate all’interno di funzioni di libreria
L’esecuzione delle primitive costituisce un'occasione perchè il S.O. possa svolgere le sue
funzioni di gestione dell’esecuzione dei vari processi, e non solo di quello che ha in quel
momento invocato la primitiva.
L'altra occasione in cui il S.O. prende il controllo dell’esecuzione è costituita dalle risposte
ad interruzioni, in cui le ISR sono in realtà “parti” del S.O. stesso.
Sono dette bloccanti le primitive che possono portare allo stato di attesa il processo
invocante e attivare un altro processo
Primitive per Servizi Generali
Nel seguito vengono elencate le principali primitive per la gestione dei processi in
ambiente di esecuzione multiprogrammata.
Dato che ogni sistema operativo adotta specifici identificatori per le sue primitive, nel
seguito si utilizzano dei nomi mnemonici che richiamano i significati delle primitive stesse.
CREATE (task)
Porta un processo dallo stato dormiente a pronto, allocandogli un contesto con descrittore
dinamico, con i parametri: priorità, entry point, ampiezza di stack
SUSPEND (task)
Porta un processo nello stato sospeso
22 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
ENINT (channel, ISR)
Abilita un livello di interruzione e gli associa una specifica routine di servizio applicativo,
con visibilità sul contesto del processo invocante che ne diventa proprietario
DISINT (channel)
Disabilita un livello di interruzione di cui il processo invocante è proprietario
Primitive di Temporizzazione
ABS_WAIT (abs_time)
Attesa a tempo assoluto. - Risveglia il processo invocante quando t = abs_time
REL_WAIT (rel_time)
Attesa a tempo relativo - Risveglia il processo invocante dopo un intervallo pari a rel_time
CYC_WAIT (period)
Attesa di tempo ciclico - Riattivazione periodica dopo ogni intervallo pari a period
.....T_OUT (...., tout_time)Associa ad altre attese una scadenza di Time_Out
La variante con “time-out” si applica ad altre primitive di “attesa”. In questo caso se
l’evento atteso non si verifica entro il tempo massimo di time-out il processo viene
comunque messo nello stato di pronto e riceve l’informazione che non si è verificato
l’evento atteso, ma è scaduto il tempo. Usata quando il mancato verificarsi di un evento
rappresenta una situazione anomala che il processo deve gestire, e per fare ciò deve
essere ovviamente attivato.
Primitive di Sincronizzazione
WAIT (Semaphore [, t_out])
Attesa su un semaforo con eventuale t_out
Si dice semaforo una variabile indicatrice di eventi verificati.
Si possono adottare diverse semantiche per gli eventi sul semaforo:
 Eventi volatili – L’evento viene acquisito solo se quando si verifica c’è un processo che
ha chiesto al S.O. di aspettarlo, altrimenti l’evento viene scartato.
 Eventi persistenti binari – Il semaforo è un tipico indicatore a due stati. TRUE significa
che si è verificato uno o più eventi non ancora gestiti. FALSE significa che tutti gli
eventuali eventi precedenti sono stati gestiti e non c’è nulla di nuovo.
 Eventi persistenti a conteggio (= Risorse) – Il semaforo è gestito come un contatore di
eventi ancora da trattare. Se è maggiore di zero indica quanti eventi si sono verificati e
non sono ancora stati gestiti.
SIGNAL (Semaphore)
Produce un evento sul semaforo
23 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Primitive di Comunicazione
Costituiscono un'estensione delle primitive di sincronizzazione, cui è associato un
trasferimento di informazioni per realizzare il rapporto PRODUTTORE - CONSUMATORE
Con accodamento di Messaggi
In genere le code sono realizzate con liste dinamiche a gestione FIFO.

SEND_MESS (message, queue)
Accoda il messaggio message nella coda queue, senza attendere che il processo
consumatore riceva il messaggio dalla coda di attesa.

RECEIVE_MESS (queue, message [,tout])
Il processo riceve il primo messaggio nella coda queue, eventualmente attendendo che ne
arrivi uno. Spesso è precisato un Time-Out, cioè il massimo tempo che il processo è
disposto ad aspettare.
Con deposito di singoli caratteri su Buffer Circolare.
In genere il buffer circolare è un array di dimensione DIM in cui l’indice di accesso
all’elemento di deposito e l’indice di accesso all’elemento di consumo vengono
incrementati “modulo DIM”

PUT_CHAR (char, buffer [,tout])
Inserisce il carattere char nel buffer (circolare) se c'è posto, altrimenti il processo viene
messo nello stato di attesa (attende che si liberi un posto, eventualmente con il tempo
limite tout).

GET_CHAR (buffer, char [,tout])
Attende, eventualmente con time-out, che ci sia un carattere nel buffer (circolare).
24 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
NOTA
Il seguito non fa parte del programma dell’insegnamento, ma se ne suggerisce una lettura.
Descrittore Dinamico di Processo
E’ una struttura di tipo record, spesso chiamata TCB = Task Control Block, associata ad ogni
processo all'atto della sua creazione e che descrive l'evoluzione del processo.
Si noti che ogni sistema operativo multitasking adotta una propria struttura di descrittore dei
processi. Alcuni campi tipici di queste strutture sono presentati nel seguito.
STATO DEL PROCESSO
Lo stato può essere descritto in vari modi,
con l'accodamento del TCB in code di attesa di eventi o risorse.
con un indicatore di stato corredato con l'indicazione di quale evento è atteso dal processo, e se
con time-out.
TEMPO DA ATTENDERE
Indica il tempo di attesa rimanente per le attese temporizzate o con time-out.
Talvolta si adottano variabili distinte per le attese di scadenze temporali o le scadenze di
time-out, eventualmente con diverse granularità temporali
INIZIO STACK
Indica l’indirizzo di confine dell’area di memoria di lavoro dedicata allo stack del processo. Non
necessario, ma utile in sede di debug (verifica di stack overflow).
STACK POINTER
In questo campo viene salvato il contenuto del registro stack pointer quando il processo non è in
esecuzione. E' la parte minima di contesto che non può venire salvata sullo stack
RISORSE
Indica le risorse allocate al processo (a seconda dei sistemi operativi).
Tra le risorse ci possono essere:
 - messaggi ricevuti
 - code private
 - aree di memoria
 - vettori di interrupt
 - regioni critiche impegnate
 - file in uso

- periferiche condivise
25 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
La descrizione delle risorse serve per:



- verificare i diritti di accesso
- realizzare particolari protocolli di scheduling che tengano conto dell’impiego delle risorse
- effettuare i necessari rilasci di risorse in caso di terminazione o sospensione del processo
TEMPO DI ESECUZIONE
Contatori del tempo che il processo trascorre in esecuzione usati per:



- una valutazione del tempo di CPU mediamente utilizzato dal processo,
- la gestione di un eventuale time-slicing per i processi, che prevede di mettere nello stato di
pronto il processo in esecuzione che superi il tempo (time-slice) ad esso concesso
- il calcolo del tempo di esecuzione residuo (per politica di scheduling con minimum slack)
PRIORITA'
Usata dallo scheduler per decidere l’assegnazione della CPU ai processi. Può essere prevista una
eventuale modifica dinamica della priorità
- i processi possono chiedere che la priorità venga aumentata o diminuita in base all'importanza o
urgenza delle azioni che devono eseguire;
- lo scheduler può cambiare la priorità quando si adottano particolari politiche di scheduling, come
earliest deadline first.
- il sistema operativo cambia dinamicamente la priorità per limitare l'inversione di priorità tra
processi
26 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
Appendice - Glossario
FUNZIONE COMBINATORIA - Una funzione il cui risultato dipende solo dagli ingressi (o dai parametri).
FUNZIONE SEQUENZIALE - In contrapposizione a combinatoria. Una funzione il cui risultato dipende
non solo dagli ingressi, ma anche dall’evoluzione precedente (storia). Questo tipo di funzioni deve essere
dotato di un proprio stato basato su variabili statiche, che contiene l’informazione significativa sulla storia.
VARIABILI AUTOMATICHE - Sono variabili locali (nel record di attivazione) di sottoprogrammi, la cui
vita termina con il termine dell’esecuzione del sottoprogramma e quindi non mantengono il loro valore tra
una chiamata e l’altra, ma anzi devono venire inizializzate ogni volta.
VARIABILI STATICHE - Sono variabili (eventualmente anche locali di sottoprogrammi) che mantengono
il loro valore anche tra una chiamata e l’altra. Sono necessarie perchè un sottoprogramma possa avere una
sua storia interna (sia sequenziale, in contrapposizione a combinatorio).
STACK - Area di memoria, con gestione LIFO, associata ad ogni processo, in cui possono essere
temporaneamente salvati i registri, gli indirizzi di ritorno da sottoprogrammi o da interruzioni e in cui
possono essere allocati i record di attivazione dei sottoprogrammi con il relativo spazio per parametri e
variabili locali automatiche.
HEAP - Area di memoria globale di un’applicazione, quindi accessibile da tutti i suoi processi, porzioni della
quale vengono associate a dei puntatori mediante opportune funzioni (malloc()).
RISORSA - Entità interna (variabile, area dello heap, sottoprogramma) o esterna (unità periferica) che un
processo può utilizzare (risorse passive) come lettore o come lettore-e-scrittore.
Un caso particolare di risorsa attiva è costituito dalla CPU.
CONDIVISIONE STRETTA - Situazione in cui una risorsa viene utilizzata da un processo mentre il suo
uso da parte di altri processi non è ancora terminato.
CONDIVISIONE LASCA - Situazione in cui una risorsa può essere usata da diversi processi, ma solo da
uno alla volta.
RIENTRANZA - Proprietà di un sottoprogramma di poter essere interrotto e richiamato, mantenendo la
correttezza di esecuzione per ogni sua istanza. Si ottiene facendo in modo che ogni istanza possa
modificare solo variabili non condivise con altre istanze. Consente la condivisione stretta del
sottoprogramma.
La rientranza pone vincoli più restrittivi della ricorsione, dato che deve poter gestire correttamente
l’interruzione in qualsiasi punto (asincrona) del sottoprogramma, e non solo in occasione di un ben preciso
punto (sincrona) di chiamata ricorsiva.
CONCORRENZA - Parallelismo virtuale tra processi (attività) le cui azioni possono essere effettuate in
modo intercalato le une tra le altre.
COOPERAZIONE - Rapporto tra processi (thread) che correlano le loro azioni in modo da perseguire
correttamente un obbiettivo comune (es. automazione di una macchina).
27 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
COMPETIZIONE - Rapporto tra processi (thread e task) che condividono delle risorse e quindi devono
correlare le loro azioni in modo da non interferire tra loro, ed evitando così di compromettere la
correttezza delle rispettive elaborazioni.
TEMPORIZZAZIONE - Meccanismo tramite cui si fa in modo che l’esecuzione di un’azione sia correlata
con istanti temporali assoluti, o avvenga a distanza temporale relativa rispetto ad un altro evento.
SINCRONIZZAZIONE STRETTA - Meccanismo che assicura un ordinamento tra le azioni di due
processi. Ad esempio l’azione B1 potrà essere eseguita solo se l’azione A1 è completata e l’azione A2 a sua
volta sarà eseguita solo dopo B1.
SINCRONIZZAZIONE LASCA - Meccanismo tramite cui si assicura un parziale ordinamento temporale
tra azioni. Cioè ad esempio si garantisce che l’azione B1 non sia eseguita prima che l’azione A1 sia
completata, ma nel frattempo possono essere eseguite anche le azioni A2, A3, ecc..
MUTUA ESCLUSIONE - Tecnica adottata per rendere atomiche (non interrompibili) sequenze di
operazioni che operano su risorse non accessibili contemporaneamente, come ad es. i sottoprogrammi non
rientranti, per cui è corretta solo una condivisione lasca.
DEADLOCK - (Stallo, blocco critico) Situazione in cui due o più processi non possono più evolvere perchè
ognuno blocca parte delle risorse necessarie agli altri.
STARVATION - Situazione in cui un processo può essere impedito dal proseguire nell’esecuzione per un
tempo non limitato, perchè le risorse di cui necessita gli vengono continuamente sottratte da altri processi.
PRIMITIVA - Funzione del sistema operativo, che i processi invocano ed eseguono nel modo sistema,
nell’ambito della cui esecuzione il sistema operativo svolge le sue funzioni, ma che è vista come operazione
elementare dal processo applicativo.
PRODUTTORE-CONSUMATORE - Ogni informazione generata dal processo produttore viene
successivamente utilizzata, nello stesso ordine, dal processo consumatore. Richiede sincronizzazione per
ottenere il parziale ordinamento temporale tra le azioni di produzione e di consumo, con eventuale
accodamento FIFO se la sincronizzazione è lasca. Le informazioni sono viste come eventi incrementali. Se le
variabili utilizzate per comunicare le informazioni non sono accessibili ad entrambi i processi è necessaria
un’operazione di copiatura a carico del S.O.
SCRITTORE-LETTORI - Un insieme di variabili è considerato rappresentativo di uno stato che può
essere modificato da un processo scrittore ed utilizzato da più processi lettori. Ogni modifica dei valori da
parte del processo scrittore costituisce un evento assoluto, che deve essere reso atomico eventualmente
con mutua esclusione. Non è necessario alcun ordinamento temporale tra i vari accessi in lettura o
scrittura. Le variabili devono essere accessibili direttamente da tutti i processi interessati.
CLIENT-SERVER - I processi Client producono eventi di richiesta di servizi diretti al Server in grado di
svolgere tali servizi. Il processo Server a sua volta produrrà eventi di esito del servizio svolto, diretti al Client
che l’aveva richiesto.
FARMER-WORKERS - Il processo Farmer svolge il ruolo di coordinatore di attività le cui azioni possono
essere eseguite in parallelo, affidandone l’esecuzione a diversi processi Worker. Il Farmer funge quindi da
28 / 29
Fondamenti di informatica – Prof. Lorenzo Mezzalira – Fascicolo 4
distributore di dati e collettore di risultati. Questo approccio è significativo in sistemi con parallelismo fisico,
in cui i processi Worker risiedano su diversi processori.
29 / 29