4.2. Programmazione della CPU
Lo scheduler è responsabile per mantenere occupate le CPU del sistema. Lo scheduler di Linux implementa un numero di politiche di programmazione per mezzo delle quali è possibile determinare quando e per quanto tempo il thread viene eseguito su una CPU core particolare.
Le politiche di programmazione sono suddivise in due categorie principali:
- Politiche realtime
- SCHED_FIFO
- SCHED_RR
- Politiche normali
- SCHED_OTHER
- SCHED_BATCH
- SCHED_IDLE
4.2.1. Politiche per una programmazione di tipo realtime
I thread realtime vengono programmati prima, mentre i thread normali sono programmati dopo la programmazione di tutti i thread realtime.
Le politiche realtime vengono implementate per compiti "time-critical" da completarsi senza alcuna interruzione.
SCHED_FIFO
- Questa politica viene anche chiamata static priority scheduling poichè essa definisce una priorità fissa (tra 1 e 99) per ogni thread. Lo scheduler esegue la scansione di un elenco di thread SCHED_FIFO seguendo un ordine di priorità, e programma il thread con la priorità più alta pronto ad essere eseguito. Il thread verrà eseguito, arrestato, abbandonato o preceduto da un altro thread con priorità più alta.Anche un thread realtime con priorità più bassa verrà programmato prima di qualsiasi altro thread con una politica diversa da realtime; se esiste solo un thread realtime, il valore della priorità
SCHED_FIFO
non avrà alcuna importanza. SCHED_RR
- Variante round-robin della politica
SCHED_FIFO
. I thread diSCHED_FIFO
avranno una priorità fissa tra 1 e 99. Tuttavia i thread con la stessa priorità verranno programmati usando un criterio round-robin all'interno di un determinato quantum o periodo di tempo. La chiamata del sistemasched_rr_get_interval(2)
ritorna un valore relativo al periodo di tempo, ma la durata di questo periodo non potrà essere impostata dall'utente. Questa politica è utile se desiderate eseguire thread multipli con la stessa priorità.
Per maggiori informazioni sulle semantiche definite delle politiche di programmazione relatime consultate lo IEEE 1003.1 POSIX standard delle interfacce del sistema — Realtime, disponibile su http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html.
Per definire una priorità dei thread è consigliato usare una priorità bassa e successivamente aumentarla in presenza di una latenza. I thread relatime non hanno alcun limite di tempo come quelli normali; Thread
SCHED_FIFO
possono essere eseguiti fino a quando gli stessi non verranno bloccati, abbandonati o preceduti da altri thread con priorità più alte. Per questo motivo non è consigliato impostare la priorità su 99, poichè tale priorità posizionerà il processo allo stesso livello dei thread di migrazione e watchdog. Se i thread vengono bloccati poichè essi entrano in un loop, gli stessi non potranno essere eseguiti. Sistemi con un solo processore avranno una elevata possibilità di incontrare questo scenario.
Nel kernel di Linux la politica
SCHED_FIFO
include un meccanismo di limitazione della larghezza di banda. Tale meccanismo protegge i programmatori in modo da evitare un monopolio della CPU da parte di eventi realtime. Questo meccanismo può essere modificato attraverso i seguenti parametri del file system /proc
:
/proc/sys/kernel/sched_rt_period_us
- Definisce il periodo di tempo da considerare cento per cento larghezza di banda della CPU, in millisecondi ('us' l'equivalente più vicino a 'µs' in testo semplice). Il valore predefinito è 1000000µs, o 1 secondo.
/proc/sys/kernel/sched_rt_runtime_us
- Definisce il periodo di tempo da conferire per l'esecuzione dei thread realtime in millisecondi ('us' l'equivalente più vicino a 'µs' in testo semplice). Il valore predefinito è 950000µs, o 0,95 secondi.