web-dev-qa-db-fra.com

Fils préemptifs et fils non préemptifs

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: 

  • Modèle de threading non préemptif: Une fois qu'un thread est démarré, il ne peut pas être arrêté ou le contrôle ne peut pas être transféré à d'autres threads tant que le thread n'a pas terminé sa tâche. 
  • Modèle de threading préemptif: Le moteur d'exécution est autorisé à intervenir et à passer le contrôle d'un thread à un autre à tout moment. Les threads de priorité supérieure ont la priorité sur les threads de priorité inférieure. 

Quelqu'un peut-il s'il vous plaît:

  1. Expliquez si la compréhension est correcte.
  2. Expliquez les avantages et les inconvénients des deux modèles.
  3. Un exemple de quand utiliser ce qui sera vraiment utile.
  4. Si je crée un fil sous Linux (système v ou Pthread) sans mentionner aucune option (y en a-t-il?), Le modèle de thread utilisé par défaut est un modèle de thread préemptif?
38
Alok Save
  1. Non, votre compréhension n'est pas tout à fait correcte. Les threads non préemptifs (c'est-à-dire coopératifs) cèdent généralement le contrôle manuellement pour permettre aux autres threads de s'exécuter avant leur fin (bien qu'il appartienne à ce thread d'appeler yield() (ou autre) pour que cela se produise.
  2. Préemptant le filetage est plus simple. Les fils coopératifs ont moins de frais généraux.
  3. Utilisez normalement préventif. Si vous constatez que votre conception nécessite beaucoup de temps de commutation de threads, des threads coopératifs seraient une optimisation possible. Dans beaucoup de situations (la plupart?), Il s'agira d'un investissement assez important avec un gain minime.
  4. Oui, par défaut, vous obtenez un thread préemptif, mais si vous recherchez le paquet CThreads, il supporte le thread coopératif. Peu de gens (maintenant) veulent des fils de coopération que je ne suis pas sûr d'avoir mis à jour au cours de la dernière décennie, bien que ...
33
Jerry Coffin

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.

20
derobert

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 

7
pooria

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.

0
Amimo Benja