Introduzione ai sistemi Real Time

(Article copied from my old blog)

L’articolo di quest’oggi non pubblicizza nessun libro, a differenza del solito dove l’articolo consiste in un riassunto di un libro con tanto di link per acquistare il libro su Amazon.

Il riassunto di oggi riguarda gli appunti del mio corso di Sistemi Operativi Real-Time dell’università: come detto solitamente i riassunti sono allo scopo di pubblicizzare la vendita di libri su Amazon, questa volta ho scritto l’articolo per ripassare e ricordare meglio l’argomento.

Si parla del real-time o tempo reale nei sistemi informatici. Chiedo scusa in anticipo per il livello molto poco approfondito con il quale l’argomento sarà trattato, questa è solo una introduzione di livello molto generale sull’argomento, tanto per avere un’idea generale sulla cosa.

Real time

Nei sistemi real-time si introduce la variabile temporale nel sistema: se si parla di hard real-time si hanno dei job critici che devono essere eseguiti entro un certo istante, oppure sarà da considerarsi fallito. Al contrario nel soft real-time non c’è garanzia che un job sarà eseguito entro un certo istante, ma solo che esso sarà eseguito il prima possibile.

E’ importantissimo sottolineare che nei sistemi real-time non c’è una maggior velocità di esecuzione dei task, c’è solo una maggior predicibilità (sappiamo come si comporterà il sistema in futuro, entro quando eseguirà un certo task).

Inoltre il tempo non è l’unico vincolo che è possibile aggiungere allo scheduling dei task, altri vincoli possono essere precedenze o risorse condivise. Sulle risorse condivise è presente un paragrafo in seguito.

Metriche real-time

metrics_rt

Scheduler

E’ un software che si occupa di programmare l’ordine di esecuzione dei vari task di un sistema secondo un determinato algoritmo di scheduling. Gli algoritmi di scheduling possono essere

Algoritmi di scheduling

Esistono sia algoritmi non real-time quali ad esempio, FCFS (First Come First Served), SJF (Short Job First), Round Robin (FCFS dove ogni task non viene eseguito fino al suo termine, ma fino al termine del quanto di tempo dedicato).

Inoltre ci sono alcuni algoritmi di scheduling dedicati per il real-time, quali:

In caso di un insieme misto di task periodici o aperiodici, esistono alcuni artifici: il più semplice prevede che vengano schedulati i task periodici con un algoritmo di scheduling per task periodici, e ogni volta che non ci sono task periodici da essere eseguiti, viene eseguito un task aperiodico (in questo modo questi ultimi possono essere penalizzati e venir serviti in grande ritardo (o mai). Una variante più complessa prevede invece che venga introdotto un task periodico server nel quale vengano inseriti i task aperiodici.

Risorse condivise

Quando una risorsa è mutualmente esclusiva (può accedervi un solo task per volta), è importante avere un meccanismo per evitare l’inversione di priorità (un task a bassa priorità prende controllo di una risorsa all’interno della sua Sezione critica e non lo rilascia anche quando un task a più alta priorità, che arriva dopo, ne fa richiesta, scavalcando di fatto il task a priorità più alta.

Le soluzione per il problema dell’inversione di priorità sono molteplici:

Real time Linux

Linux è un sistema con delle qualità che lo rendono appettibile per la gestione di task real-time, nonostante nella mainline del kernel sono state introdotte solo alcune funzionalità RT: principalmente è appetibile a causa della sua natura open-source e al suo kernel monolitico, adatto a embedded systems che spesso e volentieri si utilizzano in ambiti dove il tempo è importante.

Esistono difatti diverse soluzioni per il rea-time sotto Linux, alcune open-source ed altre commerciali per citarne un paio RTLinux e Xenomai.

Il funzionamento è complesso, ma in linea di massima si trattano di patch che gestiscono gli interrupt in modo particolare, permettendo al SO di gestire in modo diverso i task standard e quelli che necessitano del real-time scheduler.