web-dev-qa-db-fra.com

Comment Linux accomplit-il la planification préventive?

Je lise des processus Linux sur le projet de documentation Linux: https://www.tldp.org/ldp/tlk/kernel/processes.html

Les processus font toujours des appels de systèmes et peuvent souvent avoir besoin d'attendre. Malgré tout, si un processus s'exécute jusqu'à ce qu'il attend, il peut toujours utiliser une quantité disproportionnée de l'heure du processeur et que Linux utilise donc la planification préventive. Dans ce schéma, chaque processus est autorisé à fonctionner pendant une petite quantité de temps, 200ms et, lorsque cette période a expiré, un autre processus est sélectionné pour exécuter et que le processus d'origine est effectué pour attendre un peu de temps jusqu'à ce qu'il puisse être à nouveau exécuté. Cette petite quantité de temps est connue comme une tranche de temps.

Ma question est que comment se passe-t-il cette fois-ci? Si le processus est actuellement le seul occupant de la CPU, il n'ya rien de vérifier en réalité si le temps a expiré, non?

Je comprends que les processus passent à SysCalls et ceux-ci sautent sur le planificateur, il est donc logique de savoir comment les processus peuvent être "échangés" à cet égard. Mais comment Linux est-il capable de garder la piste combien de temps un processus a eu sur la CPU? Est-ce seulement possible via des minuteries matérielles?

17
Nexuist

La reponse courte est oui. Toutes les approches pratiques de la préemption utiliseront une sorte d'interruption de la CPU pour revenir en mode privilégié, c'est-à-dire le planificateur de noyau Linux.

Si vous regardez votre /proc/interrupts Vous trouverez les interruptions utilisées dans le système, y compris les minuteries.

Notez que Linux dispose de plusieurs types de planificateurs différents, et le style de minuterie périodique classique est rarement utilisé - à partir de la documentation Complètement juste planificateur (CFS) Documentation :

CFS utilise la comptabilité de granularité nanoseconde et ne repose pas sur des jiffs ou d'autres détails de Hz. Ainsi, le planificateur CFS n'a aucune notion de "Timeslices" de la manière dont le planificateur précédent n'avait aucune idée et n'a aucune heuristique.

En outre, lorsqu'un programme émet un appel système (généralement par une interruption logicielle - "piège"), le noyau est également en mesure de préempter le programme d'appel, ceci est particulièrement évident avec les appels système en attente de données d'autres processus.

25