Pourquoi la gentillesse varie -20 à 19?

22

La nicecommande vous permet d'ajuster la priorité de planification ("gentillesse") d'un programme. Sur tous les systèmes de type Unix que j'ai utilisés, la gentillesse est spécifiée par une plage d'entiers, où -20 est la priorité de planification la plus favorable, 0 est la valeur par défaut et 19 est la moins favorable.

Avoir 0 comme finesse par défaut est assez intuitif, mais pourquoi -20 et 19 ont-ils été sélectionnés comme points de terminaison de la plage? Pourquoi pas -128 et 127, ce qui correspondrait exactement à un octet 8 bits signé? Ou pourquoi pas -100 à 100, ce qui est plus intuitif pour les humains décimaux, ou de manière similaire mais légèrement plus ergonomique, -99 à 99? La plage de -20 à 19 a-t-elle été choisie arbitrairement, ou a-t-elle une relation avec les éléments internes de l'ordonnanceur qui ont niceinitialement interagi avec? (Je comprends qu'il n'y a pas une telle relation aujourd'hui, du moins pour Linux, dont le planificateur utilise des priorités dans la plage de 0 à 139. Cependant, je suis intéressé par les raisons historiques de la plage de -20 à 19.)

Psychonaut
la source
4
Je ne trouve pas de référence expliquant pourquoi cette plage spécifique a été choisie, mais notez que dans V7, la priorité s'inscrit dans un octet signé - voir proc.h - et la fonction setpri définit la priorité sur min(127, (recent CPU usage on a scale of 0 to 15) + 50 + pp->p_nice - 20), et les priorités <25 étaient réservées pour processus faisant des choses sans interruption. La gentillesse devait donc être une sorte de gamme limitée.
Mark Plotnick

Réponses:

7

Les niveaux de gentillesse internes sont de 0 à 39, mais les incréments sont positifs ou négatifs. Source . Donc, la réponse est que les nombres (positifs et négatifs) acceptés par la nicecommande sont ce qui vous fait passer de 20, le niveau par défaut, à n'importe où dans la plage 0-39.

Alors pourquoi 0-39? La gamme spécifique était ce qui a fonctionné dans la mise en œuvre originale des concepteurs. La raison pour laquelle des valeurs plus positives sont plus agréables est que le niveau agréable est ajouté à l'utilisation récente du processeur d'un processus pour déterminer la priorité. Afin de fournir une planification approximative à tour de rôle, le noyau garde une trace de la quantité de CPU que chaque processus a brûlée récemment et passe aux processus qui n'en ont pas autant. Plus le niveau est élevé, plus le temps processeur semble être important, et plus le planificateur mettra ce processus en veille ou le laissera dormir. Voir La conception du système d'exploitation UNIX par Maurice J. Bach, Prentice-Hall 1986, sec. 8.1 (8.1.4 pour la gentillesse en particulier). ISBN 0-13-201799-7.

cxw
la source
1
Vous vous trompez en supposant que le planificateur mettra un processus en veille s'il a une mauvaise valeur. Au lieu de cela, le planificateur ne réveillera pas un processus en veille s'il existe d'autres processus prêts à être exécutés et que ces processus ont un meilleur niveau agréable. Notez qu'un processus est mis en veille, lorsqu'il appelle un syscall qui impose une mise en veille des ressources ou lorsqu'un processus est épuisé, il est quantique du processeur et d'autres processus plus privilégiés attendent le processeur.
schily
-4

Vous vous trompez: si vous êtes sous UNIX où l'interface nice () a toujours du sens, NZEROc'est la valeur nice par défaut et NZERO is 20.

Pour rendre les choses plus évidentes: vous avez posé des questions sur la commande niceet en même temps mentionné les niveaux absolus, mais la belle commande ne gère pas les valeurs absolues mais plutôt les incréments par rapport au niveau actuel. Dans le cas de l'état par défaut, le niveau agréable NZEROest de 20.

Les bonnes valeurs sont 0..2 * NZERO-1 ou 0..39

Notez que bien que le planificateur UNIX par défaut puisse toujours faire quelque chose d'utile avec une belle valeur, cela n'a aucune signification au cas où vous utilisez un planificateur spécialisé, par exemple un planificateur en temps réel.

schily
la source
2
Vous semblez confondre l'interface shell et l'interface C. Cette question concerne la nicecommande shell.
Gilles 'SO- arrête d'être méchant'
Eh bien, c'est vous qui confondez les choses. La commande nice ne connaît que les deltas mais la question mentionne de belles valeurs. La question portait sur de belles valeurs et j'y ai répondu.
schily