Ce matin, j'ai lu des informations sur la planification en temps réel de Linux. Selon le livre 'Programmation du système Linux par Robert Love', il y a deux ordonnances principales. L'un est SCHED_FIFO, fifo et le second est SCHED_RR, le round robin. Et j'ai compris comment fonctionnent les algorithmes fifo et rr. Mais comme nous avons l'appel système,
sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)
nous pouvons définir explicitement la politique de planification de notre processus. Ainsi, dans certains cas, deux processus exécutés par la racine peuvent avoir une politique de planification différente. En tant que processus ayant SCHED_FIFO et un autre ayant SCHED_RR et avec la même priorité. Dans ce cas, quel processus sera sélectionné en premier? le processus classé FIFO ou le processus classé RR? Pourquoi?
Considérons ce cas. Il y a trois processus A, B, C. Tous ont la même priorité. A et B sont des processus classés RR et C est FIFO classé un. A et B sont exécutables (les deux fonctionnent donc alternativement dans un certain intervalle). Et actuellement, A est en cours d'exécution. Maintenant, C devient exécutable. Dans ce cas, si
1. A will preempt for C, or
2. A will run until its timeslice goes zero and let C run. Or
3. A will run until its timeslice goes zero and let B run.
a) here after B runs till its timeslice becomes zero and let C run or
b) after B runs till its timeslice becomes zero and let A run again (then C will starve untill A and B finishes)
Dans la planification en temps réel, FIFO et RR n'ont pas exactement la même signification que dans la planification en temps non réel. Les processus sont toujours sélectionnés de manière FIFO, cependant, le temps quantique pour SCHED_FIFO n'est pas limité contrairement au temps quantique pour SCHED_RR.
Les processus SCHED_FIFO ne préemptent pas les processus SCHED_RR de même priorité.
sched_setscheduler (2) - Page de manuel Linux
...
"La politique de planification d'un processus détermine son emplacement dans la liste des processus avec une priorité statique égale et son déplacement dans cette liste. Toute planification est préemptive: si un processus avec une priorité statique supérieure est prêt à être exécuté, le processus en cours d'exécution est activé. Le processus sera préempté et renvoyé à la liste d'attente pour son niveau de priorité statique. La règle de planification ne détermine que l'ordre dans la liste des processus exécutables avec une priorité statique égale. "
...
"Un processus SCHED_FIFO s'exécute jusqu'à ce qu'il soit bloqué par une demande d'E/S, soit préempté par un processus de priorité supérieure, ou qu'il appelle sched_yield (2)."
...
"Lorsqu'un processus SCHED_FIFO devient exécutable, il sera inséré à la fin de la liste pour sa priorité."
...
"SCHED_RR: Ordonnancement à la ronde"
SCHED_RR est une simple amélioration de SCHED_FIFO. Tout ce qui est décrit ci-dessus pour SCHED_FIFO s'applique également à SCHED_RR, à l'exception du fait que chaque processus ne peut s'exécuter que pendant une durée maximale. Si un processus SCHED_RR a été exécuté pendant une période de temps égale ou supérieure au délai, il sera placé à la fin de la liste pour sa priorité. Un processus SCHED_RR qui a été préempté par un processus de priorité supérieure et reprend ensuite son exécution, car un processus en cours achèvera la partie non expirée de son quantum de temps de répétition alternée. "
man sched_setscheduler
explique ces règles de planification en détail.
Dans ce cas particulier, parce que les deux processus en temps réel ont la même priorité, aucun d’entre eux ne préemptera l’autre. Un processus SCHED_FIFO
s'exécute jusqu'à ce qu'il se bloque, le processus SCHED_RR
s'exécute jusqu'à ce qu'il se bloque ou que son délai expire.
Selon la page de manuel, je pense que 1 est la réponse. A, B sont les règles RR, C est FIFO règles. Puisque RR est également une FIFO d’amélioration, ils appartiennent tous à la classe FIFO.
Comme ils ont tous la même priorité, la page de manuel dit "Un appel à sched_setscheduler () ou sched_setparam (2) mettra le processus SCHED_FIFO (ou SCHED_RR) identifié par pid au début de la liste s'il était exécutable. Par conséquent, le processus en cours d'exécution peut être préempté s'il a la même priorité. (POSIX.1-2001 spécifie que le processus doit aller à la fin de la liste.) "
Une fois que sched_setscheduler a été appelé pour définir la politique de C comme FIFO, C préemptera A.
D'après ce que je comprends des deux classes différentes, le processus SCHED_FIFO n'est jamais anticipé par le noyau. Même si un autre processus de classe "SCHED_FIFO" attend son tour ...
Alors que la politique SCHED_RR partage un peu plus les ressources du processeur. Le planificateur laissera le processus SCHED_RR s'exécuter pendant un laps de temps considérable, puis le préemptera uniquement pour laisser tourner un autre processus SCHED_RR. C'est exactement Round Robin.
SCHED_FIFO est "plus fort" en ce sens que si un processus SCHED_FIFO ne cède jamais () au noyau ou n'appelle un appel système sur un périphérique single core , tous les autres processus en temps réel risquent de ne jamais s'exécuter.