Il vruntime è il runtime virtuale di un processo che aiuta a tenere traccia del tempo di esecuzione di un processo. vruntime è un membro della struttura sched_entity definita in include/linux/sched.h
Il min_vruntime rappresenta il vruntime minimo di una coda di esecuzione cfs. Rappresenta il minimo di tutti i vruntime dei processi pianificati su quella runqueue cfs. min_vruntime è un membro della struttura cfs_rq definita in include/linux/sched.h
Lo scopo di min_vruntime è selezionare il processo successivo nella coda di esecuzione di cfs da eseguire. Per essere equo con tutti i processi, lo scheduler CFS seleziona il processo con il vruntime minimo da eseguire per primo.
Il link per includere/linux/sched.h è:https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h
vruntime è per thread; è un membro nidificato all'interno di task_struct.
In sostanza, vruntime è una misura del "runtime" del thread, ovvero la quantità di tempo che ha trascorso sul processore. Il punto centrale della CFS è essere giusti con tutti; quindi, il tipo di algoritmo si riduce a una cosa semplice:(tra le attività su una determinata coda di esecuzione) l'attività con il vruntime più basso è l'attività che merita maggiormente di essere eseguita, quindi selezionala come "successiva". (L'effettiva implementazione viene eseguita utilizzando un rbtree per efficienza).
Tenendo conto di vari fattori, come priorità, buon valore, cgroups, ecc., il calcolo di vruntime non è così semplice come un semplice incremento. Suggerirei di leggere la sezione pertinente in "Professional Linux Kernel Architecture", Mauerer, Wrox Press - è spiegata in dettaglio.
Vedi sotto un rapido tentativo di riassumere alcuni di questi.
Altra risorsa:Documentation/scheduler/sched-design-CFS.txt
Riepilogo rapido - calcolo vruntime: (basato sul libro)
-
La maggior parte del lavoro viene svolto in kernel/sched_fair.c:__update_curr()
-
Chiamato al tick del timer
-
Aggiorna il tempo fisico e virtuale che 'corrente' ha appena trascorso sul processore
-
Per le attività che vengono eseguite con priorità predefinita, vale a dire, nice value 0, il tempo fisico e virtuale trascorso è identico
-
Non così per compiti ad altri livelli di priorità (buoni); quindi il calcolo di vruntime è influenzato dalla priorità della corrente utilizzando un fattore di peso del carico
delta_exec =(unsigned long)(ora – curr->exec_start);// ...delta_exec_weighted =calc_delta_fair(delta_exec, curr);curr->vruntime +=delta_exec_weighted;
Trascurando alcuni controlli di arrotondamento e overflow, ciò che fa calc_delta_fair è calcolare il valore dato dalla seguente formula:
delta_exec_weighed = delta_exec * (NICE_0_LOAD / curr->load.weight)
Il fatto è che le attività più importanti (quelle con un buon valore inferiore) avranno pesi maggiori; quindi, in base alle equazioni di cui sopra, il vruntime loro attribuito sarà minore (avendoli quindi accodati più a sinistra sull'albero rb!).