Laurent Esnault, VP de l’ingénierie, explique la différence entre les processus coopératifs et préemptifs lors de sa Break Out Session sur le Multi-threading préemptif au 4D Summit 2016. Grâce au Multi-threading préemptif, vous pouvez avoir plus de processus parallèles, et ainsi ajouter de plus en plus d’utilisateurs, que ce soit pour les applications de bureau ou pour les applications web.
Si vous avez manqué la session de Laurent au 4D Summit 2016, regardez cette vidéo et profitez d’un entraînement personnel par le maître du multithreading préemptif !
Différence entre coopératif et préemptif
Alors, qu’est-ce que le mode coopératif et qu’est-ce que le mode préemptif ?
Le mode coopératif est généralement ce que vous utilisez aujourd’hui avec vos processus 4D. Coopératif signifie que les processus 4D coopèrent (travaillent ensemble) pour partager une seule unité centrale. Parfois, ils coopèrent explicitement, comme lorsque vous utilisez la commande IDLE, et parfois ils coopèrent implicitement, comme lorsque vous utilisez la plupart des autres commandes du langage 4D. En effet, en interne, 4D utilise la commande IDLE pour donner le CPU à un autre processus. Par conséquent, un seul cœur de CPU peut être utilisé à la fois.
Bien sûr, vous connaissez tous les processus 4D que vous utilisez aujourd’hui. Et il semble naturel d’utiliser ces processus pour accéder à l’interface utilisateur. Vous pouvez ouvrir une fenêtre, afficher un dialogue ou un formulaire, etc. Mais en fait, ce n’est pas du tout naturel pour un système d’exploitation. La plupart des systèmes d’exploitation interdisent l’accès à l’interface utilisateur à partir de tout thread autre que le thread principal. Mais pour les processus coopératifs, 4D gère en interne l’accès à l’interface utilisateur… même dans un thread secondaire.
En mode préemptif, vous n’avez pas besoin d’appeler la commande IDLE, car les processus 4D n’ont pas besoin de coopérer pour partager le CPU : c’est le système d’exploitation qui s’en charge. Le système d’exploitation donne de manière préemptive le CPU à un thread ou à un autre. Ainsi, si vous disposez de plusieurs CPU dans votre machine, plusieurs threads peuvent être exécutés en même temps. L’avantage est donc que vous pouvez utiliser tous les cœurs de votre machine. Mais depuis un thread préemptif, vous ne pouvez pas accéder à l’interface utilisateur.
Vous pouvez voir comment, en mode coopératif, les processus sont exécutés séquentiellement, l’un après l’autre et en utilisant un seul CPU, alors qu’en mode préemptif, le système d’exploitation répartit les deux processus sur tous les CPU (dans l’exemple illustré, les CPU 1 et 2).
L’avantage est évident. Le temps d’exécution global est plus court en mode préemptif lorsque vous avez deux CPU. Même si le temps d’exécution de chaque processus individuel est le même. L’ordonnancement préemptif n’entraîne pas de gain de performance sur le temps d’exécution d’un processus. C’est le temps d’exécution global de plusieurs tâches, exécutées dans plusieurs processus, qui sera réduit.
Démonstration
Voici une démonstration très simple. Chaque bouton crée quatre processus individuels.
Le premier bouton crée quatre processus coopératifs pour effectuer quelques calculs absurdes (strictement pour les besoins de la démonstration). Le temps d’exécution global est de 643 ticks et le temps d’exécution de chaque processus individuel est d’environ 150 ticks. Donc, en fait, le temps d’exécution global n’est que l’addition des quatre temps d’exécution individuels.
Si nous effectuons exactement le même calcul dans quatre threads préemptifs, vous verrez que le temps d’exécution des processus individuels est à peu près le même (150 ticks), mais que le temps d’exécution global est QUATRE FOIS plus court.
Retrouvez l’exemple de base de données utilisé pour la démonstration et des explications complémentaires dans le billet de Vanessa sur les processus préemptifs.