web-dev-qa-db-fra.com

Pourquoi devrais-je utiliser un thread par rapport à un processus?

Séparer les différentes parties d'un programme en différents processus me semble (pour moi) un programme plus élégant que de simplement tout enfiler. Dans quel scénario aurait-il un sens de faire fonctionner les choses sur un thread plutôt que de séparer le programme en différents processus? Quand devrais-je utiliser un fil?


Modifier

Il serait également utile de savoir comment (ou si) ils agissent différemment avec les systèmes monocœur et multicœur.

39
danmine

Vous préféreriez plusieurs threads à plusieurs processus pour deux raisons:

  1. La communication inter-thread (partage de données, etc.) est beaucoup plus simple à programmer que la communication inter-processus.
  2. Les changements de contexte entre les threads sont plus rapides qu'entre les processus. Autrement dit, il est plus rapide pour le système d’exploitation d’arrêter un thread et d’en exécuter un autre que de faire la même chose avec deux processus.

Exemple:

Les applications avec interface graphique utilisent généralement un thread pour l'interface graphique et d'autres pour le calcul en arrière-plan. Le vérificateur orthographique dans MS Office, par exemple, est un thread distinct de celui qui exécute l'interface utilisateur Office. Dans de telles applications, l'utilisation de plusieurs processus entraînerait une performance plus lente et un code difficile à écrire et à maintenir.

70

Bien en dehors des avantages de l’utilisation de thread over process, comme:

Avantages:

  • Il est beaucoup plus rapide de créer un thread que Un processus. 
  • Il est beaucoup plus rapide de passer d'un thread à un autre que de passer d'un processus à un autre. 
  • Les threads partagent des données Facilement

Considérez aussi quelques inconvénients:

  • Pas de sécurité entre les threads.
  • Un thread peut piétiner les données d'un autre thread
  • Si un thread bloque, tous les Threads du bloc de tâches.

En ce qui concerne la partie importante de votre question "Quand devrais-je utiliser un fil?"

Eh bien, vous devez prendre en compte quelques faits qu'un thread ne doit pas modifier la sémantique d'un programme. Ils changent simplement le calendrier des opérations. En conséquence, ils sont presque toujours utilisés comme solution élégante aux problèmes de performances. Voici quelques exemples de situations dans lesquelles vous pourriez utiliser des threads:

  • Traitement long: lorsqu'une application Windows calcule, elle ne peut plus traiter de messages. En conséquence, l'affichage ne peut pas être mis à jour.
  • Traitement en arrière-plan: Certaines tâches Ne sont peut-être pas critiques pour le temps, mais Doit être exécuté en continu.
  • Faire le travail d'E/S: I/O sur le disque ou tonetwork peut avoir des délais imprévisibles Les threads vous permettent de vous assurer que la latence des E/S ne retarde pas les parties non liées de votre application.
31
simplyharsh

Je suppose que vous savez déjà que vous avez besoin d'un thread ou d'un processus, alors je dirais que la principale raison de choisir l'un sur l'autre est le partage de données. 

L'utilisation d'un processus signifie que vous avez également besoin de la communication inter-processus (IPC) pour obtenir des données dans et hors du processus. C’est une bonne chose si le processus doit être isolé.

6
BenB

Vous ne parlez pas comme un débutant. C'est une excellente observation que les processus sont, à bien des égards, plus élégants. Les threads sont fondamentalement une optimisation pour éviter trop de transitions ou trop de communication entre les espaces mémoire.

Utiliser superficiellement des threads peut également sembler faciliter la lecture et l’écriture de votre programme, car vous pouvez partager librement des variables et de la mémoire entre les threads. En pratique, cela nécessite une attention toute particulière pour éviter les situations de course ou les blocages.

Il existe des noyaux de systèmes d'exploitation (notamment L4 ) qui s'efforcent d'améliorer l'efficacité de la communication interprocessus. Pour de tels systèmes, on pourrait probablement argumenter de manière convaincante que les threads sont inutiles.

6
flodin

Je suis d'accord avec la plupart des réponses ci-dessus. Mais du point de vue de la conception, je préférerais un fil lorsque je souhaite effectuer un ensemble d’opérations logiquement liées en parallèle. Par exemple, si vous exécutez un traitement de Word, un thread fonctionnera au premier plan en tant qu'éditeur et un autre exécutera en arrière-plan, enregistrant automatiquement le document à intervalles réguliers afin que personne ne puisse concevoir un processus permettant d'effectuer cette tâche d'enregistrement séparément.

2
Sanjay

Outre les autres réponses, la maintenance et le déploiement d'un processus unique sont beaucoup plus simples que de disposer de quelques exécutables. 

On utiliserait plusieurs processus/exécutables pour fournir une interface/découplage bien définie, de sorte qu'une partie ou l'autre puisse être réutilisée ou réimplémentée plus facilement que de conserver toutes les fonctionnalités dans un processus.

2
Tim

Entré dans ce post. Discussion intéressante. mais j'ai senti un point manque ou indirectement.

La création d'un nouveau processus est coûteuse à cause de toutes les structuresdata qui doivent être allouées et initialisées. Le processus est subdivisé en différents threads de contrôle pour permettre le multithreading au sein du processus. 

L'utilisation d'un thread ou d'un processus pour atteindre la cible dépend des exigences de votre programme et de l'utilisation des ressources. 

0
Suresh