Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
È un sistema che acquisisce dati dal mondo esterno tramite dei sensori e agisce su di esso per mezzo di attuatori.
Sensori: raccolgono dati dall’ambiente del sistema. Attuatori: cambiano attraverso certe azioni l’ambiente del sistema.
La particolarità di un sistema real-time è che la correttezza dell’elaboratore dipende non solo dai valori in uscita ma
anche dall’istante in cui tali risultati vengono resi disponibili.
Per far ciò il sistema Real time deve essere sottoposto a dei vincoli temporali, dunque il tempo del sistema deve essere
sincronizzato con quello dell’ambiente esterno
• Soft real time system: è un sistema in cui se le operazioni non rispettano le relative deadline provocano un
danno NON irreparabile
• Hard real time system: è un sistema in cui se le operazioni non rispettano le relative deadline provocano un
danno irreparabile
Un solo processo alla volta può essere eseguito in un istante di tempo, ma usando il time sharing il SO può switchare i
processi e decidere chi eseguire, in modo tale da far risultare che stia eseguendo tanti processi “allo stesso tempo”. È
importante per il SO sapere quali processi sono pronti per essere eseguiti.
• Succede quando:
o Il processo ha una priorità minore rispetto ad uno appena arrivato
o Il processo si è bloccato su una condizione
o Il processo ha concluso il suo round (solo nei Time-sharing-systems)
• Bisogna salvare il suo stato per ripristinare il processo in seguito, richiede del tempo
• Esso può essere
o Volontario: il processo richiama una funzione primitiva (bloccante come un read() )
o Involontario: un’interruzione causa il context switch
Notiamo che ci possono essere più code dei processi e anche queste code
possono avere un ordine di precedenza, con algoritmi di schedulazione
diversi.
Differenza fra Threads e Processi
• Processi:
o Gestione risorse: un processo ha uno spazio di indirizzamento nel quale sono allocate le risorse
o Esecuzione: l’esecuzione di un processo è un percorso e genera una traccia, sequenza di stati interni. È
composto da vari stati e da parametri di scheduling.
o Generalmente un processo non condivide memoria. La comunicazione tra processi avviene con
primitive. Lo switch tra i processi è più complesso per via del cambio di spazio di indirizzamento.
• Thread:
Due Threads dello stesso processo condividono lo stesso spazio di indirizzamento, dunque hanno accesso alle
stesse variabili, la comunicazione tra Thread è più semplice e lo switch tra Thread è meno costoso.
I processi utilizzano risorse distinte mentre i Thread le condividono. I processi solitamente sono in contrasto per
l’acquisizione di risorse. I Threads sono utilizzati invece per collaborare ad un solo obiettivo.
I thread sono entità schedulabili che vengono eseguite con un processo, ogni processo ha un thread principale,
il quale, può averne molti altri con cui condivide lo spazio di indirizzamento del processo invocato
La maggior parte dei Sistemi RT non fornisce le caratteristiche di un sistema desktop standard.
Generalmente:
• Hanno una singola funzione.
• Non richiedono l’interazione con l’utente.
• Richiedono meno hardware di quello richiesto dalle funzioni di un PC desktop.
• Caratteristiche di un RTS:
o Controllo concorrente di diverse parti del sistema (si lavora in parallelo).
o Estremamente affidabile e sicuro, i RTS controllano l’ambiente in cui operano; la generazione di errori nel
controllo possono causare danni.
o Tempi di risposta garantiti (dobbiamo predire il caso peggiore)
• Caratteristiche desiderabili:
o Tempestività: bisogna implementare meccanismi di gestione del tempo e di gestione dei task nei tempi
o Predicibilità: essere sicuri che il sistema si comporterà come previsto. Garantire la soddisfazione delle
deadline
o Tolleranza del guasto: dei guasti nel sistema non devono causare problemi
o Costruiti per il caso peggiore: tutti gli scenari vanno considerati.
(Alcuni di questi requisiti possono essere soddisfatti con elementi del SO)
Per quanto riguarda la predicibilità ci sono molti elementi che possono portare ad un non-determinismo, come ad
esempio le caratteristiche del SO, la gestione della memoria e le architetture. Di seguito, alcuni metodi per raggiungerla.
Problema: il dispositivo I/O e la CPU usano lo stesso bus. Due possibili soluzioni:
• Cycle stealing. Il DMA ruba alla CPU un ciclo di memoria per eseguire un trasferimento di dati. La CPU aspetta
finché il trasferimento non venga completato. Il sistema non è deterministico.
• Time-slice method. Ogni ciclo di memoria è diviso in due slots: uno per la CPU e uno per il DMA. Più costoso ma
deterministico.
Cache
Per ottenere un’alta predicibilità è meglio avere un processore senza cache.
Interrupts
Nella maggior parte dei OS gli interrupts sono utilizzati per rispettare la priorità di schemi prefissati. Gli interrupts hanno
una priorità più elevata dei processi. Il ritardo prodotto dagli Interrupts è causato da quanti Interrupts avvengono
durante l’esecuzione di un task e da quanto dura la loro esecuzione.
Il problema che può sussistere è che i processi da eseguire siano più importanti delle operazioni di I/O che causano
interrupts. Soluzioni:
1. Si può pensare di disabilitare tutti gli interrupt eccetto quelli dei timer. Questo comporta che tutti i dispositivi
periferici debbano essere gestiti tramite dei task, il trasferimento dati utilizza il meccanismo del polling
(trasferisce quando è il suo turno), è un meccanismo flessibile che permette di stimare precisamente i tempi per
il trasferimento dati e non serve cambiare il kernel quando si aggiungono dispositivi. Tuttavia a causa dell’attesa
della CPU si ha una riduzione delle performance del processore e i task devono essere a conoscenza dei dettagli
dei livelli inferiori del sistema.
2. Si disabilitano tutti gli interrupt tranne quelli dei timer e si gestiscono i dispositivi tramite speciali routine del
kernel con timer attivato. I vantaggi sono che vengono eliminati i ritardi dovuti agli interrupt, si può stimare in
anticipo le routine periodiche dei dispositivi e i dettagli dell’hardware possono essere incapsulati in particolari
routine dedicate. Gli svantaggi sono che non viene risolta la riduzione della performance del processore, che ci
sono più comunicazioni tra processi che vanno gestite e che il kernel deve essere modificato quanto vengono
aggiunti dei dispositivi.
3. Vengono abilitati degli interrupt esterni e vengono ridotti i driver (insieme di procedure che permettono ad un
sistema operativo di pilotare un dispositivo hardware) alle dimensioni più piccole possibili. Questi si attivano
solo per gestire determinate task del dispositivo corrispettivo. I task vengono comunque eseguiti sotto il
controllo dell’OS come tutti gli altri task. Inoltre i task degli utenti hanno maggiore priorità dei task dei
dispositivi. I vantaggi sono che non si ha più l’attesa alla CPU, vengono notevolmente ridotti i ritardi dovuti agli
interrupt dei dispositivi, e quelli restati possono essere stimati precisamente.
System Calls
Tutte le chiamate di sistema devono essere caratterizzate da un limitato tempo di esecuzione. Tutte le primitive del
kernel devono essere predicibili. Chiamate non predicibili possono ritardare l’esecuzione di attività critiche.
Semafori
In generale i semafori non sono adatti ai sistemi RT per dei problemi che riguardano le inversioni di priorità, infatti un
task ad alta priorità può essere bloccato da uno a più bassa priorità per un periodo di tempo imprecisato. La soluzione è
quella di usare speciali protocolli: Priority Inheritance o Priority Ceiling.
Priority ceiling: è una tecnica che serve a limitare l’acceso ad una risorsa limitata da parte di un task a priorità più bassa.
Un task non può accedere ad una risorsa se essa è occupata da un task a priorità più alta. Il SO deve avere nel codice
un’istruzione per specificare le priorità dei task.
Priority inheritance: la priorità del task cambia nel corso della sua esecuzione per mano del SO, per tenere conto della
priorità di altri task che hanno bisogno della risorsa. Questo protocollo ha il vantaggio di essere completamente
trasparente al programmatore e di impedire l’inversione di priorità. Non impedisce però i deadlock ed i blocchi a catena.
6 - POSIX THREADS
POSIX = Portable Operating System Interface. Famiglia di standard IEE che mantiene la compatibilità tra diversi OS.
I thread sono entità che possono essere schedulabili e che vengono eseguiti all’interno di un processo. Ciascun processo
ha un thread principale e può avere più thread aggiuntivi che condividono lo stesso spazio di indirizzamento del
processo invocato tramite pthread_create().
Pthread è implementato dalla libreria libpthread.so. Il file header pthread.h consente di includere nella propria
applicazione in linguaggio C un set di circa cento funzioni, costanti, definizioni e strutture, tutti identificati dal prefisso
pthread_ e divisi in quattro gruppi:
La configurazione avviene attraverso una variabile di tipo pthread_attr_t: tale variabile contiene tutti gli elementi di
configurazione del thread. Una volta inizializzata può essere usata per mostrare varie configurazioni grazie a funzioni
specifiche. Può essere riutilizzata per la configurazione di altri thread e le eventuali modifiche dopo la creazione.
La funzione threadRun passata al thread implementa l’attività del task, restituisce void* e deve terminare con la
chiamata alla funzione pthread_exit che segnala l’uscita da un thread.
Passaggio di parametri. È possibile interagire con l’esecuzione di un thread attraverso i parametri passati alla funzione
task e attraverso variabili globali o comunque visibili nell’ambito della funzione.
• thread joinable: Il thread invocante attende la terminazione del thread invocato chiamando una funzione. Tutte
le strutture dati allocate dal thread non verranno deallocate fino alla chiamata del pthread_join.
• thread detached: Questi invece hanno un’esecuzione completamente autonoma rispetto al thread invocante
Due o più thread possono fare accesso ad una risorsa condivisa (es: una variabile globale) solo in modo mutuamente
esclusivo. Per garantire che, in ogni istante, solo un thread possa accedere alla risorsa occorre definire delle sezioni
critiche. La libreria pthread gestisce l’accesso alle sezioni critiche attraverso degli oggetti detti mutex (mutualexclusive).
Ogni thread può acquisire e rilasciare il controllo di un mutex attraverso due funzioni definite dalla libreria stessa. Fino a
quando un thread mantiene il controllo su un certo mutex, nessun altro thread può acquisirne il controllo. Quando un
thread rilascia il controllo di un mutex, un altro può prenderne possesso.
7 - TASK COMUNICATION
In molte applicazioni Real-time i task si scambiano dati tramite l’uso di variabili globali:
• Vantaggi: meccanismo più veloce, possibilità di analisi di schedulazione, basso tempo di esecuzione
• Svantaggi: bisogna accedere ai dati con mutua esclusione, non adatto per design modulari, un cambiamento di
un task comporta un cambiamento anche negli altri tasks
Un’altra tecnica è quella di scambiarsi messaggi per scambiarsi dati, ciò comporta che
Molti canali mantengono l’astrazione attraverso i port, i task scambiano messaggi tramite l’uso di due primitive:
Prima di essere usata, una port deve essere creata dopodiché distrutta se non più utilizzata. Gli attributi delle port
devono essere definiti al momento della creazione.
Un messaggio mandato ad un port è inserito in un buffer, la cui dimensione è definita al momento della creazione, con
da una parte il mittente (task1) e dall’altra il destinatario (task2).
Nel momento in cui i due task avessero frequenza diversa il canale potrebbe riempirsi troppo o svuotarsi troppo.
Problemi di invio messaggio: se un messaggio viene inviato quando il buffer è pieno può succedere che:
• il mittente è bloccato finché il destinatario non legge un messaggio
• il messaggio viene perso
• un messaggio di errore ritorna al mittente
Problemi ricezione del messaggio: se il buffer è vuoto il ricevente è bloccato finché un nuovo messaggio non viene
inviato oppure un messaggio di errore viene mandato al ricevente.
Esiste un proprietario della connessione (A) ed è colui
che deve iniziare per primo.
1. 𝑇1 <𝑇2
o 𝜏1 manda molti più messaggi nel buffer di quanti 𝜏2 possa leggerne.
o Quando il buffer si riempie 𝜏1 procede alla stessa frequenza di 𝜏2
2. 𝑇1 >𝑇2
o 𝜏2 legge molti più messaggi di quanti 𝜏1 possa inviarne
o Quando il buffer si svuota 𝜏2 deve procedere alla stessa frequenza di 𝜏1
Quindi se 𝑇1 ≠ 𝑇2, dopo un certo periodo di tempo, entrambi i task andranno alla velocità di quello più lento. Per
raggiungere la priopria velocità di trasmissione, i task che usano port sincroni dovrebbero avere lo stesso periodo.
Buffer saturato (dopo quanto tempo il buffer si satura, cioè i task si stabilizzano su una frequenza)
𝑇1 𝑇2
𝑡 < (𝑁 − 1)
𝑇2 − 𝑇1
STICK ports
Questa tecnica si usa quando non ci importa avere un buffer di tutti i messaggi, ma solo il più recente, ciò comporta che
i task non si interromperanno mai perché i buffer non saranno mai pieni o vuoti. Buffer a una dimensione.
Nonostante lo stick port non si blocchi in caso di buffer pieno (o vuoto), può bloccarsi per la mutua esclusione, in
maniera più specifica sui semafori. Lunghi messaggi possono causare lunghi ritardi sui semafori. Lunghe attese possono
essere evitate attraverso la replicazione dei buffer.
È un modo per scambiarsi messaggi tra task periodici con frequenza diverse
• I confitti di memoria sono evitati con la replicazione di buffer interni ad una dimensione (sono stick ports
replicate)
• L’ultimo messaggio è sempre disponibile alla lettura
• L’ultimo messaggio sovrascrive quello precedente
• I messaggi non sono distrutti dal lettore
Accessi simultanei
Se un task τw scrive, mentre un altro task τr sta leggendo si scrive un nuovo messaggio in un nuovo buffer.
DUAL BUFFERING
CAB non fa altro che generalizzare il dual buffering per N lettori. Così facendo il lettore non è forzato a memorizzare il
messaggio nel proprio spazio. L’accesso ai dati avviene con un puntatore alla memoria. Più lettori possono leggere lo
stesso messaggio in concorrenza. C’è sempre un puntatore mrb (most recent buffer) che punta al buffer più recente in
cui è scritto il nuovo messaggio.
Se questa tecnica CAB è usata da N task, per evitare blocchi, bisogna avere almeno N+1 buffer. Questi buffer
serviranno per mantenere il messaggio più recente nel caso i buffer siano usati.
PRIMITIVE CAB
• Creation
o cab_create(cab_name, buf_size, max_buf) crea un CAB di grandezza max_buf buffers di lunghezza
buf_size byte
o cab_delete(cab_id) distrugge il CAB
• Writing
o cab_reserve(cab_id, pointer) ritorna il puntatore per scrivere in un buffer libero
o cab_putmes(cab_id, pointer) ritorna il puntatore dopo un’operazione di scrittura
• Reading
o cab_getmes(cab_id, pointer) ritorna un puntatore al messaggio più recente
o cab_unget(cab_id, pointer) rilascia il puntatore dopo l’operazione di lettura
8 RT- COMUNICATION
Livelli di Rete:
• Livello fisico: si occupa della codifica, decodifica,
trasmissione e ricezione dei bit
• Livello Data link: Contiene il Medium Access Control (MAC) il quale si occupa della condivisione del mezzo
trasmissivo
Paragone fra comunicazione e scheduling
Scheduling
La risorsa contesa è la CPU. Se N task vengono eseguiti su un computer, il sistema operativo si occupa di stabilirne
l’esecuzione assegnando la CPU ai vari task, ovvero ha il compito di eseguire la schedulazione. Il gestore della risorsa è lo
scheduler.
Alcuni parametri fondamentali di cui tenere conto sono:
• Il tempo di risposta, ovvero quanto tempo trascorre da quando il task è pronto per l’esecuzione a quando viene
effettivamente eseguito.
• La schedulabilità di un task set, cioè la capacità del sistema operativo di gestire un insieme di task con
caratteristiche (periodo, deadline, tempo di esecuzione) differenti, rispettando i limiti di deadline.
È necessario che la CPU sia interrompibile, nel senso che per poter ripartire al meglio la CPU, i processi devono poter
essere interrotti in qualsiasi istante.
Comunicazione
Un altro tipo di risorsa condivisa è il bus, il mezzo trasmissivo. Il gestore della risorsa è il MAC, una funzionalità del
Sistema Operativo in grado di decidere a chi assegnare l’accesso al canale trasmissivo. In questo casonon ci sono dei
task ma i pacchetti. Un processo è l’esecuzione di un algoritmo. Nelle reti l’equivalente del processo è il pacchetto, che
non può assolutamente essere trasmesso in frammenti. Per la comunicazione esiste un solo parametro fondamentale: Il
tempo di risposta.
La gestione del canale di comunicazione è assegnata al MAC (Medium Access Control) attraverso protocolli come
CSMA/CD: scambio di messaggi attraverso un canale condiviso. Viene anche definito Ethernet o IEEE 802.3.
Il CSMA/CD è un metodo di accesso al mezzo trasmissivo tipico del livello MAC in cui tutti i nodi sono connessi allo
stesso Bus.
1. Un nodo connesso in rete ascolta se il mezzo di trasmissione è libero (carrier sense): se non lo trova occupato
trasmette, in caso contrario continua ad ascoltare. Una volta libero trasmetterà il messaggio.
2. Se viene rilevata una collisione durante una trasmissione, viene trasmessa una breve sequenza di jamming (un
messaggio di avviso) per assicurarsi che tutte le stazioni sappiano della collisione e non provino a trasmettere
evitando la creazione di ulteriori collisioni (collision detection)
3. Dopo la trasmissione del segnale di jamming, si attende una quantità di tempo pseudo casuale e si ritenta la
trasmissione
Questo scambio di messaggi non è però deterministico poiché ci sono delle attese, non è possibile dunque applicarlo ai
sistemi real-time.
È importane che i messaggi arrivino nel tempo definito dal progettista. L’alternativa al CSMA/CD è definire criteri diversi
per accedere al mezzo trasmissivo. Esistono due categorie:
Un’implementazione CAN per essere compatibile con la specifica CAN 2.0 deve essere compatibile con una delle due
parti; inoltre, una compatibile con la parte A può comunicare con una compatibile con la B se non vengono usati
messaggi estesi.
PARTE B
Comunicazione di tipo broadcast. I pacchetti non contengono indirizzi ma un identificatore che ne specifica anche la
priorità. Tutti i nodi ascoltano e filtrano solo quelli di interesse.
Arbitrato bit-wise: Tecnica secondo la quale, se un nodo trasmette il bit recessivo sul bus e, contemporaneamente, un
altro nodo trasmette quello dominante. il primo, leggendo il bit dominante, capirà di avere priorità minore e terminerà
la sua trasmissione.
• Monitoring: il trasmettitore monitora il messaggio trasmesso, se legge un bit diverso da quello trasmesso,
genera un Bit error.
• Bit-stuffing:
o Dopo 5 bit della stessa polarità il trasmettitore aggiunge un bit della polartà opposta, il lettore farà il
contrario togliendo il bit
o Se il lettore vede più di 5 bit uguali consecutivi si genera uno Stuff error
o Quando uno o più errori vengono individuati da almeno una stazione usando questi meccanismi, la
trasmissione viene interrotta e viene inviato un Error Flag. Quest’ultimo è costituito da 6 bit dello stesso
segno e viola volontariamente la regola del “bit stuffing”, in modo che tutte le altre stazioni rilevino un
errore e spediscano anch’esse un Error flag. Questa procedura evita che altre stazioni accettino il
messaggio e quindi assicura la consistenza dei dati lungo la rete
o Dopo la trasmissione di un messaggio errato, che è stato abortito, il trasmettitore automaticamente
ritenta la trasmissione (‘ritrasmissione automatica’), eventualmente entrando in competizione con altre
stazioni per l’accesso al bus.
9 - DDS
L'espressione publisher/subscriber si riferisce a un design pattern o stile architetturale utilizzato per la comunicazione
asincrona fra diversi processi, oggetti o altri agenti. Per la sua natura di integrazione tra diverse sorgenti software, il
pattern publisher/subscriber può essere considerato un middleware.
In questo schema, mittenti e destinatari di messaggi dialogano attraverso un tramite, che può essere
detto dispatcher o broker. Il mittente di un messaggio (detto publisher) non deve essere consapevole dell'identità dei
destinatari (detti subscriber); esso si limita a "pubblicare" il proprio messaggio al dispatcher. I destinatari si rivolgono a
loro volta al dispatcher “abbonandosi” alla ricezione di messaggi. Il dispatcher quindi inoltra ogni messaggio inviato da
un publisher a tutti i subscriber interessati a quel messaggio.
Questo schema implica che ai publisher non sia noto quanti e quali siano i subscriber e viceversa.
il DDS è un servizio che fornisce uno spazio astratto dove le applicazioni possono autonomamente e in maniera
asincrona leggere e scrivere dati godendo di un disaccoppiamento temporale e spaziale (significa che ciascun
applicazione si sincronizza con le altre solo quando ha bisogno di comunicare con le altre, ma per il restate tempo
rimane indipendente).
Il Data Distribution Service for Real Time Systems (DDS) è uno standard che definisce un middleware per la
distribuzione di dati in tempo reale secondo il paradigma publish/subscribe.
Il DDS è un middleware per sistemi distribuiti, il cui funzionamento è basato sullo scambio di dati in tempo reale da più
sorgenti a più destinazioni. I vantaggi dell'uso di DDS in questo dominio sono i seguenti:
• Accoppiamento lasco tra entità e semplicità d'uso grazie all'uso del paradigma publisher/subscriber nella
variante topic-based;
• Architettura flessibile ed adattabile grazie al discovery automatico;
• Efficienza grazie alla comunicazione diretta tra publisher e subscriber;
• Determinismo nella consegna dei dati;
• Scalabilità elevata come conseguenza dell'accoppiamento lasco tra entità;
• Qualità di Servizio altamente parametrizzabile;
• Indipendenza dalla piattaforma
Rappresenta le applicazioni Insieme di oggetti
Insieme di oggetti che partecipano alla DataReader responsabili
DataWriter responsabili comunicazione collettiva della ricezione dei dati
dell’informazione
Il subscriber si
sottoscrive
all’argomento cui è
interessato
DataWriter
Punto di accesso per la pubblicazione di dati all'interno di un topic. Il DataWriter viene creato a partire da un Publisher,
il quale a sua volta è associato univocamente ad un Topic. E’ un entità tipizzata che viene utilizzata per produrre
campioni di una o più istanze di un Topic con determinate regole.
DataReader
Punto di accesso per la ricezione di dati all'interno di un topic. Come il DataWriter, anche il DataReader è una entità
astratta che viene resa concreta tipizzando la sua interfaccia con il tipo di dato corrispondente al topic a cui il
DataReader si riferisce.
è il livello inferiore di DDS che definisce le entità, i ruoli, le interfacce e le policy di QoS per la piattaforma
publish/subscribe, nonché le tecniche di discovery dei partecipanti alla comunicazione. DCPS rappresenta in sostanza la
parte dello standard relativa alla comunicazione di rete.
Le applicazioni semplicemente ricevono e mandano dati con una standard API e il DDS si occupa quindi
dell’instradamento, la conversione, la ricezione e degli errori.
Il DataWriter alla creazione è generalmente legato ad un singolo Topic, mentre il DataReader può essere legato a uno
o più Topic (ContentFilteredTopic o MultiTopic).
Qos (Durabilità) = definisce se e come le istanze di un topic sono salvate. Tipologie di durabilità:
Keys = quando dichiariamo un publisher creiamo una coda (se il publisher scrive). Ci possono essere diverse code per un
topic e un subscriber può voler topic diversi.
11 – MODELLO SISTEMA RT
Per processori (esempio dei server) si intendono le risorse attive. Due processori si definiscono dello stesso tipo se
funzionalmente identici e possono essere scambiati tra loro. Vengono definiti con la lettera maiuscola P1, … , Pn .
Per Risorse si intendono le risorse passive, necessarie per l’avanzamento dell’applicazione e non sono caratterizzate da
una velocità (a differenza dei processori). Si rappresentano con la lettera maiuscola R (1 … n). Le risorse possono essere:
Coda di attesa
È il buffer dove sono conservati tutti i job pronti per la propria
esecuzione. Questa coda è gestita attraverso un algoritmo di
scheduling che si occupa di ordinare la coda. Ogni volta che si
attiva un job, la coda viene riordinata.
Modalità di attivazione
I task vengono attivati seguendo due modalità:
• Time driven per i task periodici, quando il processo viene attivato ad intervalli regolari
• Event driven per i task aperiodici, quando il processo viene attivato all’arrivo di un evento o mediante una
primitiva di attivazione. (i task sporadici sono dei task aperiodici che si presentano a intervalli non regolari ma di
cui sappiamo la ripetizione statistica)
Preemption
È una sospensione dell’esecuzione di un job per cedere il processore ad un job più urgente. La sua esecuzione può
riprendere alla fine dell’esecuzione del task a priorità maggiore. Un job può dunque essere preemptable se la sua
esecuzione può essere interrotta in un qualsiasi istante o non-preemptable se all’interruzione della trasmissione la
frame viene scartata e rinviata. Tale tecnica necessita il salvataggio dello stato prima del cambio di contento (context
switch) e questa operazione richiede del tempo.
Schema dei task RT
• ri release time istante di attivazione del processo, quando il job diviene disponibile per l’esecuzione
• si start time (activation time) istante in
cui il processore estrae il task dalla coda
dei processi pronti e lo esegue
• fi finishing time instante in cui finisce
l’esecuzione del task
• di deadline assoluta istante entro la quale
il task deve concludersi
• Di deadline relativa intervallo di tempo dall’attivazione del task alla sua deadline
• Ci execution time tempo di esecuzione stimato (caso peggiore)
Altri parametri
• Finishing-time jitter = f – r
• Start-time jitter = s – r
• Completition-time jitter = f – s
Criteri di ottimalità
Sono dei criteri che ci informano della qualità del sistema
1
• Tempo medio di risposta: 𝑅̅ = 𝑛 ∑𝑛𝑖=1(𝑓𝑖 − 𝑟𝑖 )
• Tempo di completamento totale: 𝑡𝑐 = 𝑚𝑎𝑥(𝑓𝑖 ) − 𝑚𝑖𝑛(𝑟𝑖 )
• Fattibilità
• Avarage response time: tempo medio di risposta di un gruppo di jobs
• Miss rate: percentuale di jobs che non rispettano la deadline
• Loss rate: è la percentule di jobs scartati perché non possono soddisfare la deadline
• Invalid rate: somma della miss rate o della loss rate
Parametri funzionali
Criticità di un job: è l’importanza del risultato prodotto dal task. I task più critici devono essere completati prima della
loro deadline anche a discapito di quelli meno critici. È un valore numerico positivo che esprime l’importanza rispetto ad
altri tasks. È molto importante nel caso di sovraccarico (overhead), quando non si possono rispettare tutte le deadline.
Esecuzione opzionale di un job: Si può strutturare un’applicazione in modo che alcuni job o porzioni di job siano
opzionali, cioè possono essere sacrificati senza pregiudicare le funzionalità del sistema.
• Hard deadline: la deadline miss porta ad un guasto fatale con conseguenze disastrose
• Soft deadline: è indesiderabile ma tollerabile
L’efficienza di un sistema viene espressa in misura quantitativa (p) e con il ritardo di completamento (tardiness t)
L’importanza può
L’importanza del diventare nulla nel
risultato si annulla tempo
molto velocemente
Si parla per lo più di hard deadline quando il progettista deve dimostrare che il job rispetta sempre la deadline nelle
condizioni specificate.
• Un sistema è definito hard real time se una parte significativa delle deadline è di tipo hard. Questi sistemi
devono tipicamente gestire task velocemente e richiedono SO specializzati
• Un sistema viene invece definito soft real time se i job hanno deadline di tipo soft.
Schedulazione
Uno schedule è un preciso ordine di assegnamento del processore ai job.
Context switch
Time slice
Assunzioni semplificative: utilizziamo un singolo processore; gli insiemi di task sono omogenei; la task è preemptive;
non ci sono vincoli di precedenza; non ci sono vincoli sulle risorse.
Schedule con preemption
Uno schedule valido deve soddisfare le seguenti condizioni:
Feasible schedule
Uno schedule valido è feasible se ogni job completa la sua esecuzione entro la sua deadline. Un insieme di job è
schedulabile rispetto ad un dato algoritmo di scheduling se l’algoritmo produce sempre uno schedule feasible. Un
algoritmo di scheduling hard real-time è ottimo se l’algoritmo produce sempre uno schedule feasible quando l’insieme
dato di job ha uno schedule feasible. Quindi, se un algoritmo ottimo non trova uno schedule feasible per un dato
insieme di job, allora si può concludere che l’insieme di job non è schedulabile da alcun algoritmo.
VINCOLI DI SCHEDULAZIONE
Vincoli temporali di un job. Un’operazione non deve iniziare prima del suo release time e non deve terminare dopo la
sua deadline. Due tipi di vincoli:
• Vincolo di consistenza temporale: stabilisce che per ogni attività (Job) una operazione può iniziare quando la
precedente è terminata.
• Vincolo di consistenza delle risorse: stabilisce che una data risorsa può eseguire una sola operazione alla volta.
In effetti, ogni attività richiede l’utilizzo esclusivo delle risorse.
Per avere consistenza dei dati è dunque necessario introdurre la mutua esclusione delle risorse, ma questo introduce
anche dei ritardi.
Grafo di precedenza
Ci permette di studiare ed osservare i vincoli di precedenza tra i job di un task. Ji precede Jk e Jk non può iniziare la
propria esecuzione finché Ji non è terminata.
• Un insieme di grafi di precedenza per diversi task si chiama task graph. Consente di rappresentare vari tipi di
relazioni.
• Data dependency: esprime la relazione che il job jk consuma i dati prodotti dal job ji. Al collegamento si associa il
parametro che rappresenta il volume di dati scambiati
• Temporal distance: esprime il vincolo tra i tempi di completamento di due job (es. tra video e audio)
• OR precedence constraints
• Conditional branches
• Pipeline relationship
è una dipendenza tra i due job Produttore-Consumatore
12 – ALGORITMI DI SCHEDULAZIONE
• Statici: le decisioni di scheduling dipendono da parametri fissi, assegnati staticamente ai task prima
dell’attivazione.
• Dinamici: le decisioni di scheduling dipendono da parametri che variano nel tempo.
• Online: Le decisioni sono prese in tempo reale quando un nuovo task entra nel sistema o termina
• Offline: L’algoritmo è usato sull’intero set di tasks prima della sua esecuzione. Lo schedule viene memorizzato
• Garantiti: I task sono garantiti e rispettano la loro deadline. Nuovi task vengono accettati solo se l’intero sistema
rimane garantito
• Best effort: Le deadline sono rispettate quanto è possibile e i nuovi task vengono sempre accettati
Algoritmi di scheduling
• Ottimi: Garantiscono di trovare uno schedule fattibile se esiste e, in base ad una metrica, trovare il migliore
schedule
• Euristici: Tendono a fornire buoni risultati senza però garantirne l’ottimalità
• Chiaroveggenti: Conoscono in anticipo gli istanti di arrivo dei tasks
Approcci di scheduling
• Clock-driven (o time driven): le decisioni di scheduling sono prese in istanti precisi di tempo (scelti a priori)
• Priority-driven: Le decisioni vengono prese quando avvengono particolari eventi nel sistema
Clock driven
C’è un istante di scheduling, istante in cui lo scheduler decide quale job eseguire come prossimo (questi istanti sono
definiti a priori). Quando i parametri dei job sono noti a priori la schedule può essere precalcolata e salvata in una
tabella (table driven). Negli istanti di scheduling lo scheduler può usare la priorità per la sua decisione.
Priority driven
Il processore non resta mai inattivo, è chiamato anche (approcci differenti)
• Greedy scheduling : perchè l’algoritmo cerca di prendere decisioni ottimali localmente. Non fa mai attendere un
job che può essere mandato in esecuzione (questo approccio non è sempre il migliore).
• List scheduling : perchè ogni algoritmo priority-driven può essere implementato inserendo i job pronti per
l’esecuzione in una lista ordinata per priorità dei job.
ALGORITMI CLOCK-DRIVEN
Questo approccio è applicabile quando il sistema è basato principalmente su task periodici e deterministico e, al più,
gestire alcuni task aperiodici o sporadici.
Modello
n task periodici con n fisso, i parametri sono noti a priori, i job aperiodici vengono rilasciati a istanti non prevedibili.
L’insieme dei task è caratterizzato da un iperperiodo H, da una utilization di un task e da una total utilization che è
somma di tutte le utilization.
Siccome tutte le caratteristiche sono note a priori è possibile definire offline lo schedule usando algoritmi più o meno
complessi. Lo schedule verrà memorizzato in una tabella (tk, T(tk)). Alcuni intervalli potrebbero risultare inutilizzati dai
task periodici e possono essere usati per eseguire quelli aperiodici.
Frames
Per mantenere la tabella piccola dividiamo la linea del tempo in frame ed effettuiamo le decisioni di scheduling solo in
prossimità della fine di uno di quest’ultimi. Ciascuna schedule principale è suddivisa in una o più schedule secondarie (o
frames). Durante un frame viene eseguita una sequenza di job, se questa termina in anticipo il processore attende
inattivo o esegue job in background fino alla fine dell'intervallo dl tempo Impostato. Se non viene completata in tempo
si verifica un errore di frame overrun. Alla fine di ogni frame vengono prese decisioni riguardo i job da eseguire ed altre
operazioni di monitoring. Le funzioni di un frame sono:
Per quanto riguarda le dimensioni, un frame deve essere abbastanza lungo da contenere interamente ogni singolo job,
ln modo da non doverlo interrompere, ma anche abbastanza piccolo da essere contenuto tra il release time e la
deadline di ogni Job, Inoltre deve essere divisore intero lunghezza dell'iperperiodo. Tale scelta evita la preemption,
minimizza la lunghezza totale dello schedule, assicura che ogni iperperiodo ospiti un numero intero di frame e consente
verificare il rispetto delle deadline. Nel caso i parametri dei task non consentano di soddisfare tutti vincoli
simultaneamente si suddividono i task in sotto-task.
Slack stealing
Consiste nell’esecuzione dei job aperiodici prima di quelli periodici, quando possibile.
Chiamando slack time la differenza di tempo tra la dimensione del frame e il tempo in cui è utilizzato da job periodici,
quando sono presenti alcuni di questi nell'apposita coda possiamo attivarli immediatamente per una quantità di tempo
pari allo slack time del frame in cui si trova, nel caso in cui non terminino entro tale intervallo di tempo, l'ultimo job
aperiodico in esecuzione viene riposto in coda fino al prossimo slack time e si passa ad eseguire i consueti job periodici. l
Lo slack time di ciascun frame deve essere precalcolato e memorizzato, l'executive deve tener traccia del tempo
dedicato ai job aperiodici ed aggiornare lo slack time disponibile ed occorre un timer da settare allo slack time
disponibile all'inizio del frame.
Job sporadici
Non hanno né un’attivazione irregolare e né una regolare. Il tempo che intercorre tra uno e l’altro non è noto poiché
hanno istanti di rilascio e tempi di esecuzione non prevedibili, mentre lo è solo il tempo massimo di esecuzione.
Essi richiedono un test di accettazione: è accettato soltanto se non compromette la schedulabilità dei job periodici.
All’aumentare dei job sporadici il sistema diventa sempre più complesso e perde i vantaggi di semplicità caratteristici di
un algoritmo clock-driven.
I task aperiodici e sporadici hanno tempi tra uno e l’altro non noti a priori e possono risultare anche brevi. In
particolare i job sporadici hanno tempi di interarrivo modellati da variabili stocastiche.
Scheduling prioritario
Ogni processo ha una priorità compresa tra 0 e 255 (espresso con un numero naturale). Il processo che verrà
selezionato dalla coda è quello con priorità più alta. I processi a pari priorità sono serviti con politica FCFS (First Come
First Served). Lo scheduling può essere: preemptive, statico/dinamico, online
Approccio priority-driven
In uno schedule priority driven non preemptive le decisioni sono prese solamente quando il processore diventa libero o
un job diventa pronto e il processore è libero per eseguirlo
Problema: Utilizzando lo scheduling prioritario è facile trovarsi di fronte alla problematica di starvation (i task a bassa
priorità vengono sempre superati e non vengono messi in esecuzioni)
Soluzione: Si risolve usando la teoria di aging (la priorità sale col tempo di attesa)
Anomalie di scheduling
Teorema di Graham: si possono verificare situazioni per cui, aumentando una caratteristica che migliorerebbe lo
scheduling si ottiene l’effetto opposto. Ad esempio aumentando il numero di processori, diminuzione dei tempi di
esecuzione e le rotture dei vincoli di precedenza.
A differenza di quelli non RT gli algoritmi Real Time vanno a vedere i job più urgenti in base alla loro deadline.
I task possono essere schedulati in base alla deadline relativa e alla deadline assoluta.
Ricordiamo che se la lateness massima (ritardo massimo) è minore di zero allora tutte le deadline sono rispettate
Per vedere se un insieme di task è fattibile con EDD si fa il test
𝑖 𝑖
∀𝑖 ∑ 𝐶𝑘 ≤ 𝐷𝑖 𝑐𝑜𝑛 𝑓𝑖 = ∑ 𝐶𝑘
𝑘=1 𝑘=1
Earliest Deadline First (dinamico)
È un dynamic priority algorithms, la priorità di un job è in base alla deadline assoluta, in ciascun istante esegui il job con
la deadline più prossima.
Se due task hanno la stessa di allora si sceglie in maniera random
∀𝑖 ∑ 𝑐𝑘 (𝑡) ≤ 𝑑𝑖 − 𝑡
𝑘=1
Teorema di Ottimalità di EDF: in un sistema monoprocessore con preemption, EDF può genera uno schedule fattibile
per un insieme di Job J con istanti di rilascio e Deadline arbitrari se e solo se tale schedule esiste.
Dato un task set di tasks periodici o sporadici, con deadline relative uguali ai periodi, il task set è schedulabile con EDF se
e solo se il fattore di utilizzo complessivo è minore uguale a 1.
𝑁
𝐶𝑖
𝑈=∑ ≤1
𝑝𝑖
𝑖=1
EDF è un algoritmo ottimale nel senso che se un task set è schedulabile, allora è schedulabile da EDF. Infatti se U>1
nessun algoritmo può schedulare il task set, al contrario EDF può schedularlo e anche molti altri algoritmi.
Purtroppo presenta anch’esso degli svantaggi: ad esempio essendo dinamico non è prevedibile, ma conosciamo il suo
comportamento. Il progettista ha poco margine per gestire lo schedule. Questo algoritmo è oltretutto
computazionalmente costoso (per il context switch).
EDF è ancora ottimale quando le deadline relative sono diverse dal periodo, un primo test sufficiente è:
𝑁
𝐶𝑖
𝑈′ = ∑ ≤1
𝐷𝑖
𝑖=1
• Latest release tima (LRT): La priorità cresce all’aumentare dell’istante di rilascio e schedula i job a partire
dall’ultima deadline inserendo via via i job con istante di rilascio maggiore.
• Latest slack time first (LST): si calcola in ciascun istante t lo 𝑠𝑙𝑎𝑐𝑘𝑖 = 𝑑𝑖 − 𝑡𝑒𝑖 (𝑡)
Analogo l’algoritmo Minimum laxity first (MLF)
RIASSUNTO
Algoritmo Rate Monotonic (RM)
È un fixed-priority algorithm, assegna le priorità ai task in base ai loro periodi. Più è breve il periodo più alta è la
priorità. Queste priorità non cambieranno (statico). Si esegue un test di schedulabilità, sufficiente ma non necessario:
𝑚
1 𝑚 = 𝑛𝑢𝑚𝑒𝑟𝑜 𝑑𝑖 𝑡𝑎𝑠𝑘, 𝑚 → ∞
∑ 𝑐𝑖 ∗ 𝑓𝑖 ≤ 𝑚(2𝑚 − 1) 𝑐𝑜𝑛 { 𝑓 = 𝑓𝑟𝑒𝑞𝑢𝑒𝑛𝑧𝑎 = 1/𝑝
𝑖=1 𝑐 = 𝑒𝑥𝑒𝑐𝑢𝑡𝑖𝑜𝑛 𝑡𝑖𝑚𝑒
Fattore di utilizzo = ∑𝑚 𝑚
𝑖=1 𝑐𝑖 ∗ 𝑓𝑖 = ∑𝑖=1 𝑐𝑖 /𝑝𝑖
L’assegnamento delle priorità di DM è ottimale per set di eventi indipendenti con risposte eseguite con una costate
priorità e per deadline prima o uguali alla fine del periodo.
Confronto DM e RM:
• Quando la relative deadline di ogni task è proporzionale al suo periodo, gli algoritmi RM e DM sono identici
• Quando la relative deadline è arbitraria, l’algoritmo DM è migliore, nel senso che può (a volte) produrre uno
schedule feasible quando RM fallisce.
• Quando invece l’algoritmo DM fallisce, di sicuro RM fallisce.
• Vantaggi: Non c’è bisogno di definire le priorità. EDF ha minor numero di context switch e EDF è ottimale
• Svantaggi: nel caso di EDF il mancato rispetto di una deadline produce un effetto domino, ossia anche tutti gli
altri task non rispettano la deadline, invece con FP è più predicibile cioè solo i task a priorità più bassa non
rispettano la deadline.
15 – SCHEDULING SERVERS
Un insieme di task periodici (critici, importante rispettare la deadline) possono essere schedulati con EDF o RM. Ci sono
poi task periodici non critici per una deadline ma che vanno eseguiti velocemente. Si utilizzano alcuni metodi da usare
insieme a EDF e RM (Se non specificato, EDF tratta i job aperiodici come se fossero periodici):
Questi Bandwidth preserving Servers differiscono per i tempi di reintegro e per le modalità di preservare il budget.
Come il Simple Periodic Server, lo schedule sospende la sua attività quando il budget è esaurito o ha finito i job da
eseguire, lo scheduler reintegra il budget in certi periodi.
• Deferrable server
Regola di consumo: il budget è consumato per ogni unità di esecuzione
Regola di reintegro: è risettato al max ad ogni fine periodo, il rimanente non può essere utilizzato nei prossimi
periodi.
Esempio DS con RM
Problema: Un’attività periodica ammissibile potrebbe non essere eseguita a causa di un DS a priorità più alta.
Può succedere che il job aperiodico venga eseguito per un intervallo più lungo del budget. Nel caso peggiore
viene eseguito una volta al fine del suo periodo e una volta all’inizio del successivo, cioè eseguito
ininterrottamente per due budget. Esistono altre versioni in cui ci sono regole aggiuntive per cui se un job
aperiodico si presenta alla fine del periodo viene eseguito ma poi sospeso e non può continuare nel periodo
successivo.
• Server sporadici
• TBS
• CUS
Non interessano i dettagli degli altri ma solo che esistano vari algoritmi che vanno per bene per job periodici, aperiodici
e sporadici.
• Overload transitorio dovuto alle eccessive attivazioni: è tipico dei sistemi event-driven a causa dell’arrivo
eccessivo e contemporaneo di più job aperiodici
• Overload transitorio dovuto alle eccessive esecuzioni: tipico sia dei event-driven che dei clock-driven, dovuto a
processi periodici e aperiodici che vengono eseguiti più volte delle aspettative
• Overload permanente in sistemi con task periodici: i ha quando il fattore di utilizzo dei task è >1
Definizioni
Carico istantaneo
Massima richiesta del processore dal tempo attuale a tutte le deadline dei task attivi. In un certo istante si guarda se c’è
una richiesta di esecuzione maggiore della disponibilità del processo.
Le assunzioni pessimiste portano ad avere un’alta predicibilità ma una bassa efficienza. Ciò comporta un grosso spreco
di risorse dunque un alto costo. È possibile trovare un compromesso con correttezza e costo del sistema sfruttando
tecniche che gestiscono le situazioni di sovraccarico per ridurre gli effetti negativi.
• Schedulazione value-based: i task con minore importanza vengono respinti e quelli più importanti serviti
completamente. Esempio automobile: sacrifico il livello del carburante, per tenere il controllo della frenata.
• Calo della performance: tutti i task vengono eseguiti ma con requisiti ridotti, risultato di qualità inferiore.
Esempio: un’immagine meno nitida dopo aver filtrato il rumore.
Value-based scheduling
Se ρ>1 non tutti gli schedule possono finire prima della deadline. Per evitarlo i task meno importanti vengono rigettati.
Per fare questo il sistema deve gestire i task considerando sia i limiti di tempo che i valori di importanza.
Usando gli algoritmi RM e EDF, il valore del task è determinato dal periodo e dalla deadline.
Maggiore ritardo,
minore valore
• Robust scheduling
Lo scheduling e il rigetto dei task sono controllati da due politiche
diverse: schedulati in base alla deadline e rigettati in base al valore.
In caso di completamento anticipato i task rigettati possono essere
recuperati tramite un apposito meccanismo.
Robust EDF
Performance degradation
Il carico può essere ridotto non solo rigettando i task, ma dividendo i requisiti di performance
Adattamento al carico
è possibile modificare i periodi per procedere con uno schedule con U<1, passando lo schedule come se fosse flessibile.
Ci sono infiniti modi per modificare il periodo:
• Algoritmo di compressione
Durante l’overload il carico deve essere compresso fino ad arrivare ad 1.
L’idea è quella di comprimere i periodi di tutti i task. Ogni task modifica il proprio periodo in funzione della
costante elastica che indica in qualche modo l’importanza del task.
Da notare che i task dovranno comunque rispettare gli ordini di priorità, ma se un processo è entrato nella sua sezione
critica non può abbandonare l’uso della risorsa finchè non ha finito, anche se ciò implica il blocco di un job a priorità
maggiore che vuole usare la stessa risorsa. Ciò può portare a problemi anche molto seri come quello dell’inversione di
priorità: task eseguiti con priorità opposte.
Soluzione: disabilitare la preemption durante l’esecuzione delle sezioni critiche (il task che ha la risorsa non viene
interrotto finchè non finisce tutta l’esecuzione), rilascia il lock appena possibile ma blocca completamente gli altri.
Un’alternativa sarebbe quella di introdurre Protocolli di Accesso (ulteriori regole) che modificano l’assegnamento delle
priorità dei processi che causano il blocco.
Algoritmo: i job sono schedulati in base alle loro priorità nominali, quelli con le stesse priorità seguono FCFS (First Come
First Served). Quando un job 𝐽𝑖 prova ad entrare nella sezione critica e la risorsa è bloccata da un job 𝐽𝑘 a priorità
minore, il job 𝐽𝑖 è bloccato. Quando 𝐽𝑖 è bloccato trasmette la sua priorità attiva al job 𝐽𝑘 (𝑝𝑘 = 𝑝𝑖 ). Quando finisce la
sezione critica rilascia la risorsa che viene presa dal processo con priorità più alta.
Se c’è un task che blocca un altro a priorità maggiore, il task bloccante acquisisce la priorità del task bloccato. Chi ha il
lock ha la priorità più alta in quel momento.
Blocco diretto: un job a priorità più alta è bloccato da uno a priorità più bassa
Blocco push-throught: un job a priorità media è bloccato da un job a priorità più bassa che ha ereditato la priorità da un
job che blocca direttamente
Teorema: 𝜏1 può essere bloccato al massimo una volta da ognuno dei processi a priorità più bassa. Tempi di blocco
virtuali
• P1 ha la priorità più alta, può essere bloccato direttamente dalle risorse con priorità inferiori. Da P2 sulla risorsa
A per 2 unità, da P3 su A per 3, da P3 su C per 5. Può essere bloccato su
una sola risorsa a processo, scegliendo i due casi peggiori saranno A2 e C5.
B=d(A2) + d(C3)=7
• P2 è bloccato direttamente da P3 su A per 3 o da P3 su B per 2 ma è anche
bloccato con push-throught da P3 su C per 5, perché se ipotizziamo che P3
inizi per primo e acquisisca il lock e poi P1 richiede la risorsa C, non può e
con il protocollo PIP P3 prende la priorità di P1, bloccando anche
l’esecuzione di P2. B=d(C3)=5
• P3 non può essere bloccato poiché è quello con priorità minore, dunque B3=0
Vantaggi: trasparente al programmatore e impedisce l’inversione di priorità. Svantaggi: non blocca il deadlock e il blocco
a catena.
Ad ogni semaforo è assegnata una priorità di ceiling uguale alla priorità del job a priorità più alta che può bloccarlo. A
un solo job è concesso entrare in una sezione critica solo se la sua priorità è più alta di tutte le priorità di ceiling dei
semafori lockati da altri Job. Questa regola non permette a un job di entrare nella sua sezione critica se ci sono semafori
lockati che potrebbero bloccarlo.
Ceiling di risorse
Un processo può entrare nella sezione critica solo se 𝑃𝑖 > max {𝐶(𝑆𝑘 ): 𝑆𝑘 𝑙𝑜𝑐𝑘𝑒𝑑 𝑏𝑦 𝑡𝑎𝑠𝑘𝑠 ≠ 𝐽𝑖 }
Svantaggi PCP: non è trasparente al programmatore e i semafori hanno bidogno di una ceiling (nome della loro priorità).
Altro esempio su PCP:
Consideriamo tre task periodici τ1, τ2, τ3 (con priorità decrescente), i quali condividono le risorse A, B e C, con il
protocollo PCP. Cerchiamo di calcolare il tempo massimo di blocco per ogni
task, grazie alle informazioni nella tabella.
Con il protocollo PCP un task può essere bloccato al massimo per una sezione
critica durante la sua esecuzione.
• L’insieme delle sezioni critiche che può potenzialmente bloccare τ2 è {A3, B3, C3}, il caso peggiore (tempo più
lungo) è dato da B2=d(C3)=5
• Il task τ3 non può essere bloccato perché è il task con la priorità più bassa (può essere sono preempted per task
a priorità maggiore) B3=0
18 – ANALISI DI SCHEDULABILITA
Analisi di utilizzo RM
Per D = T c’è un test con condizione sufficiente ma non necessaria (test Liu and Laylan)
𝑁
𝐶𝑖 1 1
∑ ≤ 𝑁(2𝑁 − 1) 𝑟𝑖𝑐𝑜𝑟𝑑𝑎𝑛𝑑𝑜 𝑐ℎ𝑒 lim 𝑁(2𝑁 − 1) = 0,69
𝑇𝑖 𝑛→∞
𝑖=1
Invece di minimizzare l’utilizzo del processore nel rispetto del periodo dei
task, la condizione di fattibilità può essere manipolata in modo di trovare un
test di schedulabilità sufficientemente stretto in funzione dell’utilizzo relativo
di ogni task.
Teorema: Dato un insieme di n task, dove ogni task 𝜏𝑖 è caratterizzato da un utilizzo del processore (fattore di Utilizzo)
𝑈𝑖 . Allora, tale insieme è schedulabile da un algoritmo RM se
𝑛
∏(𝑈𝑖 + 1) ≤ 2
𝑖=1
Quante volte verrà interrotto un task? Dipende dal periodo dei task a priorità più alta del task trattato
𝑅𝑖
𝑁𝑢𝑚𝑒𝑟𝑜 𝑑𝑖 𝑖𝑛𝑡𝑒𝑟𝑟𝑢𝑧𝑖𝑜𝑛𝑖 𝑑𝑖 𝑖 = [ ]
𝑇𝑗
𝑅𝑖
𝑤𝑖𝑛+1 = 𝐶𝑖 + ∑ [ ] 𝐶𝑗
𝑇𝑗
𝑗∈ℎ𝑝(𝑖)
L’analisi del tempo di Risposta da un risultato necessario e sufficiente per garantire la schedulabilità con RM.
Se D < T allora si utilizza l’algoritmo di scheduling Deadline Monotonic e la formula rimane la stessa, si confronta Ri con
Di, invece che con il periodo come prima.
Se i task condividono risorse bisogna considerare anche il tempo di blocco di ogni task, quindi la formula dell’analisi del
tempo di risposta diventa:
𝑅𝑖
𝑤𝑖𝑛+1 = 𝐶𝑖 + 𝐵𝑖 + ∑ [ ] 𝐶𝑗
𝑇𝑗
𝑗∈ℎ𝑝(𝑖)