Sei sulla pagina 1di 63

Prevedibilità di un sistema di

calcolo
Corso di
Progetto e Sviluppo di
Sistemi in Tempo Reale

Marcello Cinque

1
Fonti di non determinismo nei sistemi
di calcolo
l  Sommario della lezione:
l  Prevedibilità dell’hardware
l  Prevedibilità del sistema operativo
l  Riferimenti
l  G. Buttazzo – Sistemi in Tempo Reale – Pitagora
Editrice (Cap. 1 – Par. 1.3)
l  Ancillotti, Boari – Sistemi Operativi – Mc Graw Hill
(Cap. 1 – Par 1.3 e 1.4, Cap. 3 – Par. 3.4, Cap. 4,
Par. 4.2 e 4.3.3)

2
Prevedibilità
l  La capacità di determinare in anticipo se uno o più
processi potranno essere completati entro i propri
vincoli temporali.

l  Tale capacità è influenzata da diverse fonti di non


determinismo nell’hardware e nel software

3
Fonti di non determinismo
l  Dovute a meccanismi interni al processore:
l  DMA, cache, MMU, interruzioni, pipelining, esecuzione
speculativa, …
l  Sebbene tali meccanismi migliorino le prestazioni medie del
processore, introducono un non determinismo che può
allungare indefinitamente i tempi di risposta dei processi

l  Dovute al sistema operativo:


l  Scheduling, system calls, concorrenza e semafori, gestione
della memoria, gestione delle periferiche, …

4
Architettura di un sistema di calcolo

Memoria
Centrale Sensore Rete
RAM

Bus

CPU Attuatore USB

Input/Output (I/O)
Tecniche di comunicazione di I/O

l  Tre modalità di comunicazione tra CPU e


dispositivi di I/O:

l  I/O programmato
l  I/O interrupt driven

l  DMA (Direct Memory Access)


I/O programmato (polling)

l  La CPU esegue un’istruzione di I/O eseguendo un apposito


programma di I/O (ad es., il driver)
l  Il driver:
l  Prepara l’operazione di I/O scrivendo sui registri del controller del
dispositivo
l  Il dispositivo esegue l’azione richiesta e al termine scrive sui
registri del controller i risultati (buffer e stato)
l  La driver attende (attesa attiva) il completamento dell’operazione
testando periodicamente il contenuto di appositi registri di stato
l  Infine il driver sposta i dati di input dal buffer del controller alla
memoria centrale

LA CPU DEVE ATTENDERE IL


COMPLETAMENTO DELL’OPERAZIONE!
I/O interrupt- driven

l  La CPU esegue un’istruzione di I/O lanciando un apposito


programma di I/O (ad es., il driver).
l  Il driver (parte alta):
l  Prepara l’operazione di I/O scrivendo sui registri del controller
del dispositivo
l  sospende l’esecuzione del processo che ha eseguito
l’operazione;
l  Il dispositivo esegue l’azione richiesta, al termine scrive sul
buffer del controller il risultato e segnala il termine
dell’operazione attraverso interrupt.
l  Al ricevimento dell’interrupt, la CPU risveglia il driver (parte
bassa), il quale copia i dati dal buffer del controller alla
memoria centrale, e riavvia l’esecuzione del processo.
LA CPU NON DEVE ATTENDERE, E PUO’
ESEGUIRE ALTRI PROCESSI (MULTITASKING)
Gestione degli Interrupt
(meccanismo di base)
■  Il ciclo del processore viene modificato per
BOOTSTRAP verificare se ci sono interruzioni pendenti
(segnale INT);
FETCH
■  Se INT è alto,
OP. ASSEMBLY ■  viene interrotta l’elaborazione corrente
■  Si esegue una routine di gestione
dell’interruzione (ISR o interrupt handler);
EXECUTE
■  L’ISR gestisce l’interrupt in modo opportuno e
INT?
restituisce il controllo al processo interrotto (o
NO ad altro processo);
SI

INTERRUPT l  Infine, la CPU riprende l’esecuzione del


processo interrotto.
Classi di Interrupt
l  Interrupt Hardware (o interruzioni esterne)
l  Eventi hardware, non causati dal programma in esecuzione
l  Dispositivi di I/O (es. fine I/O)
l  Clock (scadenza quanto di tempo nei sistemi time-sharing)
l  Sono eventi asincroni rispetto all’elaborazione

l  Interrupt Software (Trap)


l  Causato dal programma
l  eccezioni nel processore, generate durante l’esecuzione di
un istruzione. Esempi sono una divisione per zero, o errori di
indirizzamento;
l  Invocazione di apposite istruzioni (int o svc – supervisor call
- per la richiesta di servizi al SO)
l  Sono eventi sincroni rispetto all’elaborazione
Interruzioni e prevedibilità
l  Le interruzioni hardware rappresentano un grosso
problema per la prevedibilità di un sistema real time
l  Sono asincrone all’esecuzione
l  Possono generare ritardi indeterminati sull’esecuzione dei
processi di controllo

l  Nei SO timesharing, le ISR hanno priorità rispetto ai


processi applicativi
l  Ciò è motivato dalla necessità di trasferire al più presto i
dati acquisiti ai processi in attesa
l  Ma ciò può risultare dannoso per i processi real time!!
Interruzioni e prevedibilità
l  Al fine di ridurre l’interferenza dei driver sui processi
applicativi e gestire in modo controllato il colloquio
di I/O, nei sistemi real-time si adottano tre approcci
differenti:

1.  Polling a livello applicativo


2.  Polling di sistema
3.  Driver minimale e processo gestore
Polling a livello applicativo
l  Interruzioni disabilitate (eccetto il timer)
l  I processi applicativi (Pi) interrogano direttamente i
registri di controllo della periferica

P1

I/O controller
Periferica

PN
Polling a livello applicativo

✔  Massima flessibilità d’uso.


✔  Eliminazione dei ritardi dovuti al driver
✔  Tempo di trasferimento dati valutabile e
addebitabile al processo che effettua
l’operazione
✔  Il Sistema Operativo non deve essere
modificato al variare dei dispositivi

✘  Bassa efficienza di I/O (attese attive)


✘  I processi devono conoscere i dettagli
hardware delle periferiche
Polling di sistema
l  Interruzioni disabilitate (eccetto il timer)
l  Le periferiche vengono interrogate da processi di
sistema (PS) dedicati all’ I/O e attivati dal timer ad
intervalli regolari

I/O controller
P1

PS Periferica

PN
Polling di sistema

✔  Eliminazione dei ritardi dovuti al driver


✔  Tempo di trasferimento dati valutabile e
addebitabile ai processi di sistema
✔  I processi applicativi non devono conoscere
i dettagli hardware delle periferiche

✘  Bassa efficienza di I/O (attese attive)


✘  Overhead aggiuntivo per la comunicazione
tra processi applicativi e processi di sistema
✘  Il Sistema Operativo deve essere
modificato al variare dei dispositivi
Driver minimale e processo gestore
l  Interruzioni abilitate
l  Il driver (minimale) ha il solo compito di attivare un
opportuno processo gestore (PG) il quale gestisce il
dato acquisito e viene garantito e schedulato come
qualsiasi altro task applicativo

I/O controller
P1

PG Periferica

PN
attiva driver
INT
Driver minimale e processo gestore

✔  Alta efficienza di I/O (no attesa attiva)


✔  Tempo di trasferimento dati valutabile e
addebitabile ai processi gestore
✔  I processi applicativi non devono conoscere
i dettagli hardware delle periferiche

✘  Presenza di ritardi (seppur minimi) dovuti


all’esecuzione dei driver e dai cambi di
contesto tra processi e driver
✘  Overhead aggiuntivo per la comunicazione
tra processi applicativi e processi gestore
DMA - Direct Memory Access
l  Tecnica utilizzata in alcune periferiche per trasferire
sequenze di dati da un dispositivo alla memoria e
viceversa, senza gravare sul carico della CPU.
l  La gestione interrupt-driven è infatti particolarmente
onerosa quando si devono trasferire grosse quantità
di dati anziché un singolo dato.
l  Se ogni dato trasferito nella sequenza richiede una
interruzione, il processore spreca buona parte del suo
tempo a gestire le interruzioni e trasferire dati dal controller
alla memoria.
DMA - Direct Memory Access
memoria Canale DMA

IND
CONT
CPU CONT
dispositivo

l  La CPU invia al DMA:


l  Richiesta di lettura o scrittura
l  Indirizzo del dispositivo di I/O
l  Locazione di partenza (IND) della memoria da cui leggere o scrivere
l  Numero di parole (CONT) da leggere o scrivere
l  Completato il trasferimento, il DMA invia un interrupt alla CPU
DMA - Cycle stealing
l  DMA e CPU condividono il bus per l’accesso alla
memoria
l  Cycle stealing: il DMA “ruba” alla CPU dei cicli del
bus, allo scopo di trasferire i dati

Non è possibile stabilire quante volte la CPU


dovrà attendere i cicli di DMA, pertanto il
tempo di risposta di un task non può essere
determinato con esattezza!
DMA – Timeslice method
l  Il ciclo di accesso alla memoria viene suddiviso in
due intervalli, uno riservato alla CPU e uno riservato
al dispositivo DMA
l  Tecnica meno efficiente del cycle stealing, ma più
prevedibile
l  Gli accessi alla memoria di CPU e DMA sono
temporalmente disgiunti e non possono entrare in conflitto
l  Il tempo di esecuzione di un task non degrada a causa
delle operazioni con DMA
Cache
l  Memoria veloce interposta tra CPU e memoria per
conservare dati acceduti di recente
dimensione

CPU Cache RAM

Velocità, costo per bit

E’ stato
l  Tecnica stimato
motivatachedalcon unache,
fatto RAM di 1 MB e una gli
statisticamente,
chache
accessidi 8
piùKB, le informazioni
frequenti in memoriarichieste
da partedadiun
un
programma
programma sono limitati
vengono trovateadin
uno spazio
cache di delle volte
l’80%
indirizzamento
(hit ratio) ristretto, detto località del programma
Cache: funzionamento
l  Ad ogni accesso in memoria, il processore controlla prima
nella cache.
l  Se il dato è presente (cache hit), si accede direttamente alla
cache, altrimenti (cache miss), si accede alla memoria
centrale.
l  Elemento di cache:
V Tag Contenuto
l  Contenuto: blocco di locazioni contigue della memoria
l  V: bit di validità, indica se il contenuto è valido
l  Tag: identifica il contenuto con la parte comune a tutti gli
indirizzi delle locazioni del contenuto.
l  L’accesso alla cache, con verifica della presenza del tag e
della validità, avviene in parallelo (accesso associativo)
Cache e prevedibilità
l  Ci possono essere dei casi, non prevedibili, in cui le
prestazioni peggiorano
l  Se per una particolare sequenza di istruzioni la
cache fallisce, il tempo di accesso in memoria si
allunga, a causa dei trasferimenti tra RAM e cache
l  L’impiego è ancora più gravoso per le operazioni di
scrittura: le modifiche in cache devono essere
riportate in RAM per mantenere la consistenza dei
dati (cache coherence).
Cache: valutazione del WCET
l  WCET: Worst Case Execution Time
l  Nei processori dotati di cache, la valutazione del
WCET deve essere fatta supponendo che si abbia
un cache miss per ogni accesso in memoria
Al fine di ottenere un elevato grado di prevedibilità,
sarebbe preferibile usare processori senza cache!

l  In pratica, si preferisce tener conto della cache


mediante un fattore moltiplicativo sui tempi d’accesso
l  Un metodo più preciso (ma oneroso) consiste
nell’analisi statica del codice, in combinazione ad un
modello matematico della cache, al fine di stimare il
numero di cache miss per ciascun processo
Il sistema operativo

l  Un Sistema Operativo (S.O.) è un insieme di programmi che


operano sull’hardware di un calcolatore
l  Si pone come interfaccia tra l’utente (o il software) e l’hardware,
fornendone un’astrazione, al fine di:
l  semplificare lo sviluppo di programmi
l  realizzare politiche di gestione delle risorse hardware

Le politiche di gestione realizzate dal SO


possono costituire fonti di non determinismo
per i sistemi real-time

27
Funzionalità di un SO

l  Virtualizzazione risorse hardware (fornitore di


servizi)
l  File system
l  Gestione devices etc…
l  Gestione e Coordinamento
l  Scheduling (assegnazione della CPU ai processi)
l  Meccanismi di protezione
l  Meccanismi per la comunicazione
l  Gestore Risorse
Organizzazione di un SO
interfaccia
utente utenti
interfaccia
di libreria programmi di utilità
(shell, compiler, …)
modo
interfaccia utente
system libreria standard
call (open, close, read, write, ..)

Sistema Operativo modo


(gestione processi, memoria, kernel
file system, I/O, ...)

hardware
(CPU, memoria, dischi, terminali, …)
Kernel

l  E’ quella parte del SO che risiede in memoria


principale
l  Contiene le funzioni più utilizzate del SO
l  Chiamato anche nucleo
Gestione processi

• virtualizza tante unità centrali quanti sono i


processi (processori virtuali), realizzando il
multitasking
• Implementa istruzioni di sincronizzazione e
scambio di messaggi tra processi che
operano sui processori virtuali
• realizza lo scheduling dei processi
Scheduling
l  Decide quale, tra i processi pronti, mandare in
esecuzione sulla CPU
l  Nei SO tradizionali è progettato in maniera tale da:
l  massimizzare l’efficienza di utilizzo della macchina (ad es.,
massimizzare l’uso della CPU e delle periferiche)
l  oppure, minimizzare il tempo medio di risposta dei processi

Nei sistemi real-time questi criteri non sono


sufficienti a garantire che tutti i processi
terminino entro la propria deadline!
Sistemi Operativi Interrupt-Driven

l  I sistemi operativi sono guidati dalle


interruzioni (sincrone ed asincrone)
l  Gran parte del nucleo viene eseguito come ISR
l  Gli interrupt (sia hardware che software)
guidano l’avvicendamento dei processi
l  Ogni interrupt è servito dal SO, il quale ha
l’opportunità di assegnare la CPU ad un processo
differente da quello interrotto, realizzando di fatto il
multitasking
Multitasking

l  Quando un processo effettua un’operazione di I/O,


o quando scade un quanto di tempo (timeslice, nei
sistemi time sharing), il SO può assegnare la CPU
ad un altro processo
I/O timer
P1
timer I/O
P2
I/O
P3
Sched Sched Sched Sched Sched
Context Switch

l  L’insieme di operazioni eseguite per il prerilascio di


un processo in esecuzione a favore di un nuovo
processo si chiama cambiamento di contesto
(context switch)
l  Cambia il contesto a cui appartengono le
informazioni contenute nei registri del processore
l  Program Counter, Stack Pointer, Status Register, …
l  Il tutto in maniera completamente trasparente al
processo interrotto
Context Switch
Il cambiamento di contesto è il risultato
dell’esecuzione di tre procedure distinte del SO

Procedure Context_Switch
begin
Salva_stato
Scheduling
Ripristina_stato
end
In un sistema real-time, queste operazioni
vanno realizzate in un tempo stabilito, che non
deve dipendere dal carico del sistema

36
System Call (primitive di nucleo)

l  Qualunque richiesta di un servizio di sistema (ad es.


l’avvio di un processo, la lettura dati da un sensore, la
comunicazione con un altro processo ecc…) deve
essere inoltrata attraverso una system call,
l  Le system call sono invocate tramite apposite
istruzioni macchina (svc o int) che generano un
interrupt software (trap), sincrono con l’esecuzione, il
quale consente il passaggio dal modo di esecuzione
utente al modo kernel (privilegiato)
l  L’invocazione delle istruzioni macchina è comunque
mascherato da opportune librerie di sistema
Categorie di System Call

l  Controllo di processo. Es. load, execute, allocate


mem, free mem
l  Manipolazione dei file. Es. create, delete, open,
close, read
l  Gestione dei dispositivi. Es. request device, read,
write
l  Gestione delle informazioni. Es. get time, set time
l  Comunicazione. Es. create communication
connection, send, receive
System Call e prevedibilità

l  Le system call possono influire sulla prevedibilità di


risposta dei processi, a seconda di come sono
implementate internamente

Tutte le system call devono essere caratterizzate


da una durata massima predefinita, al fine di non
introdurre ritardi indeterminati sull’esecuzione dei
processi.

l  Ciò è essenziale per valutare il WCET di un processo


ed effettuare un’analisi di schedulabilità
System Call e prevedibilità

l  L’implementazione di alcune system call richiede la


disabilitazione delle interruzioni, al fine di poter
eseguire operazioni privilegiate senza interferenze
l  Ciò può causare ritardi di attivazione di processi critici,
e dunque provocare il superamento delle loro deadline.

Le system call devono essere, per quanto


possibile, interrompibili, eseguendo ad
interruzioni abilitate
Concorrenza

l  Processi concorrenti
l  Insieme di processi la cui esecuzione si
sovrappone nel tempo.
l  Più in generale:
l  in un sistema monoprocessore due processi si dicono
concorrenti se la prima operazione di uno comincia
prima dell’ultima dell’altro

41
… le problematiche

l  Comunicazione tra processi


l  Risorse condivise
l  Sincronizzazione tra processi

42
Un semplice Esempio

void incr()
{
a = getA();
a = a + 1;
setA(a);
}
‘a’ è una variabile
condivisa

43
Un semplice Esempio: P1 e P2 invocano
la medesima funzione incr()
Process P1 Process P2
. .
a = getA(); .
. a = getA();
. a = a + 1;
a = a + 1; .
setA(a); .
. setA(a);

l  Se il valore iniziale di ‘a’ è 10, e P1 e P2 sono eseguiti


in sequenza, il valore finale dovrebbe essere 12
l  Nell’esecuzione sopra, invece, il valore finale è 11!!
44
Race Condition

…si dice che per l’esempio precedente


occorre una “Race Condition”, ovvero….

Un condizione in cui più processi leggono o


scrivono dati condivisi e il risultato finale di
tali operazioni dipende dall’ordine (e dalla
velocità) di esecuzione delle istruzioni dei
processi

45
I semafori

l  Introdotti per evitare le race condition, attraverso la


gestione esplicita di risorse condivise, della
comunicazione, e della sincronizzazione tra processi
l  Offerti dal SO attraverso una coppia di primitive:

l  wait(s): decrementa s; se il valore diventa negativo,


sospende il processo corrente e lo mette in coda.
l  signal(s): incrementa s; se il valore diventa minore o
uguale a 0 (ossia, c’è almeno un processo sospeso),
risveglia un processo e lo rimuove dalla coda.
Funzione incr() con semaforo
L’operazione di modifica viene
void incr() protetta da un semaforo ‘mutex’
inizializzato a 1
{
wait(mutex); risorsa critica
a = getA();
a = a + 1; sezione critica

setA(a);
signal(mutex);
}
47
Esecuzione di incr() con semafori

Process P1 Process P2
. .
wait(mutex); .
a = getA(); .
. wait(mutex);
a = a + 1; .
setA(a); .
signal(mutex); .
. a = getA();
. a = a + 1;
. setA(a);
. signal(mutex);

48
Semafori e prevedibilità

l  Il meccanismo semaforico introduce vincoli


nell’esecuzione dei processi, la cui esecuzione può
essere ritardata in modo imprevedibile e dipendente
dalla velocità relativa dei processi stessi

l  Introduce inoltre il fenomeno dell’inversione di priorità


l  Task ad altra priorità bloccati indefinitivamente a causa di task
a priorità più bassa
Semafori e prevedibilità

l  Nei sistemi real-time si adottano opportuni protocolli


per governare l’accesso alle sezioni critiche
l  Priority Inheritance
l  Priority Ceiling
l  Stack Resource Policy

l  Introducono test aggiuntivi all’ingresso delle sezioni


critiche
l  Richiedono la modifica radicale del meccanismo
semaforico e del nucleo del SO
Gestione della memoria

•  Astrae la memoria centrale: ogni processo ha


l’illusione di disporre dell’intera memoria
•  consente di far riferimento a spazi di indirizzi di
memoria virtuali
•  garantisce la protezione della memoria
•  consente in taluni casi di ignorare se il programma e/o
i dati siano fisicamente residenti in memoria centrale o
su memoria di massa (memoria virtuale)
Gestione della memoria

l  Consente la rilocazione dinamica


l  A tempo di esecuzione, l’immagine del processo può essere
spostata da una locazione di memoria ad un’altra
l  Fa uso di indirizzi logici (virtuali) tradotti in indirizzi fisici
direttamente durante l’esecuzione

l  Si avvale di meccanismi hardware per il mapping tra


indirizzi logici e fisici e per la protezione
l  MMU: Memory Management Unit

l  E di meccanismi software per l’organizzazione della


memoria, gestiti dal sistema operativo
Rilocazione e protezione con
registri base e limite

S.O.

Processo 1
1000 1000
Registro Base
Processo 2

1120 120
Processo 3 Registro Limite
Hardware di rilocazione e protezione
(MMU)
memoria fisica

MMU

registro limite
6140 immagine processo
10240
indirizzo
eccezione
logico
CPU ≤ no
x = 4112
si indirizzo
fisico
+ y = 14352
14352

16380
10240
registro base
Paginazione

l  Consente di allocare un processo in maniera non


contigua, suddividendo la sua immagine in pagine di
dimensione fisse (ad es., 4 KB)
l  Immagine suddivisa in pagine logiche che poi vengono
mappate su pagine fisiche, o frame
Paginazione
P1 P2 Memoria fisica
Pag 1 Pag 1 Pag 3

Pag 2 Pag 2 Pag 2

Pag 3 Pag 3
Pag 4 Pag 4 Pag 4
Pag 5 Pag 1

Pag 1

Pag 2

Pag 3

Pag 4

Pag 5
Paginazione: traduzione degli
indirizzi
l  La corrispondenza tra pagine logiche e fisiche avviene
attraverso la tabella delle pagine

indirizzo logico indirizzo fisico


CPU <pagina, offset> <frame, offset> frame
offset

Tabella delle pagine memoria


l  La MMU si complica per implementare via hardware il
mapping ed effettuare il caching della tabella delle
pagine (TLB)
Paginazione su domanda

l  Permette di caricare solo la parte dell’immagine del


processo che occorre in un certo momento (memoria
virtuale), consentendo di caricare su domanda le
pagine mancanti
l  Minore occupazione di memoria fisica
l  Maggior numero di processi gestibili

l  Alcune pagine risiedono in memoria centrale e altre sul


disco (area di swap)
Paginazione su richiesta
P1 P2 Memoria fisica Disco
Pag 1 Pag 1 Pag 3

Pag 2 Pag 2

Pag 3 Pag 3 Pag 2 Pag 3


Pag 4 Pag 4 Pag 4
Pag 5 Pag 1 Pag 2
Pag 1

Pag 5

Che succede se durante


l’esecuzione di P1 viene
richiesto un dato
presente in Pag 2? Pag 4
Page Fault
l  Se il processo tenta di accedere a una pagina che non era
stata caricata nella memoria, si verifica un’eccezione di pagina
mancante (page fault).
l  Il sistema operativo deve decidere:
l  errore di indirizzo non valido ⇒ abort.
l  caricamento della pagina richiesta in memoria
l  Nell’ultimo caso…
l  Si individua la pagina richiesta sul disco
l  Si individua un frame di memoria libero
l  Se la memoria è piena, si impiega un algoritmo di sostituzione per
individuare una pagina “vittima” da sostituire
l  Si trasferisce la pagina chiesta nel blocco di memoria individuato
l  Si riprende l’istruzione interrotta dal page fault
Gestione della memoria e prevedibilità

l  In un sistema real-time le tecniche di gestione della


memoria non devono introdurre ritardi indeterminati
durante l’esecuzione di processi critici

l  Fonti di non determinismo delle tecniche più adottate:


l  Meccanismi di caching della MMU
l  Gestione dei page fault
l  Algoritmi di sostituzione delle pagine
Gestione della memoria e prevedibilità

l  Nei sistemi real-time è preferibile:


l  disabilitare la memoria virtuale, per evitare i page fault
l  adottare tecniche di partizionamento statico della memoria

l  Partizionamento statico:
l  la quantità di memoria fisica richiesta da ogni processo viene
predeterminata prima dell’esecuzione
l  l’immagine rimane allocata nelle stesse locazioni durante tutta
l’esecuzione;
l  è realizzabile attraverso tecniche di rilocazione statica (codice
con indirizzi assoluti) che consentono anche di fare a meno
della MMU (sistemi no-MMU)
Prevedibilità e flessibilità

l  In generale, la preallocazione delle risorse e della


memoria aumenta la prevedibilità e la velocità del
sistema operativo, ma ne riduce la flessibilità,
specie in ambienti dinamici
l  E’ compito del progettista di sistema effettuare una
valutazione dell’ambiente (ad es., se statico o dinamico)
e dell’esigenze applicative al fine di trovare un
compromesso tra flessibilità e prevedibilità

Potrebbero piacerti anche