Multitâche préemptif
En informatique, le multitâche préemptif désigne la capacité d'un système d'exploitation à exécuter ou arrêter une tâche planifiée en cours.
Un ordonnanceur préemptif présente l'avantage d'une meilleure réactivité du système et de son évolution. Les différentes tâches peuvent être exécutées en parallèle, à la fois par un changement de contexte très rapide et par la répartition sur différents processeurs. Le seul inconvénient que l'on pourrait donner à un système multitâche préemptif vient des situations de compétition, en général relativement limité. Lorsqu'un processus d'exécution accède à une ressource, il faut dans certains en particulier, que le ou les autres systèmes libèrent la ressource, mais c'est de toute façon également dans les systèmes monotâche ou multitâche coopératif. Dans un grand nombre de cas, le système permet des changements de contexte laissant une utilisation simultanée ou quasi-simultanée (de l'ordre que quelques micro secondes entre chaque processus) de différents processus simultanément.
Principe de fonctionnement
L'ordonnanceur distribue le temps du processeur entre les différents processus. Dans un système préemptif, à l'inverse d'un système collaboratif, l'ordonnanceur peut interrompre à tout moment un processus en cours d'exécution pour permettre à un autre de s'exécuter. Les processus ne peuvent s'accaparer le ou un processeur que de façon limitée dans le temps, par alternance, en fonction de la priorité du processus ou du fil d'exécution (thread). Une quantité de temps définie par le système est attribuée à chaque processus. Ce droit de préemption peut tout aussi bien survenir avec des interruptions matérielles que logicielles, selon les cas.
Un processus peut être spécifié comme « préemptible » ou « non préemptible ». Un processus préemptible peut être suspendu au profit d'un processus ou d'une interruption. Un processus non préemptible ne peut être suspendu qu'au profit d'une interruption. Le temps qui lui est accordé est plus long, et l'attente plus courte.
On affecte généralement une priorité plus ou moins élevée aux processus. La préemption peut avoir lieu pour exécuter un processus prioritaire immédiatement. Mais elle peut aussi avoir lieu parce que le système d'exploitation juge que le processus actuel a utilisé le processeur trop longtemps. Ainsi, les autres processus peuvent eux aussi s'exécuter durant un laps de temps déterminé, même s'ils sont moins prioritaires.
Au fur et à mesure de l'évolution des systèmes d'exploitation, les concepteurs ont quitté la logique binaire « préemptible / non préemptible » au profit de systèmes plus fins de priorités multiples. Le principe est conservé, mais les priorités des processus sont échelonnées.
Pendant la préemption, l'état du processus (drapeaux, registres et pointeur d'instruction) est sauvé dans la mémoire. Il doit être rechargé dans le processeur pour que l'exécution reprenne : c'est la commutation de contexte.
Un système d'exploitation préemptif conserve en permanence la haute main sur les tâches exécutées par le processeur, contrairement à un système d'exploitation non préemptif, ou collaboratif, dans lequel c'est le processus en cours d'exécution qui prend la main et décide du moment où il la rend. L'avantage le plus évident d'un système préemptif est qu'il peut empêcher un processus dysfonctionnel d'accaparer sans fin le processeur.
Historique
Les premiers systèmes préemptifs naissent dans les années 1960 avec les travaux autour de multics. Le premier système préemptif largement diffusé est Unix durant les années 1970, ainsi que toutes les familles de systèmes qui en sont inspirés.
- Multitâche collaboratif : Mac OS Classic (1984), TOS de l'Atari ST (1985) ou RISC OS (d'Acorn, 1987) ;
- Multitâche préemptif : AmigaOS (1984), Linux (1991), FreeBSD (1993), BeOS (1995, duquel est dérivé Haiku), NetBSD et OpenBSD (1995), NeXTSTEP (1995), macOS (sous le nom Mac OS X, dérivé de NeXTSTEP, 2001).
Les premiers systèmes d'exploitation Windows de Microsoft (Windows 3.1, 1990) étaient des systèmes collaboratifs. Windows 95, Windows 98 et Windows Me, s'ils adoptent le noyau Win32 qui pourrait les classer parmi les systèmes préemptifs, conservent néanmoins, pour raison de compatibilité ascendante avec Windows 3.1, un mode coopératif dans lequel ils basculent dès qu'une application 16 bits est exécutée. Ce mode de fonctionnement rend ces systèmes d'exploitation peu fiables, le système ne pouvant pas interrompre une tâche fautive.
Tous les systèmes d'exploitation modernes (AmigaOS (1995), macOS et tous les Windows NT depuis le 3.1 et suivants) sont des systèmes préemptifs.