CFS (che è lo scheduler predefinito per i processi) non ha intervalli di tempo fissi, viene calcolato in fase di esecuzione in base alla latenza target (sysctl_sched_latency
) e il numero di processi in esecuzione. La porzione di tempo non può mai essere inferiore alla granularità minima (sysctl_sched_min_granularity
).
L'intervallo di tempo sarà sempre compreso tra sysctl_sched_min_granularity
e sysctl_sched_latency
, i cui valori predefiniti sono rispettivamente 0,75 ms e 6 ms e definiti in kernel/sched/fair.c.
Ma l'intervallo di tempo effettivo non viene esportato nello spazio utente.
Il quantum assegnato per un particolare processo può variare:
Puoi ottimizzare "slice" regolando sched_latency_ns esched_min_granularity_ns , ma si noti che "fetta" non è un quantico fisso. Si noti inoltre che le decisioni di prelazione CFS si basano sullo stato istantaneo. Un'attività può aver ricevuto una "fetta" completa (variabile) di tempo CPU, ma la prelazione verrà attivata solo se è disponibile un'attività più meritevole, quindi una "fetta" non è il "tempo CPU massimo ininterrotto" che ci si potrebbe aspettare che sia .. ma è in qualche modo simile.
Questo perché Completely Fair Scheduler, lo scheduler predefinito di Linux, assegna una parte del processore a un processo piuttosto che un intervallo di tempo fisso. Ciò significa che l'intervallo di tempo per ogni processo è proporzionale al carico corrente e pesato dal valore di priorità del processo.
Per i processi in tempo reale speciali che utilizzano SCHED_RR, il timeslice predefinito è definito nel kernel di Linux come RR_TIMESLICE
in include/linux/sched/rt.h.
/*
* default timeslice is 100 msecs (used only for SCHED_RR tasks).
* Timeslices get refilled after they expire.
*/
#define RR_TIMESLICE (100 * HZ / 1000)
Puoi usare sched_rr_get_interval()
per ottenere l'intervallo SCHED_RR per uno specifico processo SCHED_RR.