Introduzione ai Sistemi Real-Time

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

  • con prelazione: possono interrompere l’esecuzione di un task quando un nuovo task con priorità più alta arriva
  • senza prelazione: non possono interrompere l’esecuzione di task quando un nuovo task con priorità più alta arriva
  • offline: lo scheduling viene fatto prima dell’attivazione del primo task
  • online: lo scheduling viene fatto ogni volta che task termina e occore sceglierne uno nuovo da mandare in esecuzione
  • ottimale: minimizza una funzione di costo
  • euristico: non garantisce il miglior scheduling, ma cerca di ottimizzare

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:

  • EDF (Earliest Deadline First): il task con la deadline più vicina viene eseguito per primo; potrebbe essere con prelazione o senza prelazione, ma in questo caso non è ottimale
  • EDF*: EDF con vincoli di precedenza
  • Rate Monotonic: scheduling per task periodici, con priorità fissa proprozionale al periodo dei task

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:

  • NPP (non preemptive): un task all’interno della sua sezione critica non può essere prelazionato, guadagnando di fatto la priorità massima
  • HLP (highest locker priority): un task non guadagna la priorità massima assoluta, ma solo la priorità massima tra tutti quei task che condividono la risorsa
  • PIP (priority inheritance protocol): il task attualmente in esecuzione eredità la più alta delle priorità tra tutti i task che richiedono la risorsa condivisa
  • PCP (priority ceiling protocol): estensione del PIP, con una regola che vieta ad un task di entrare nella sua sezione critica se non ha una priorità sufficientemente alta
  • SRP (stack resource policy): un task viene fermato non quando tenta di entrare nella sezione critica, ma prima, quando tenta di ottenere la prelazione sul task attualmente in esecuzione

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *