Vai al contenuto
Sistemi Operativi

Sistemi in tempo reale: EDF, priorità monotona e tempo di risposta

Compiti periodici, condizione di utilizzo dimostrata, EDF ottimo, limite di Liu e Layland, analisi del tempo di risposta con esempio, inversione ed ereditarietà della priorità, RTOS.

In un sistema in tempo reale un risultato giusto ma in ritardo è sbagliato: il comando dei freni di un’auto, il controllo di un motore, un pacemaker devono rispondere entro una scadenza. Non conta la velocità media, ma la garanzia nel caso peggiore. In questa lezione vediamo il modello dei compiti periodici, la pianificazione EDF con la dimostrazione della condizione necessaria, la priorità monotona con il suo limite e l’analisi esatta del tempo di risposta svolta su un esempio, l’inversione di priorità e i sistemi operativi per il tempo reale.

Il modello dei compiti periodici

Si distinguono sistemi hard, dove mancare una scadenza è un guasto (controllo di volo, airbag), e soft, dove degrada solo la qualità (riproduzione video). Molti compiti di controllo sono periodici (lezione sull’implementazione di Controlli digitali): il compito \tau_i si attiva ogni T_i, richiede al più C_i di calcolo (il tempo di esecuzione nel caso peggiore) e deve finire prima dell’attivazione successiva. Il suo fattore di utilizzo è U_i = C_i/T_i, e l’utilizzo totale U = \sum_iU_i.

Prima la scadenza più vicina

L’algoritmo EDF (earliest deadline first) esegue in ogni istante il compito pronto con la scadenza più vicina, con prelazione.

Teorema. Su un processore, un insieme di compiti periodici con scadenza uguale al periodo è pianificabile con un qualunque algoritmo solo se U \le 1; con EDF la condizione è anche sufficiente.

Dimostrazione della necessità. Si consideri l’intervallo [0, H), dove H è il minimo comune multiplo dei periodi. Il compito \tau_i si attiva H/T_i volte e richiede in tutto (H/T_i)C_i di calcolo, che deve essere svolto entro H. La richiesta totale è \sum_i(H/T_i)C_i = UH, e il processore ne offre al più H: serve UH \le H, cioè U \le 1. ∎

La sufficienza per EDF (Liu e Layland, 1973) si dimostra mostrando che, se una scadenza fosse mancata, nell’intervallo precedente il processore sarebbe stato sempre occupato da compiti con scadenze non successive, e la loro richiesta supererebbe la lunghezza dell’intervallo, cioè U \gt  1. EDF è quindi ottimo: usa il processore fino al 100 %.

Priorità monotona e tempo di risposta

Molti sistemi usano invece priorità fisse, più semplici e prevedibili in caso di sovraccarico: con la regola monotona sul periodo (RMS, rate monotonic) il compito con periodo più breve ha priorità più alta. Liu e Layland hanno dimostrato che RMS garantisce le scadenze se

    \[ U \le n\left(2^{1/n} - 1\right) \]

dove n è il numero di compiti: 0,83 per due, 0,78 per tre, e tende a \ln 2 \approx 0{,}69. La condizione è solo sufficiente; per una risposta esatta si calcola il tempo di risposta nel caso peggiore, che si ha quando tutti i compiti si attivano insieme. Per il compito i, con i compiti più prioritari j:

    \[ R_i = C_i + \sum_{j}\left\lceil\frac{R_i}{T_j}\right\rceil C_j \]

perché durante R_i ogni compito più prioritario si attiva \lceil R_i/T_j\rceil volte e ogni volta lo interrompe per C_j. L’equazione si risolve per iterazione partendo da R_i = C_i, finché il valore non si ferma; il compito rispetta la scadenza se R_i \le T_i.

Pianificazione a priorità monotona di tre compiti
Il compito tau 1 (periodo 4, calcolo 1) ha la priorità più alta, tau 2 (periodo 6, calcolo 2) media, tau 3 (periodo 12, calcolo 3) la più bassa. Le frecce indicano le attivazioni; i rettangoli le esecuzioni. Tau 3 viene interrotto due volte e finisce all’istante 10, prima della scadenza 12.

Esempio. Tre compiti (C, T): (1, 4), (2, 6), (3, 12), con U = 0{,}25 + 0{,}33 + 0{,}25 = 0{,}83, sopra il limite di 0,78: il test sufficiente non conclude. Tempo di risposta di \tau_3: si parte da R = 3; poi 3 + \lceil 3/4\rceil + 2\lceil 3/6\rceil = 6; poi 3 + 2 + 2 = 7; poi 3 + \lceil 7/4\rceil + 2\lceil 7/6\rceil = 3 + 2 + 4 = 9; poi 3 + 3 + 4 = 10; poi 3 + \lceil 10/4\rceil + 2\lceil 10/6\rceil = 3 + 3 + 4 = 10, fermo. R_3 = 10 \le 12: l’insieme è pianificabile, come mostra la figura.

L’inversione di priorità

Un compito ad alta priorità H aspetta un lock tenuto da un compito a bassa priorità L. Se nel frattempo si attiva un compito a priorità media M, che non usa il lock, M interrompe L, e H resta bloccato per tutto il tempo di M: un compito meno importante ritarda indirettamente il più importante, per un tempo senza limite se i compiti medi sono tanti. È l’inversione di priorità. Nel 1997 la sonda Mars Pathfinder si riavviava di continuo per questo motivo, finché da Terra non fu attivata l’opzione di ereditarietà della priorità: mentre L tiene un lock richiesto da H, L eredita temporaneamente la priorità di H, M non può interromperlo, e il blocco di H dura al più quanto la sezione critica di L. Il protocollo del tetto di priorità fa di più, e impedisce anche gli stalli tra lock.

I sistemi operativi per il tempo reale

Un sistema operativo in tempo reale (RTOS) offre scheduler a priorità con prelazione, latenze di interruzione piccole e soprattutto limitate, strumenti di sincronizzazione con ereditarietà della priorità e allocazione di memoria prevedibile. Sui microcontrollori si usano kernel piccolissimi come FreeRTOS o Zephyr, di pochi kilobyte; nei sistemi più grandi Linux con le estensioni PREEMPT_RT, che rendono interrompibile quasi tutto il kernel e portano le latenze nel caso peggiore a decine di microsecondi. Il tempo di esecuzione nel caso peggiore C_i va misurato o calcolato con strumenti di analisi, tenendo conto delle cache e delle interruzioni: è spesso la parte più difficile del progetto.

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
0
Would love your thoughts, please comment.x
()
x