Quelle est la différence entre un thread et une fibre ? J’ai entendu parler de fibres Ruby et j’ai lu entendu qu’elles soient accessibles dans d’autres langues, pourrait quelqu'un m’expliquer en termes simples ce qu’est la différence entre un thread et une fibre.
Réponses
Trop de publicités?Dans les termes les plus simples, les threads sont généralement considérés comme de préemption (même si cela peut ne pas être toujours le cas, selon le système d'exploitation) tandis que les fibres sont considérées à la lumière-poids, d'une coopérative de threads. Les deux sont séparés de chemins d'exécution de votre application.
Avec les threads: l'exécution en cours de chemin d'accès peut être interrompu ou retardé à tout moment (note: cette instruction est une généralisation et ne peut pas toujours vrai selon les OS/filetage package/etc.). Cela signifie que pour les threads, l'intégrité des données est un gros problème parce que l'un thread peut être arrêté au milieu de la mise à jour d'un bloc de données, en laissant l'intégrité des données dans une mauvaise ou incomplète de l'état. Cela signifie également que le système d'exploitation peut tirer parti de plusieurs Processeurs ou cœurs par l'exécution de plusieurs threads en même temps et laisser le développeur de garde d'accès aux données.
Avec les fibres: le chemin d'exécution est interrompue lorsque la fibre rendements de l'exécution (même remarque que ci-dessus). Cela signifie que les fibres de toujours démarrer et arrêter dans des endroits bien définis, de sorte que l'intégrité des données est beaucoup moins un problème. Aussi, parce que les fibres sont souvent gérés dans l'espace utilisateur, cher changements de contexte et CPU changements d'état n'a pas besoin d'être apportées, en faisant de changer de fibre pour la prochaine extrêmement efficace. D'autre part, puisque aucune des deux fibres peuvent exécuter exactement au même moment, en utilisant seulement les fibres seront les seuls à ne pas profiter de plusieurs Processeurs ou plusieurs cœurs de PROCESSEUR.
Fils d'utilisation de préemption de la planification, tandis que les fibres utilisation coopérative de la planification.
Avec un fil, le contrôle de flux peut être interrompue à tout moment, et qu'un autre thread puisse prendre le dessus. Avec plusieurs processeurs, vous pouvez avoir plusieurs threads en cours en même temps (simultaneous multithreading, ou SMT). Comme un résultat, vous devez être très prudent sur simultanées d'accès aux données, et de protéger vos données avec des mutex, sémaphores, les variables de condition, et ainsi de suite. Il est souvent très difficile d'obtenir le droit.
Avec une fibre, un contrôle seulement des interrupteurs lorsque vous lui dites, généralement avec un appel de fonction dont le nom ressemble yield()
. Cela rend les données en simultané accès plus facile, puisque vous n'avez pas à vous soucier de l'atomicité des structures de données ou les mutex. Tant que vous n'avez pas le rendement, il n'y a aucun risque d'être éliminé, et d'avoir un autre fibre d'essayer de lire ou de modifier les données que vous travaillez avec. En conséquence, si, si votre fibre arrive dans une boucle infinie, aucune autre fibre peut exécuter, puisque vous n'êtes pas céder.
Vous pouvez également mélanger les fils et les fibres, ce qui donne lieu à des problèmes rencontrés par les deux. N'est pas recommandé, mais il peut parfois être la bonne chose à faire si c'est fait avec soin.
Dans Win32, une fibre est une sorte de géré par l'utilisateur de fil. Fibre a sa propre pile et son propre pointeur d'instruction, etc., mais les fibres ne sont pas prévues par le système d'exploitation: vous appelez l'SwitchToFiber explicitement. Les Threads sont, en revanche, de manière préventive prévue par le système d'exploitation. Donc grosso modo une fibre optique est un fil qui est géré au niveau de l'application/exécution, plutôt que d'être un vrai système d'exploitation fil.
Les conséquences sont que les fibres sont moins chers et que l'application a plus de contrôle sur la planification. Cela peut être important si l'application crée un grand nombre de tâches simultanées, et/ou veut en étroite collaboration optimiser lorsqu'ils s'exécutent. Par exemple, un serveur de base de données peut choisir d'utiliser des fibres plutôt que de threads.
(Il peut y avoir d'autres usages pour la même durée, comme indiqué, c'est le Win32 définition.)
Je souhaite tout d'abord vous recommandons la lecture de cette explication de la différence entre les processus et les threads comme arrière-plan.
Une fois que vous avez lu que c'est assez simple. Threads peut être mis en œuvre, soit dans le noyau, dans l'espace utilisateur, ou les deux peuvent être mélangés. Les fibres sont essentiellement des threads mis en œuvre dans l'espace utilisateur.
- Ce qui est généralement appelé un thread un thread d'exécution mis en œuvre dans le noyau: ce qui est connu comme un thread du noyau. La planification d'un thread du noyau est exclusivement géré par le noyau, même si un thread du noyau peut volontairement communiqué de la CPU par le sommeil si elle veut. Un thread du noyau a l'avantage qu'il peut utiliser le blocage des I/O et de laisser le noyau de vous soucier de la planification. Son principal inconvénient est que le fil de commutation est relativement lente car elle nécessite de piégeage dans le noyau.
- Les fibres sont de l'utilisateur de l'espace de threads dont la programmation est gérée dans l'espace utilisateur par un ou plusieurs threads du noyau sous un seul et même processus. Cela fait de fibres de commutation très rapide. Si vous regroupez toutes les fibres de l'accès à un ensemble particulier de données partagée dans le contexte d'un seul thread du noyau et de la ont leur de la planification gérée par un seul thread du noyau, vous pouvez éliminer les problèmes de synchronisation depuis les fibres se lancer efficacement dans la série et que vous avez le contrôle complet sur leur programmation. Groupement liés à de fibres sous un seul thread du noyau est important, puisque le thread du noyau, ils sont en cours d'exécution peut être remplacée par le noyau. Ce point n'est pas clair dans beaucoup d'autres réponses. Aussi, si vous utilisez blocage I/O dans une fibre, l'ensemble de threads du noyau c'est une partie de blocs, y compris toutes les fibres qui font partie du noyau de filetage.
Dans la rubrique 11.4, "les Processus et les Threads dans Windows Vista de Systèmes d'Exploitation Modernes, Tanenbaum commentaires:
Bien que les fibres sont en coopération prévue, s'il y a plusieurs fils d'ordonnancement de la de fibres, de beaucoup d'attention de la synchronisation nécessaire pour s'assurer que les fibres ne pas interférer les uns avec les autres. Pour simplifier l'interaction entre les threads et des fibres, il est souvent utile pour créer autant de threads qu'il y a de processeurs pour exécuter eux, et affiner les threads pour chaque exécute uniquement sur un ensemble distinct de les processeurs disponibles, ou même d'un seul processeur. Chaque thread peut ensuite, exécutez un sous-ensemble particulier des fibres, d'établir un en relation avec plusieurs threads et des fibres, ce qui simplifie la synchronisation. Même si il y a encore beaucoup de difficultés avec les fibres. La plupart Win32 bibliothèques sont complètement inconscients de fibres, et les applications qui tentent d'utiliser des fibres comme si elles étaient des threads la rencontre de divers échecs. Le noyau n'a pas connaissance de fibres, et quand une fibre entre dans le noyau, le thread qu'il est en cours d'exécution sur mai le bloc et le noyau calendrier de l'arbitraire d'un thread sur le processeur, le rendant indisponible pour exécuter d'autres fibres. Pour ces raisons fibres sont rarement utilisé, sauf en cas de portage de code à partir d'autres les systèmes explicitement besoin de la fonctionnalité fournie par des fibres.
Notez qu'en plus des Fils et des Fibres, Windows 7 introduit par l'Utilisateur en Mode de Planification:
L'utilisateur de planification de mode (UMS) est un mécanisme léger que les applications peuvent utiliser pour planifier leurs propre fils. Une application peut changer entre UMS threads en mode utilisateur sans utiliser le planificateur système et de reprendre le contrôle du processeur si une UMS thread se bloque dans le noyau. UMS fils diffèrent de fibres qui chaque UMS thread a son propre thread contexte au lieu de partager le thread contexte d'un seul thread. L' possibilité de basculer entre les threads l'utilisateur, le mode UMS plus efficace que les pools de threads pour gérer de gros nombre de courte durée, des éléments de travail qui nécessitent quelques appels système.
Plus d'informations sur les fils, fibres et UMS est disponible en regardant Dave Probert: à l'Intérieur de Windows 7 en Mode Utilisateur Planificateur (UMS).