Le vruntime est le runtime virtuel d'un processus qui aide à suivre la durée d'exécution d'un processus. Le vruntime est membre de la structure sched_entity définie dans include/linux/sched.h
Le min_vruntime représente le vruntime minimum d'une file d'attente cfs. Il représente le minimum de tous les vruntime des processus planifiés sur cette file d'attente cfs. Le min_vruntime est un membre de la structure cfs_rq définie dans include/linux/sched.h
Le but de min_vruntime est de sélectionner le processus suivant dans la file d'attente cfs à exécuter. Afin d'être équitable pour tous les processus, le planificateur CFS sélectionne le processus avec le minimum de vruntime à exécuter en premier.
Le lien vers include/linux/sched.h est :https://elixir.bootlin.com/linux/latest/source/include/linux/sched.h
vruntime est par thread ; c'est un membre imbriqué dans task_struct.
Essentiellement, vruntime est une mesure de la "durée d'exécution" du thread - le temps qu'il a passé sur le processeur. L'intérêt du CSA est d'être juste envers tous; par conséquent, le type d'algo se résume à une chose simple :(parmi les tâches d'une file d'attente donnée), la tâche avec le temps de vrun le plus bas est la tâche qui mérite le plus d'être exécutée, donc sélectionnez-la comme "suivante". (La mise en œuvre réelle est effectuée à l'aide d'un rbtree pour plus d'efficacité).
En tenant compte de divers facteurs - comme la priorité, la valeur agréable, les groupes de contrôle, etc. - le calcul de vruntime n'est pas aussi simple qu'un simple incrément. Je suggérerais de lire la section correspondante dans "Professional Linux Kernel Architecture", Mauerer, Wrox Press - elle est expliquée en détail.
Veuillez voir ci-dessous une tentative rapide de résumer une partie de cela.
Autre ressource :Documentation/scheduler/sched-design-CFS.txt
Résumé rapide – Calcul du vruntime : (basé sur le livre)
-
La plupart du travail est effectué dans kernel/sched_fair.c:__update_curr()
-
Appelé sur timer tick
-
Met à jour le temps physique et virtuel que 'current' vient de passer sur le processeur
-
Pour les tâches qui s'exécutent avec la priorité par défaut, c'est-à-dire la valeur nice 0, les temps physiques et virtuels passés sont identiques
-
Ce n'est pas le cas pour les tâches à d'autres niveaux de priorité (nice); ainsi, le calcul de vruntime est affecté par la priorité du courant à l'aide d'un facteur de poids de charge
delta_exec =(unsigned long)(now – curr->exec_start);// ...delta_exec_weighted =calc_delta_fair(delta_exec, curr);curr->vruntime +=delta_exec_weighted;
En négligeant certains arrondis et contrôles de débordement, ce que fait calc_delta_fair est de calculer la valeur donnée par la formule suivante :
delta_exec_weighed = delta_exec * (NICE_0_LOAD / curr->load.weight)
Le fait est que les tâches plus importantes (celles avec une valeur de nice inférieure) auront des poids plus importants ; ainsi, par les équations ci-dessus, le vruntime qui leur est attribué sera plus petit (les mettant ainsi en file d'attente plus à gauche sur le rbtree !).