CFS (que es el programador predeterminado para procesos) no tiene un intervalo de tiempo fijo, se calcula en tiempo de ejecución según la latencia objetivo (sysctl_sched_latency
) y el número de procesos en ejecución. El intervalo de tiempo nunca podría ser inferior a la granularidad mínima (sysctl_sched_min_granularity
).
El intervalo de tiempo estará siempre entre sysctl_sched_min_granularity
y sysctl_sched_latency
, que tienen un valor predeterminado de 0,75 ms y 6 ms respectivamente y están definidos en kernel/sched/fair.c.
Pero el intervalo de tiempo real no se exporta al espacio del usuario.
La cantidad asignada para un proceso en particular puede variar:
Puede ajustar "segmento" ajustando sched_latency_ns y sched_min_granularity_ns , pero tenga en cuenta que "rebanada" no es un cuanto fijo. También tenga en cuenta que las decisiones de preferencia de CFS se basan en un estado instantáneo. Es posible que una tarea haya recibido una "porción" completa (variable) de tiempo de CPU, pero la prioridad se activará solo si hay disponible una tarea más merecedora, por lo que una "porción" no es el "tiempo de CPU máximo ininterrumpido" que puede esperar que sea .. pero es algo similar.
Esto se debe a que Completely Fair Scheduler, el programador predeterminado de Linux, asigna una proporción del procesador a un proceso en lugar de un intervalo de tiempo fijo. Eso significa que el intervalo de tiempo de cada proceso es proporcional a la carga actual y ponderado por el valor de prioridad del proceso.
Para procesos en tiempo real de propósito especial que usan SCHED_RR, el intervalo de tiempo predeterminado se define en el kernel de Linux como RR_TIMESLICE
en 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)
Puedes usar sched_rr_get_interval()
para obtener el intervalo SCHED_RR para un proceso SCHED_RR específico.