GNU/Linux >> Tutoriels Linux >  >> Linux

Threads préemptifs vs threads non préemptifs

  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 laisser les autres threads s'exécuter avant qu'ils ne se terminent (bien qu'il appartienne à ce thread d'appeler yield() (ou autre) pour que cela se produise.
  2. La préemption des threads est plus simple. Les threads coopératifs ont moins de surcharge.
  3. Utilisez normalement la préemption. Si vous trouvez que votre conception a beaucoup de frais généraux de commutation de threads, les threads coopératifs seraient une optimisation possible. Dans de nombreuses (la plupart ?) situations, il s'agira d'un investissement assez important avec un gain minime.
  4. Oui, par défaut, vous obtiendrez un threading préemptif, mais si vous recherchez le package CThreads, il prend en charge le threading coopératif. Peu de gens (maintenant) veulent des fils de discussion coopératifs dont je ne suis pas sûr qu'ils aient été mis à jour au cours de la dernière décennie...

Les threads non préemptifs sont également appelés threads coopératifs. POE (Perl) en est un exemple. Un autre exemple est le Mac OS classique (avant OS X). Les threads coopératifs ont l'usage exclusif du CPU jusqu'à ce qu'ils l'abandonnent. Le planificateur choisit alors un autre thread à exécuter.

Les threads préemptifs peuvent abandonner volontairement le processeur, tout comme les threads coopératifs, mais s'ils ne le font pas, il leur sera retiré et le planificateur démarrera un autre thread. Les threads POSIX et SysV entrent dans cette catégorie.

Les grands avantages des threads coopératifs sont une plus grande efficacité (sur les machines monocœur, au moins) et une gestion plus facile de la concurrence :elle n'existe que lorsque vous cédez le contrôle, donc le verrouillage n'est pas nécessaire.

Les grands avantages des threads préemptifs sont une meilleure tolérance aux pannes :un seul thread qui ne produit pas n'empêche pas tous les autres threads de s'exécuter. Fonctionne également mieux sur les machines multicœurs, car plusieurs threads s'exécutent en même temps. Enfin, vous n'avez pas à vous soucier de vous assurer que vous cédez constamment. Cela peut être vraiment ennuyeux à l'intérieur, par exemple, une boucle de calcul de nombres lourds.

Vous pouvez les mélanger, bien sûr. Un seul thread préemptif peut avoir de nombreux threads coopératifs exécutés à l'intérieur.


Si vous utilisez non préemptif cela ne signifie pas que le processus n'effectue pas de changement de contexte lorsque le processus attend des E/S. Le répartiteur choisira un autre processus selon le modèle de planification. Nous devons faire confiance au processus.

non préemptif :

  1. moins de changement de contexte, moins de overhead cela peut être judicieux dans un modèle non préemptif

  2. Plus facile à manipuler puisqu'il peut être manipulé sur un processeur monocœur

préventif :

Avantage :

  1. Dans ce modèle, nous avons une priorité qui nous aide à avoir plus de contrôle sur le processus en cours

  2. Une meilleure concurrence est un rebond

  3. Gérer les appels système sans bloquer tout le système

Inconvénient :

  1. Nécessite des algorithmes plus complexes pour la synchronisation et la gestion des sections critiques est inévitable.

  2. Le surcoût qui va avec


Linux
  1. Introduction aux threads Linux – Partie I

  2. Comment créer des threads sous Linux (avec un exemple de programme C)

  3. Nombre maximum de threads par processus sous Linux ?

  4. Threads POSIX détachés ou joignables

  5. Qu'est-ce que cela signifie de dire que le noyau Linux est préemptif ?

Quand utiliser pthread_exit() et quand utiliser pthread_join() sous Linux ?

Renice :Comment changer tous les fils ?

Les threads du noyau Linux sont-ils vraiment des processus du noyau ?

Ps peut-il afficher uniquement les processus non-noyau sous Linux ?

Les threads sont-ils implémentés en tant que processus sous Linux ?

Exécution simultanée de plusieurs threads scp