web-dev-qa-db-fra.com

Incompréhension de la différence entre la programmation monothread et la programmation multithread

J'ai une mauvaise compréhension de la différence entre la programmation monothread et la programmation multithread, donc je veux une réponse à la question suivante pour que tout soit clair.

Supposons qu'il existe 9 tâches indépendantes et que je souhaite les accomplir avec un programme monothread et un programme multithread. Fondamentalement, ce sera quelque chose comme ceci:

Single-thread:

- Execute task 1
- Execute task 2
- Execute task 3
- Execute task 4
- Execute task 5
- Execute task 6
- Execute task 7
- Execute task 8
- Execute task 9

Multi-thread:

Thread1:

- Execute task 1
- Execute task 2
- Execute task 3

Thread2:

- Execute task 4
- Execute task 5
- Execute task 6

Thread3:

- Execute task 7
- Execute task 8
- Execute task 9

Si je comprends bien, seul [~ # ~] un [~ # ~] thread sera exécuté à la fois (obtenez le CPU), et une fois le quantum est terminé, le planificateur de threads donnera le temps CPU à un autre thread.

Alors, quel programme sera terminé plus tôt? Est-ce le programme multi-thread (logiquement)? ou est-ce le programme à un seul thread (puisque le multi-thread a beaucoup de changement de contexte qui prend un certain temps)? et pourquoi? J'ai besoin d'une bonne explication s'il vous plaît :)

23
Eng.Fouad

Ça dépend.

Combien de processeurs possédez-vous? Combien d'E/S sont impliquées dans vos tâches?

Si vous n'avez qu'un seul processeur et que les tâches n'ont pas d'E/S bloquantes, alors le thread unique se terminera égal ou plus rapide que le multi-thread, car il y a des frais généraux pour changer de thread.

Si vous avez 1 processeur, mais que les tâches impliquent beaucoup de blocage des E/S, vous pouvez voir une accélération en utilisant le threading, en supposant que le travail peut être effectué lorsque les E/S sont en cours.

Si vous avez plusieurs processeurs, vous devriez voir une accélération avec l'implémentation multithread sur le thread unique, car plus d'un thread peut s'exécuter en parallèle. À moins bien sûr que les tâches soient dominées par les E/S, auquel cas le facteur limitant est la vitesse de votre appareil, pas la puissance du processeur.

26
hvgotcodes

Si je comprends bien, un seul thread sera exécuté à la fois

Ce serait le cas si le CPU n'avait qu'un seul cœur. Les processeurs modernes ont plusieurs cœurs et peuvent exécuter plusieurs threads en parallèle.

Le programme exécutant trois threads fonctionnerait presque trois fois plus rapidement. Même si les tâches sont indépendantes, il existe toujours des ressources dans l'ordinateur qui doivent être partagées entre les threads, comme l'accès à la mémoire.

9
Guffa

Ensemble d'hypothèses: monocœur sans hyperthreading; les tâches sont liées au processeur; Chaque tâche prend 3 quanta de temps; Chaque allocation de planificateur est limitée à 1 quanta de temps; FIFO scheduler Nonpreemptive; Tous les threads atteignent le planificateur en même temps; Tous les changements de contexte nécessitent le même temps;

Les processus sont définis comme suit:

  • Test 1: Processus unique, thread unique (contient les 9 tâches)
  • Test 2: Single Process, trois threads (contiennent 3 tâches chacun)
  • Test 3: trois processus, chaque thread unique (contient 3 tâches chacun)
  • Test 4: trois processus, chacun avec trois threads (contient une tâche chacun)

Avec les hypothèses ci-dessus, elles se terminent toutes en même temps. En effet, il y a un temps identique pour le CPU, les commutateurs de contexte sont identiques, il n'y a pas de gestion des interruptions et rien n'attend les E/S.

Pour plus de détails sur la nature de ceci, veuillez trouver ce livre .

3
sscheider

Eh bien, ce n'est pas entièrement indépendant de la langue. Certains langages de programmation interprétés ne prennent pas en charge les vrais threads. C'est-à-dire que les threads d'exécution peuvent être définis par le programme, mais l'interpréteur est à thread unique, donc toute l'exécution est sur un cœur du CPU.

Pour les langues compilées et les langues qui prennent en charge le véritable multithread, un seul processeur peut avoir plusieurs cœurs. En fait, la plupart des ordinateurs de bureau ont maintenant 2 ou 4 cœurs. Ainsi, un programme multithread exécutant des tâches vraiment indépendantes peut se terminer 2 à 4 fois plus rapidement en fonction du nombre de cœurs disponibles dans le CPU.

2
Tim Bender

La principale différence entre un thread unique et un thread multiple dans Java est que le thread unique exécute les tâches d'un processus tandis que dans le multi-thread, plusieurs threads exécutent les tâches d'un processus.

Un processus est un programme en cours d'exécution. La création de processus est une tâche consommatrice de ressources. Par conséquent, il est possible de diviser un processus en plusieurs unités appelées threads. Un fil est un processus léger. Il est possible de diviser un seul processus en plusieurs threads et de leur assigner des tâches. Lorsqu'il y a un thread dans un processus, il est appelé une application à thread unique. Lorsqu'il y a plusieurs threads dans un processus, cela s'appelle une application multi-thread.

0
Amarat