Comment fonctionne bien?

20

sched_setscheduler dit:

Toute planification est préemptive: si un processus avec une priorité statique plus élevée devient prêt à être exécuté, le processus en cours d'exécution sera préempté et renvoyé à la liste d'attente pour son niveau de priorité statique.

tandis que setpriority dit

Cela entraîne de très faibles valeurs de Nice (+19) pour vraiment fournir peu de CPU à un processus chaque fois qu'il y a une autre charge de priorité plus élevée sur le système, et rend les valeurs de Nice élevées (-20) fournissent la plupart du CPU aux applications qui en ont besoin.

Alors, comment la modification de la valeur de Nice va-t-elle influencer l'exécution des programmes? Est-ce similaire à la programmation RT (où un programme avec une valeur de Nice plus élevée va interrompre un programme avec une valeur de Nice plus faible)?


Toutes les informations sur Internet sont comment utiliser niceet comment changer la priorité d'un processus. Aucun lien n'explique comment fonctionne exactement le processus avec différentes priorités. Je n'ai même pas pu trouver le code source.

BЈовић
la source

Réponses:

24

La proportion du temps processeur qu'un processus particulier reçoit est déterminée par la différence relative de gentillesse entre celui-ci et les autres processus exécutables.

Le Linux Completely Fair Scheduler (CFS) calcule un poids basé sur la gentillesse. Le poids est à peu près équivalent à 1024 / (1.25 ^ nice_value). Lorsque la valeur agréable diminue, le poids augmente de façon exponentielle. La tranche de temps allouée au processus est proportionnelle au poids du processus divisé par le poids total de tous les processus exécutables. La mise en œuvre du CSA est en cours kernel/sched/fair.c.

Le CFS a une latence cible pour la durée de planification. Des latences cibles plus petites offrent une meilleure interactivité, mais à mesure que la latence cible diminue, la surcharge de commutation augmente, diminuant ainsi le débit global.

Étant donné, par exemple, une latence cible de 20 millisecondes et deux processus exécutables d'égale gentillesse, les deux processus s'exécuteront pendant 10 millisecondes chacun avant d'être anticipés en faveur de l'autre processus. S'il y a 10 processus d'égalité, chacun s'exécute pendant 2 millisecondes chacun.

Considérons maintenant deux processus, l'un avec une gentillesse de 0 (la valeur par défaut), l'autre avec une gentillesse de 5. La différence proportionnelle entre les poids correspondants est d'environ 1/3, ce qui signifie que le processus de priorité supérieure reçoit une tranche de temps d'environ 15 millisecondes tandis que le processus de priorité inférieure reçoit une tranche de temps de 5 millisecondes.

Enfin, considérons deux processus avec les valeurs de gentillesse de 5 et 10 respectivement. Alors que la gentillesse absolue est plus grande dans ce cas, les différences relatives entre les valeurs de gentillesse sont les mêmes que dans l'exemple précédent, produisant une division de tranche de temps identique.

Thomas Nyman
la source
Juste la chose que je cherchais. Merci! Plus tard, j'ai trouvé cet article qui explique tout en détail, mais pas ce que vous venez d'écrire.
BЈовић
Il y a quelque chose que je ne comprends pas .. quel est le rôle de vruntime?
Surfer le
@Surferonthefall vruntime est le mécanisme interne CFS qui assure le suivi de la plupart des processus de temps CPU alloués. Cette question concerne la belle valeur visible dans l'espace utilisateur. Si vous avez une question sur les internes du CFS et que vous ne trouvez pas de réponse ailleurs , posez une nouvelle question
Thomas Nyman