Quelqu'un peut-il s'il vous plaît expliquer la différence entre un modèle de filetage préemptif et un modèle de filetage non préemptif?
Selon ma compréhension:
Quelqu'un peut-il s'il vous plaît:
yield()
(ou autre) pour que cela se produise.Les threads non préemptifs sont également appelés threads coopératifs. POE (Perl) en est un exemple. Un autre exemple est le classique Mac OS (avant OS X). Les threads coopératifs ont l'usage exclusif du processeur jusqu'à ce qu'ils l'abandonnent. Le planificateur choisit ensuite un autre thread à exécuter.
Les threads préemptifs peuvent volontairement abandonner le processeur, tout comme les coopératives, mais s'ils ne le font pas, ils le prennent, et le planificateur démarrera un autre thread. Les threads POSIX et SysV entrent dans cette catégorie.
Les principaux avantages des threads coopératifs sont une plus grande efficacité (sur les machines mono-core, au moins) et une gestion plus simple de la simultanéité: elle n'existe que lorsque vous cédez le contrôle, le verrouillage n'est donc pas nécessaire.
Les principaux avantages des threads préemptifs sont une meilleure tolérance aux pannes: un seul thread ne cédant pas, il n'empêche pas tous les autres threads de s'exécuter. De plus, il fonctionne normalement mieux sur des machines multicœurs, car plusieurs threads s'exécutent en même temps. Enfin, vous n'avez pas à vous soucier de céder constamment. Cela peut être vraiment ennuyeux à l’intérieur, par exemple, une boucle lourde de calcul.
Vous pouvez les mélanger, bien sûr. Un seul thread préemptif peut contenir de nombreux threads coopératifs.
Si vous utilisez non-preemptive cela ne signifie pas que le processus ne change pas de contexte lorsque le processus attend des E/S. Le répartiteur choisira un autre processus en fonction du modèle de planification. Dans ce modèle, nous devons faire confiance au processus.
non-préemptif:
Commutateur de contexte 1.less = moins au-dessus de la tête qui peut être sensible dans un modèle non préemptif
2.It plus facile à manipuler car il peut être manipulé sur un processeur simple cœur
préemptif :
Avantage:
1.Dans ce modèle, nous avons une priorité qui peut nous aider à avoir plus de contrôle sur le processus en cours
2.We peut voir la meilleure concurrence
3.nous pouvons gérer un appel système sans bloquer l'ensemble du système
Désavantage:
1. Nous avons besoin d'un algorithme complexe pour le verrouillage et nous avons un problème de section critique à traiter
2. souvent une grosse surcharge que nous devrions payer
Dans cooperative (non-preemptive) models, une fois qu'un contrôle est donné, il continue à s'exécuter jusqu'à ce qu'il obtienne explicitement le contrôle ou qu'il se bloque.
Dans un modèle préemptif , la machine virtuelle est autorisée à intervenir et à passer le contrôle d'un thread à un autre à tout moment. Les deux modèles ont leurs avantages et leurs inconvénients.
Les threads Java sont généralement préventifs entre les priorités. Un thread de priorité supérieure a la priorité sur un thread de priorité inférieure. Si un thread de priorité supérieure passe en veille ou se bloque, un thread de priorité inférieure peut s'exécuter (en supposant qu'un autre soit disponible et prêt à être exécuté).
Cependant, dès que le thread de priorité supérieure reprend ou débloque, il interrompra le thread de priorité inférieure et s'exécutera jusqu'à ce qu'il se termine, se bloque à nouveau ou soit préempté par un thread de priorité encore plus élevée.
La spécification du langage Java autorise parfois les ordinateurs virtuels à exécuter des threads de priorité inférieure au lieu d'un thread d'exécution de priorité supérieure exécutable, mais dans la pratique, cela est inhabituel.
Cependant, rien dans la spécification du langage Java ne spécifie ce qui est supposé se passer avec des threads d'égale priorité. Sur certains systèmes, ces threads seront découpés dans le temps et le moteur d’exécution allouera un certain temps à un thread. Lorsque ce délai est écoulé, le moteur d'exécution prévient le thread en cours d'exécution et passe au thread suivant avec la même priorité.
Sur d'autres systèmes, un thread en cours d'exécution ne sera pas préempté en faveur d'un thread ayant la même priorité. Il continuera à fonctionner jusqu'à ce qu'il bloque, rende explicitement le contrôle ou soit préempté par un thread de priorité supérieure.
Quant aux avantages, derobert et pooria les ont mis en évidence assez clairement.