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 me semble que je dois rater quelque chose d’évident, mais chaque fois que je lis un fil, c’est presque une définition circulaire, a la “un fil est un fil d’exécution” ou “un moyen de se diviser en tâches”. Euh. Hein?

Il semble, d’après ce que j’ai lu, qu’un thread n’est pas vraiment quelque chose de concret, tout comme un processus. C’est en fait juste un concept. D’après ce que je comprends de la façon dont cela fonctionne, un processeur exécute des commandes pour un programme (qui a été appelé un thread d’exécution ), puis quand il doit passer au traitement pour un autre programme, il stocke l’ état de le programme en cours d’exécution pour quelque part (Thread Local Storage), puis commence à exécuter les instructions du programme. Et va et vient. 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, ce qui est vraiment quelque chose, c’est un ensemble de ressources, etc.

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

De Wikipedia :

“Un thread en informatique est l’abréviation d’un thread d’exécution. Les threads permettent à un programme de se diviser (appelé” split “) en deux ou plusieurs tâches simultanées (ou pseudo-simultanées). système d’exploitation à un autre mais, en général, un thread est contenu dans un processus et différents threads dans le même processus partagent les mêmes ressources alors que différents processus dans le 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 est également doté de sa propre stack d’appels, ce qui est assez concret.

Un thread est un ensemble indépendant de valeurs pour les registres de processeur (pour un seul cœur). Comme cela inclut le pointeur d’instruction (aka Compteur de programme), il contrôle ce qui est exécuté dans quel ordre. Il inclut également le Stack Pointer, qui devrait plutôt pointer vers une zone de mémoire unique pour chaque thread, sinon ils interféreront les uns avec les autres.

Les threads sont l’unité logicielle affectée par le stream de contrôle (appel de fonction, boucle, goto), car ces instructions opèrent sur le pointeur d’instruction et appartiennent à un thread particulier. Les threads sont souvent programmé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 de l’instruction stockée à cet emplacement est suffisante pour déterminer une nouvelle valeur pour le pointeur d’instruction. Pour la plupart des instructions, cela fait simplement avancer l’IP de la taille de l’instruction, mais les instructions de stream de contrôle changent l’adresse IP de manière prévisible. La séquence de valeurs que prend l’IP forme un chemin d’exécution dans le code du programme, d’où le nom “thread”.

Un thread est un contexte d’exécution, c’est-à-dire toutes les informations dont un processeur a besoin pour exécuter un stream d’instructions.

Supposons que vous lisiez un livre et que vous vouliez faire une pause maintenant, mais que vous vouliez pouvoir revenir et reprendre la lecture à l’endroit exact où vous vous êtes arrêté. Une façon d’y parvenir consiste à noter le numéro de page, le numéro de ligne et le numéro de mot. Donc, votre contexte d’exécution pour lire un livre est 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à où elle s’est arrêtée. Ensuite, vous pouvez le reprendre et le reprendre là où vous étiez.

Les threads fonctionnent de la même manière. Un processeur vous donne l’illusion de faire plusieurs calculs en même temps. Cela se fait en passant un peu de temps sur 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.

Last: les threads sont différents des processus. Un thread est un contexte d’exécution, tandis qu’un processus est un groupe de ressources associé à un calcul. Un processus peut avoir un ou plusieurs threads.

Clarification: les ressources associées à un processus incluent des pages de mémoire (tous les threads d’un processus ont la même vue de la mémoire), des descripteurs de fichiers (par exemple, des sockets ouverts) et des identifiants de sécurité (par exemple, l’ID de l’utilisateur qui a démarré). processus).

Les processus sont comme deux personnes utilisant deux ordinateurs différents, qui utilisent le réseau pour partager des données si nécessaire. Les threads sont comme deux personnes utilisant le même ordinateur, qui n’ont pas besoin de partager des données de manière explicite mais doivent se relayer soigneusement.

Conceptuellement, les threads ne sont que des abeilles multiples travaillant dans le même espace d’adressage. Chaque thread a sa propre stack, son propre compteur de programme, etc., mais tous les threads d’un processus partagent la même mémoire. Imaginez deux programmes exécutés en même temps, mais ils peuvent tous deux accéder aux mêmes objects.

Contrastez ceci avec des 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 object dans un autre (sauf si vous utilisez 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 simultanément”.
  • Les processus ne partagent pas la 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 stack et son propre pointeur d’instruction.

Pour définir formellement un thread, il faut d’abord comprendre les limites de fonctionnement d’un thread.

Un programme informatique devient un processus lorsqu’il est chargé depuis un magasin dans la mémoire de l’ordinateur et commence son exécution. 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 trace de la position actuelle dans le programme (instruction en cours d’exécution), registres, variables, descripteurs de fichiers, signaux, etc.

Un thread est une séquence d’instructions dans un programme qui peut être exécutée indépendamment des autres codes. La figure montre le concept: entrer la description de l'image ici

Les threads se trouvent dans le même espace d’adressage de processus. Par conséquent, la plupart des informations présentes dans la description de la mémoire du processus peuvent être partagées entre les threads.

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

La prise en charge explicite du système d’exploitation est requirejse 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.

Ici, graphiquement, le concept est représenté.

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

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

Processus

Toute application réside sur 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, telle qu’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 est appelée 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 démarrons Google Chrome, 3 processus sont générés:

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

• Les processus de rendu contiennent une logique pour le rendu des pages Web. Ainsi, ils contiennent la logique pour gérer HTML, Javascript, images, etc. En règle générale, un nouveau processus de rendu est créé pour chaque site Web ouvert dans un nouvel onglet. Par conséquent, plusieurs processus de rendu peuvent être actifs simultanément.

• Un processus de 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 à cela, je pense que vous devez d’abord savoir ce qu’est un processeur. Un processeur est le matériel qui exécute les calculs. EDIT: (Calculs comme l’ajout de deux nombres, le sorting d’un tableau, essentiellement l’exécution du code qui a été écrit)

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

Un thread est une unité de base d’utilisation du processeur ; il comprend un identifiant de thread, un compteur de programme, un ensemble de registres et une stack.

EDIT: définition d’un fil du site web intel:

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

Ainsi, si le processus Renderer de l’application Chrome sortinge un tableau de nombres, le sorting aura lieu sur un thread / thread d’exécution. (La grammaire concernant les threads me semble confuse)

Mon interprétation des choses

Un processus est une instance d’exécution. Les threads sont les travailleurs qui effectuent les calculs via l’access au processeur. 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 sur un ordinateur dépend du nombre de cœurs d’un ordinateur.

Calcul simultané :

De Wikipedia:

L’informatique concurrente est une forme de calcul dans laquelle plusieurs calculs sont exécutés pendant des périodes de chevauchement – concurremment – plutôt que séquentiellement (une exécution avant le prochain démarrage). C’est 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 distinct ou “thread of control” pour chaque calcul (“process”).

Donc, je pourrais écrire un programme qui calcule la sum de 4 chiffres:

(1 + 3) + (4 + 5) 

Dans le programme de calcul de cette sum (qui sera un processus exécuté sur un thread d’exécution), je peux générer un autre processus qui peut être exécuté sur un thread différent (4 + 5) et renvoyer le résultat au processus original. processus original calcule la sum de (1 + 3).

Malheureusement, des threads existent. Un fil est quelque chose de tangible. Vous pouvez en tuer un et les autres continueront de fonctionner. Vous pouvez générer 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 multi-core, 2 threads peuvent être exécutés en même temps.

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

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

La réponse varie énormément selon les systèmes et les implémentations, mais les éléments les plus importants sont les suivants:

  1. Un thread a un thread d’exécution indépendant (c.-à-d. Que vous pouvez changer de contexte, puis revenir en arrière et qu’il recommencera à fonctionner).
  2. Un thread a une durée de vie (il peut être créé par un autre thread et un autre thread peut attendre sa fin).
  3. Il y a probablement moins de bagages attachés qu’un “processus”.

Au-delà de cela: les threads peuvent être implémentés dans un seul processus par un runtime de langage, les threads peuvent être des coroutines, les threads peuvent être implémentés dans un seul processus par une bibliothèque de threads ou les threads peuvent être une construction de kernel.

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

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 fréquemment 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 d’adressage et ne peuvent interagir qu’avec d’autres processus via des mécanismes de communication interprocessus.

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

On dit que les processeurs Intel ont un «hyper-threading» (AMD en a aussi) et il est conçu pour pouvoir exécuter plusieurs «threads» ou multitâches bien mieux.

Je ne suis pas sûr de la logistique de la gestion d’un fil. Je me souviens d’avoir entendu parler du processeur entre les deux, mais je ne suis pas sûr à 100% et j’espère que quelqu’un d’autre pourra y répondre.

Un thread n’est rien d’autre qu’un contexte de mémoire (ou comment Tanenbaum le met mieux, regroupement de ressources) avec des règles d’exécution. C’est une construction de logiciel. Le processeur n’a aucune idée de ce qu’est un thread (quelques exceptions ici, certains processeurs ont des threads matériels), il ne fait qu’exécuter des instructions.

Le kernel introduit le concept de thread et de processus pour gérer la mémoire et l’ordre des instructions de manière significative.

Je ne suis pas vraiment satisfait de ces réponses, alors je vais append le mien ici 🙂 Un thread est une abstraction du kernel pour planifier le travail sur le processeur, un thread est ce que le kernel vous donne pour gérer le temps processeur et partager le travail avec les autres

Laissez-moi expliquer la différence entre processus et threads en premier.

Un processus peut avoir {1..N} nombre de threads. Une petite explication sur la mémoire virtuelle et le processeur virtuel.

Mémoire virtuelle

Utilisé comme espace d’échange afin qu’un processus pense qu’il est assis sur la mémoire principale pour être exécuté.

Processeur virtuel

Le même concept que la mémoire virtuelle, sauf pour le processeur. Pour un processus, il semblera que c’est la seule chose qui utilise le processeur.

OS se chargera d’allouer la mémoire virtuelle et le processeur virtuel à un processus et d’effectuer l’échange entre les processus et l’exécution.

Tous les threads d’un processus partageront la même mémoire virtuelle. Cependant, chaque thread aura son processeur virtuel individuel qui lui sera assigné afin qu’il puisse être exécuté individuellement.

Cela économise ainsi la mémoire et utilise le processeur à son potentiel.

Si vous voulez une réponse en anglais, voici ce que mon professeur m’a dit quand je lui ai demandé:

“Vous savez comment quand vous exécutez un programme Java, il exécute le programme de haut en bas? Eh bien, un thread est fondamentalement un moyen de contourner cela. Comme ouvrir deux zones de texte à la fois, ou avoir une timer en même temps comme un tas d’autres choses. ”

Je jure que c’est presque exactement ce qu’il a dit.