web-dev-qa-db-fra.com

Qu'est-ce qu'un "fil" (vraiment)?

J'ai essayé de trouver une bonne définition et de comprendre ce qu'est réellement un fil .

Il semble que je manque quelque chose d’évident, mais chaque fois que je lis ce qu’est un fil, c’est presque une définition circulaire, à la "un fil est un fil d’exécution" ou "un moyen de se diviser en tâches en cours". Euh Hein?

D'après ce que j'ai lu, il semble qu'un fil ne soit pas vraiment quelque chose concret, comme l'est un processus. C'est en fait juste un concept. D'après ce que j'ai compris de la façon dont cela fonctionne, un processeur exécute des commandes pour un programme (appelé thread d'exécution ), puis lorsqu'il doit passer en traitement pour un autre programme pendant un moment, il stocke l’état du programme qu’il est en train d’exécuter quelque part (Thread Local Storage) puis commence à exécuter les instructions de l’autre programme. Et d'avant en arrière. Ainsi, un thread n'est en réalité qu'un concept pour "l'un des chemins d'exécution" d'un programme en cours d'exécution.

Contrairement à un processus, qui est vraiment quelque chose - c'est un conglomérat de ressources, etc.

Comme exemple d'une définition qui ne m'a pas vraiment beaucoup aidé. . .

De Wikipedia :

"Un fil en informatique est l'abréviation de fil d'exécution. Un fil est un moyen pour un programme de se diviser (appelé" scission ") en deux ou plusieurs tâches en cours d'exécution simultanément (ou pseudo-simultanément). Les threads et les processus diffèrent système d'exploitation à un autre, mais en général, un fil est contenu dans un processus et que différents threads d'un même processus partagent les mêmes ressources alors que différents processus d'un même système d'exploitation multitâche ne le font pas. "

Alors j'ai raison? Faux? Qu'est-ce qu'un fil vraiment?

Edit: Apparemment, un thread se voit également attribuer sa propre pile d’appel, c’est donc quelque chose de concret .

206
richard

Un thread est un ensemble indépendant de valeurs pour les registres du processeur (pour un seul cœur). Etant donné que cela inclut le pointeur d’instruction (également appelé compteur de programme), il contrôle ce qui s’exécute dans quel ordre. Il inclut également le Stack Pointer, qui pointe mieux vers une zone de mémoire unique pour chaque thread, sinon ils vont interférer les uns avec les autres.

Les threads sont l'unité logicielle affectée par le flux de contrôle (appel de fonction, boucle, goto), car ces instructions opèrent sur le pointeur d'instructions, et qui appartiennent à un thread particulier. Les threads sont souvent planifiés selon un schéma de hiérarchisation (bien qu'il soit possible de concevoir un système avec un thread par cœur de processeur, auquel cas chaque thread est toujours en cours d'exécution et aucune planification n'est nécessaire).

En fait, la valeur du pointeur d'instruction et l'instruction stockée à cet emplacement sont suffisantes pour déterminer une nouvelle valeur pour le pointeur d'instruction. Pour la plupart des instructions, cela avance simplement l'adresse IP de la taille de l'instruction, mais les instructions de flux de commande modifient l'adresse IP d'une autre manière prévisible. La séquence de valeurs que l’IP prend forme un chemin d’exécution qui tisse dans le code du programme, donnant ainsi le nom de "thread".

132
Ben Voigt

Un thread est un contexte d'exécution, qui regroupe toutes les informations nécessaires à la CPU pour exécuter un flux d'instructions.

Supposons que vous lisiez un livre et que vous souhaitiez faire une pause tout de suite, mais que vous souhaitiez pouvoir revenir et reprendre la lecture à partir du point exact où vous vous êtes arrêté. Une façon d'y parvenir est de noter le numéro de page, le numéro de ligne et le numéro de Word. Donc, votre contexte d’exécution pour lire un livre est constitué de ces 3 chiffres.

Si vous avez une colocataire et qu'elle utilise la même technique, elle peut prendre le livre pendant que vous ne l'utilisez pas et reprendre la lecture à l'endroit où elle s'est arrêtée. Ensuite, vous pouvez le reprendre et le reprendre à votre place.

Les fils fonctionnent de la même manière. Un processeur vous donne l’illusion de faire plusieurs calculs en même temps. Il le fait en consacrant un peu de temps à chaque calcul. Il peut le faire car il a un contexte d'exécution pour chaque calcul. Tout comme vous pouvez partager un livre avec votre ami, de nombreuses tâches peuvent partager un processeur.

Sur un plan plus technique, un contexte d'exécution (donc un thread) est constitué des valeurs des registres de la CPU.

Dernier: les threads sont différents des processus. Un thread est un contexte d'exécution, alors qu'un processus est un ensemble de ressources associées à un calcul. Un processus peut avoir un ou plusieurs threads.

Précision: les ressources associées à un processus incluent les pages de mémoire (tous les threads d’un processus ont la même vue de la mémoire), les descripteurs de fichier (par exemple, les sockets ouverts) et les informations d’identité de sécurité (par exemple, l’ID de l’utilisateur qui a lancé le processus). processus).

178
pwnall

Les processus sont comme deux personnes utilisant deux ordinateurs différents, qui utilisent le réseau pour partager des données lorsque cela est nécessaire. Les threads sont comme deux personnes utilisant le même ordinateur, qui ne sont pas obligées de partager des données de manière explicite, mais qui doivent à tour de rôle jouer avec précaution.

Conceptuellement, les threads ne sont que plusieurs abeilles ouvrières bourdonnant dans le même espace adresse. Chaque thread a sa propre pile, son propre compteur de programme, etc., mais tous les threads d'un processus partagent la même mémoire. Imaginez deux programmes s'exécutant en même temps, mais ils peuvent tous deux accéder aux mêmes objets.

Comparez cela avec les processus. Les processus ont chacun leur propre espace d'adressage, ce qui signifie qu'un pointeur dans un processus ne peut pas être utilisé pour faire référence à un objet dans un autre (à moins que vous n'utilisiez de la mémoire partagée).

Je suppose que les éléments clés à comprendre sont les suivants:

  • Les processus et les threads peuvent "s'exécuter en même temps".
  • Les processus ne partagent pas de mémoire (par défaut), mais les threads partagent toute leur mémoire avec d'autres threads dans le même processus.
  • Chaque thread d'un processus a sa propre pile et son propre pointeur d'instruction.
42
Joey Adams

Pour définir formellement un fil, nous devons d’abord comprendre les limites du lieu où un fil fonctionne.

Un programme informatique devient un processus lorsqu'il est chargé à partir d'un magasin dans la mémoire de l'ordinateur et commence à être exécuté. Un processus peut être exécuté par un processeur ou un ensemble de processeurs. Une description de processus en mémoire contient des informations vitales telles que le compteur de programme qui garde une trace de la position actuelle dans le programme (c'est-à-dire quelle instruction est en cours d'exécution), des registres, des magasins de variables, des descripteurs de fichier, des signaux, etc.

Un thread est une séquence d'instructions de ce type dans un programme pouvant être exécuté indépendamment d'un autre code. La figure montre le concept: enter image description here

Les threads se trouvent dans le même espace adresse de processus . Par conséquent, une grande partie des informations présentes dans la description en mémoire du processus peuvent être partagées entre les threads.

Certaines informations ne peuvent pas être répliquées, telles que la pile (pointeur de pile vers une zone mémoire différente par thread), les registres et les données spécifiques aux threads. Cette information suffit pour permettre aux threads d'être programmés indépendamment du thread principal du programme et éventuellement à un ou plusieurs autres threads dans le programme.

Un support explicite du système d'exploitation est requis pour exécuter des programmes multithread. Heureusement, la plupart des systèmes d'exploitation modernes prennent en charge des threads tels que Linux (via NPTL), variantes BSD, Mac OS X, Windows, Solaris, AIX, HP-UX, etc. Les systèmes d'exploitation peuvent utiliser des mécanismes différents pour implémenter la prise en charge du multithreading.

Here, graphically, the concept is rapresented.

Ici , vous pouvez trouver plus d’informations sur le sujet. C'était aussi ma source d'informations.

38
Leos313

Je vais utiliser beaucoup de texte du livre Operating Systems Concepts de ABRAHAM SILBERSCHATZ, PETER BAER GALVIN et GREG GAGNE, ainsi que ma propre compréhension des choses.

processus

Toute application réside dans l'ordinateur sous forme de texte (ou de code).

Nous soulignons qu'un programme en soi n'est pas un processus. Un programme est une entité passive, par exemple un fichier contenant une liste d'instructions stockées sur le disque (souvent appelé fichier exécutable).

Lorsque nous démarrons une application, nous créons une instance d'exécution. Cette instance d'exécution s'appelle un processus. EDIT: (selon mon interprétation, analogue à une classe et à une instance d'une classe, l'instance d'une classe étant un processus.)

Un exemple de processus est celui de Google Chrome. Lorsque nous lançons Google Chrome, 3 processus sont générés:

• Le processus navigateur est responsable de la gestion de l'interface utilisateur ainsi que des E/S disque et réseau. Un nouveau processus de navigateur est créé au démarrage de Chrome. Un seul processus de navigateur est créé.

Renderer les processus contiennent une logique de rendu des pages Web. Ainsi, ils contiennent la logique de gestion du HTML, du Javascript, des images, etc. En règle générale, un nouveau processus de rendu est créé pour chaque site Web ouvert dans un nouvel onglet. Plusieurs processus de rendu peuvent donc être actifs simultanément.

• Un processus plug-in est créé pour chaque type de plug-in (tel que Flash ou QuickTime) utilisé. Les processus de plug-in contiennent le code du plug-in, ainsi que du code supplémentaire permettant au plug-in de communiquer avec les processus de rendu associés et le processus du navigateur.

Fil

Pour répondre à cette question, je pense que vous devez d’abord savoir ce qu’est un processeur. Un processeur est la pièce matérielle qui effectue les calculs. EDIT: (Calculs comme ajouter deux nombres, trier un tableau, exécuter le code qui a été écrit)

Passons maintenant à la définition d'un fil.

Un thread est un nité de base d'utilisation du processeur; il comprend un identifiant de thread, un compteur de programme, un ensemble de registres et une pile.

EDIT: Définition d'un fil du site Web d'Intel:

Un thread, ou thread d'exécution, est un terme logiciel désignant la séquence d'instructions ordonnée de base pouvant être transmise ou traitée par un seul cœur de processeur.

Ainsi, si le processus de rendu de l'application Chrome trie un tableau de nombres, le tri aura lieu sur un fil d'exécution. (La grammaire concernant les discussions me semble confuse)

Mon interprétation des choses

Un processus est une instance d'exécution. Les threads sont les ouvriers qui effectuent les calculs via un accès CPU. Lorsque plusieurs threads sont en cours d'exécution pour un processus, le processus fournit une mémoire commune.

EDIT: Autres informations que j'ai trouvé utiles pour donner plus de contexte

Tous les ordinateurs modernes ont plus d'un thread. Le nombre de threads dans un ordinateur dépend du nombre de cœurs dans un ordinateur.

calcul simultané:

De Wikipedia:

L'informatique simultanée est une forme d'informatique dans laquelle plusieurs calculs sont exécutés pendant des périodes qui se chevauchent - simultanément - plutôt que séquentiellement (un se terminant avant le prochain démarrage). Il s'agit d'une propriété d'un système - il peut s'agir d'un programme individuel, d'un ordinateur ou d'un réseau - et il existe un point d'exécution ou "thread de contrôle" distinct pour chaque calcul ("processus"). =

Donc, je pourrais écrire un programme qui calcule la somme de 4 nombres:

(1 + 3) + (4 + 5)

Dans le programme pour calculer cette somme (qui sera un processus s'exécutant sur un thread d'exécution), je peux créer un autre processus pouvant s'exécuter sur un thread différent pour calculer (4 + 5) et renvoyer le résultat au processus d'origine, tandis que Le processus d'origine calcule la somme de (1 + 3).

25
chatuur

Malheureusement, les threads existent. Un fil est quelque chose de tangible. Vous pouvez en tuer un et les autres continueront à courir. Vous pouvez créer de nouveaux threads .... bien que chaque thread ne soit pas son propre processus, ils s'exécutent séparément dans le processus. Sur les machines multicœurs, 2 threads peuvent s'exécuter simultanément.

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf

5
Orbit

La réponse varie énormément entre différents systèmes et différentes implémentations, mais les parties les plus importantes sont:

  1. Un thread a un thread d’exécution indépendant (c’est-à-dire que vous pouvez changer de contexte, puis revenir en arrière, et il reprendra son exécution là où il était).
  2. Un thread a une durée de vie (il peut être créé par un autre thread et un autre thread peut attendre la fin).
  3. Il contient probablement moins de bagages qu'un "processus".

Au-delà de cela: les threads pourraient être implémentés dans un seul processus par un environnement de langage, les threads pourraient être des coroutines, des threads pourraient être implémentés dans un seul processus par une bibliothèque de threading, ou les threads pourraient être une construction du noyau.

Dans plusieurs systèmes Unix modernes, y compris Linux que je connais le mieux, tout est un thread - un processus est simplement un type thread qui partage relativement peu de choses avec son parent (c’est-à-dire qu’il obtient ses propres mappages de mémoire, sa propre table de fichiers et ses autorisations, etc.) La lecture de man 2 clone, en particulier la liste des indicateurs, est vraiment instructive ici.

4
hobbs

Un fil n'est rien d'autre qu'un contexte de mémoire (ou comment Tanenbaum le définit mieux, groupement de ressources) avec des règles d'exécution. C'est une construction logicielle. Le processeur n'a aucune idée de ce qu'est un thread (à quelques exceptions près, certains processeurs ont des threads matériels), il exécute simplement des instructions.

Le noyau introduit le concept de thread et de processus pour gérer la mémoire et les instructions de manière significative.

3
Valentin Radu

Cela a été pris à partir d'une réponse Yahoo:

Un thread est une construction de codage non affectée par l'architecture d'une application. Un seul processus peut souvent contenir plusieurs threads. Les threads peuvent également communiquer directement entre eux car ils partagent les mêmes variables.

Les processus sont des unités d'exécution indépendantes avec leurs propres informations d'état. Ils utilisent également leurs propres espaces adresse et ne peuvent interagir avec d'autres processus que par le biais de mécanismes de communication interprocessus.

Cependant, pour résumer, les threads ressemblent à des "tâches" différentes. Alors, pensez à quand vous faites quelque chose, par exemple vous écrivez une formule sur un seul papier. Cela peut être considéré comme un fil. Ensuite, vous écrivez quelque chose d'autre sur un autre morceau de papier. C'est là qu'intervient le multitâche.

Les processeurs Intel sont censés avoir un "hyper-threading" (AMD en a aussi) et il est censé être capable d'effectuer beaucoup plus de "threads" ou de multitâches.

Je ne suis pas sûr de la logistique de la gestion d'un fil. Je me souviens avoir entendu parler du processeur qui allait et venait entre eux, mais je ne suis pas tout à fait sûr à ce sujet et j'espère que quelqu'un d'autre pourra y répondre.

3
Flipper

Thread

ici l'idée simple sur le fil

  • Un thread est un flux de séquence unique dans un processus
  • En termes simples, un fil est un processus léger
  • Chaque thread possède un compteur de programme, une pile, un ensemble de registres et un identifiant de thread
  • Chaque thread appartient à exactement un processus et aucun thread ne peut exister en dehors d'un processus
  • Les processus lourds traditionnels ont un seul thread de contrôle - un compteur de programme et une séquence d'instructions pouvant être exécutées à tout moment - Processus à un seul thread
  • Les applications multithreads comportent plusieurs threads au sein d'un processus unique , chacun ayant son propre compteur de programme, pile et jeu de registres, mais partageant le code commun, les données et certaines structures telles que les fichiers ouverts - Processus multithread
0
Malith Ileperuma