Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Fondamenti di informatica
Prof. Lorenzo Mezzalira
Appunti del corso
9
Sistema operativo
Esecuzione di processi concorrenti
1 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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)
Video, tastiera, mouse
 fornire un supporto di esecuzione dei programmi
mediante le primitive di sistema
Funzioni invocabili come sottoprogrammi
2 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Servizi del Sistema Operativo
Il supporto all‟esecuzione viene fornito con:
 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 di indirizzamento 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 della periferica
 impostazione delle modalità operative
 operazioni di input/output
 informazioni sullo stato della periferica
3 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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 per l‟operatore e per l‟esecuzione dei
programmi.
Gli strati inferiori contengono le funzioni che gestiscono i
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.
4 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Processi
I processi sono dei programmi in esecuzione, e quindi
contenuti nella memoria di lavoro, 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)
 eventuale area di memoria per l‟allocazione dinamica
(heap)
Diversi processi possono coesistere “attivi” in un
calcolatore, anche se in ogni istante uno solo può essere
effettivamente in esecuzione.
Una CPU con un solo Program Counter può seguire un
solo flusso di esecuzione.
5 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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 (server)
Multiprogrammato real-time (automazione di macchine)
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.
6 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Classificazione dei sistemi di elaborazione
Multiprogrammato multiutente time-sharing
Diversi utenti, ognuno dotato di un proprio terminale,
interagiscono con il sistema di calcolo che è in grado di
eseguire “contemporaneamente” i vari processi richiesti
dagli utenti, rigorosamente indipendenti tra loro.
In questi sistemi lo scopo è di fornire un servizio
soddisfacente per gli utenti.
Multiprogrammato monoutente (Personal Computer)
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. Qualche interazione è possibile tra i
processi: ad es. cut and paste.
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 di ognuno di essi rispetti precisi vincoli
temporali riguardo agli istanti di attivazione e
soprattutto di emissione dei risultati delle elaborazioni.
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.
7 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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à
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.
8 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Meccanismi specifici dei
sistemi operativi multi programmati
 Esecuzione in modo utente e modo supervisore (modo
sistema) privilegiato
 Rilocazione degli indirizzi di memoria nei processi
 Diverse aree di stack utente e di stack di sistema
Esecuzione in modo utente e supervisore
 Nel modo utente la CPU può eseguire solo un
sottoinsieme delle istruzioni macchina.
 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. (invocazione di primitive)
 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.
9 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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 in
cui tale attività deve (deadline) essere, completata.
10 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Scopo temporale di un’azione
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
disponibili.
 La latenza massima (caso peggiore) si verifica quando
lo stimolo arriva in un momento di uso intenso delle
risorse.
11 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Latenza
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 continua a non
poter essere eseguita perchè altre azioni monopolizzano
l‟uso delle risorse.
Il tempo di esecuzione (netto)
è il tempo impiegato dalla CPU per eseguire le istruzioni
dell‟azione da compiere, ed è in genere più prevedibile di
quanto non sia il tempo di latenza.
Anche il tempo di esecuzione netto potrà variare nelle varie
istanze di esecuzione dell‟azione, in dipendenza dei dati da
trattare, come ad es. la quantità di elementi significativi di un
array, il numero di cicli necessari per arrivare alla soluzione,
ecc.
12 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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 è detta real-time se
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.
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) 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 e richiedono ognuno
l‟esecuzione di azioni.
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 iesima (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.
13 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
PARALLELISMO FISICO
Un totale parallelismo reale (o fisico) tra le varie azioni è
ottenibile solo se sono disponibili tante risorse processori
(multiprocessing), quante sono richieste dalle diverse
attività potenzialmente concomitanti.
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 chiamare “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 a 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.
14 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
PARALLELISMO VIRTUALE
Molto interessante è il parallelismo virtuale (o logico) che è
ottenibile con l'assegnazione nel tempo delle (scarse)
risorse (CPU) alle varie azioni in corso.
Questa modalità di esecuzione viene detta multitasking =
multiprogrammazione.
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.
Per scheduling si intende una politica di scelta a quali azioni
dedicare la CPU in quali intervalli di tempo, preservando la
correttezza di esecuzione, con la 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.
15 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Carico di lavoro della CPU
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.
Per gli eventi sporadici si dice tempo morto la minima
distanza temporale tra due eventi consecutivi, che quindi
costituisce il caso peggiore per quanto riguarda il carico di
lavoro per la CPU.
16 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
PARALLELISMO
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.
Parliamo quindi di parallelismo virtuale di un sistema
multiprogrammato perchè il suo comportamento è
equivalente a quello di un sistema fisicamente parallelo.
17 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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.
18 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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:
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. Lo scheduler del
sistema operativo decide a quale dei processi nello stato di
pronto cedere il controllo di esecuzione.
19 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
1 - TIME-DRIVEN = Guidato 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à.
20 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Time driven
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à.
Implementativamente
Il programma è costituito dalla sequenza delle operazioni a,
b, c
Ad ogni scadenza temporale "scadenza dell'istante Ti" si
esegue un nuovo ciclo:
 leggi i valori VAR-IN = Ii con campionamento in ingresso
 esegui il programma, cioè le azioni a(i), b(i), c(i)
 emetti i valori Oi = VAR-OUT appena calcolati e aggiorna
lo stato interno copiando in S i valori Si+1.
21 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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
22 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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
Ciclo ogni 100 ms (timer) – 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
23 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Time driven
Questo approccio, di tipo “polling”, è detto "guidato dal
tempo" (time-driven) perchè tutte le azioni sono eseguite
solo in base agli eventi temporali periodici ed
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.
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.
24 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Time driven
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
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.
25 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Multitasking Event-Driven
In questa modalità di esecuzione multiprogrammata le
azioni sono eseguite da processi (detti task o thread) che
vengono attivati 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.
26 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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.
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 execution-driven i tempi lasciati
liberi dalle attività precedenti.
27 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Modello a Processi Concorrenti
I PROCESSI (Task e Thread) sono attività dotate di contesto (stato
interno), che possono eventualmente 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.
28 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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
29 / 45
Rich. di attesa
di risorsa o evento
Eccezione fatale
Sospeso
In attesa
d'evento
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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.
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
30 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Transizioni di Stato dei Processi (seguito)
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.
31 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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 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 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à
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.
32 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Algoritmi di Scheduling
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
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. Tipico algoritmo per real-time
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
33 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Interruzioni: priorità e annidamento
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 (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.

CON preemption TUTTI i vettori di interrupt DEVONO
passare attraverso la gestione del Sistema Operativo
NOTA – La priorità ha lo scopo di ridurre la latenza
di esecuzione di azioni più prioritarie a scapito
dell‟aumento della latenza di altre azioni (meno
prioritarie)
34 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
INTERRUZIONI ANNIDATE
PROCESSO
IN
ESECUZIONE
SISTEMA OPERATIVO
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)
35 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Competizione e Cooperazione
Tra processi
COMPETIZIONE
 Tipica di ambienti GESTIONALI e MULTIUTENTE
 Diversi JOB svolgono compiti 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 ottenere
correttezza, ma sono facilitate le interazioni tra processi
 Le PRIMITIVE di sincronizzazione e comunicazione sono
invocate anche direttamente dai processi applicativi
36 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Primitive di S.O. Real-Time
Le primitive sono delle funzioni, come dei sottoprogrammi
messi a disposizione dal Sistema Operativo per svolgere i
servizi 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
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.
37 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
Primitive per Servizi Generali
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
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
38 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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.
39 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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
40 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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).

41 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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
42 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
RISORSE
Indica le risorse allocate al processo
Tra le risorse ci possono essere:
 - messaggi ricevuti
 - code private
 - aree di memoria
 - vettori di interrupt
 - file in uso

- periferiche condivise
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
43 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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).
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.
44 / 45
Fondamenti di informatica – Esecuzione parallela
Lorenzo Mezzalira
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 distributore di dati e collettore di risultati. Questo approccio è significativo in
sistemi con parallelismo fisico, in cui i processi Worker risiedano su diversi processori.
45 / 45