Système d'exploitation - Multi-Threading

Qu'est-ce que Thread?

Un thread est un flux d'exécution à travers le code de processus, avec son propre compteur de programme qui garde la trace de l'instruction à exécuter ensuite, des registres système qui contiennent ses variables de travail actuelles et une pile qui contient l'historique d'exécution.

Un thread partage avec ses threads pairs peu d'informations comme le segment de code, le segment de données et les fichiers ouverts. Lorsqu'un thread modifie un élément de mémoire de segment de code, tous les autres threads le voient.

Un fil est également appelé un lightweight process. Les threads fournissent un moyen d'améliorer les performances des applications grâce au parallélisme. Les threads représentent une approche logicielle pour améliorer les performances du système d'exploitation en réduisant le thread overhead équivaut à un processus classique.

Chaque thread appartient à exactement un processus et aucun thread ne peut exister en dehors d'un processus. Chaque thread représente un flux de contrôle distinct. Les threads ont été utilisés avec succès dans la mise en œuvre des serveurs réseau et du serveur Web. Ils fournissent également une base appropriée pour l'exécution parallèle d'applications sur des multiprocesseurs à mémoire partagée. La figure suivante montre le fonctionnement d'un processus monothread et multithread.

Différence entre processus et filetage

SN Processus Fil
1 Le processus est lourd ou gourmand en ressources. Le fil est léger, prenant moins de ressources qu'un processus.
2 La commutation de processus nécessite une interaction avec le système d'exploitation. La commutation de thread n'a pas besoin d'interagir avec le système d'exploitation.
3 Dans plusieurs environnements de traitement, chaque processus exécute le même code mais possède sa propre mémoire et ses propres ressources de fichiers. Tous les threads peuvent partager le même ensemble de fichiers ouverts, des processus enfants.
4 Si un processus est bloqué, aucun autre processus ne peut s'exécuter tant que le premier processus n'est pas débloqué. Pendant qu'un thread est bloqué et en attente, un deuxième thread de la même tâche peut s'exécuter.
5 Plusieurs processus sans utiliser de threads utilisent plus de ressources. Plusieurs processus threadés utilisent moins de ressources.
6 Dans plusieurs processus, chaque processus fonctionne indépendamment des autres. Un thread peut lire, écrire ou modifier les données d'un autre thread.

Avantages du fil

  • Les threads minimisent le temps de changement de contexte.
  • L'utilisation de threads fournit la concurrence au sein d'un processus.
  • Communication efficace.
  • Il est plus économique de créer et de changer de contexte.
  • Les threads permettent l'utilisation des architectures multiprocesseurs à une plus grande échelle et plus d'efficacité.

Types de fil

Les threads sont implémentés de deux manières:

  • User Level Threads - Threads gérés par l'utilisateur.

  • Kernel Level Threads - Threads gérés par le système d'exploitation agissant sur le noyau, un noyau du système d'exploitation.

Threads de niveau utilisateur

Dans ce cas, le noyau de gestion des threads n'est pas conscient de l'existence de threads. La bibliothèque de threads contient du code pour créer et détruire des threads, pour passer des messages et des données entre des threads, pour planifier l'exécution de threads et pour enregistrer et restaurer des contextes de thread. L'application démarre avec un seul thread.

Avantages

  • La commutation de thread ne nécessite pas de privilèges de mode noyau.
  • Le thread de niveau utilisateur peut s'exécuter sur n'importe quel système d'exploitation.
  • La planification peut être spécifique à l'application dans le thread de niveau utilisateur.
  • Les threads de niveau utilisateur sont rapides à créer et à gérer.

Désavantages

  • Dans un système d'exploitation classique, la plupart des appels système sont bloquants.
  • L'application multithread ne peut pas tirer parti du multitraitement.

Threads au niveau du noyau

Dans ce cas, la gestion des threads est effectuée par le noyau. Il n'y a pas de code de gestion des threads dans la zone d'application. Les threads du noyau sont pris en charge directement par le système d'exploitation. Toute application peut être programmée pour être multithread. Tous les threads d'une application sont pris en charge dans un seul processus.

Le noyau conserve les informations de contexte pour le processus dans son ensemble et pour les threads individuels au sein du processus. La planification par le noyau se fait sur une base de thread. Le noyau effectue la création, la planification et la gestion des threads dans l'espace noyau. Les threads du noyau sont généralement plus lents à créer et à gérer que les threads utilisateur.

Avantages

  • Le noyau peut planifier simultanément plusieurs threads du même processus sur plusieurs processus.
  • Si un thread d'un processus est bloqué, le noyau peut planifier un autre thread du même processus.
  • Les routines du noyau elles-mêmes peuvent être multithreads.

Désavantages

  • Les threads du noyau sont généralement plus lents à créer et à gérer que les threads utilisateur.
  • Le transfert de contrôle d'un thread à un autre au sein du même processus nécessite un changement de mode vers le noyau.

Modèles multithreading

Certains systèmes d'exploitation fournissent une fonction de thread de niveau utilisateur et de thread de niveau noyau. Solaris est un bon exemple de cette approche combinée. Dans un système combiné, plusieurs threads au sein de la même application peuvent s'exécuter en parallèle sur plusieurs processeurs et un appel système bloquant n'a pas besoin de bloquer l'ensemble du processus. Les modèles multithreading sont de trois types

  • Relation plusieurs à plusieurs.
  • Plusieurs à une relation.
  • Relation un à un.

Modèle plusieurs à plusieurs

Le modèle plusieurs-à-plusieurs multiplexe n'importe quel nombre de threads utilisateur sur un nombre égal ou inférieur de threads du noyau.

Le diagramme suivant montre le modèle de thread plusieurs à plusieurs dans lequel 6 threads de niveau utilisateur multiplexent avec 6 threads de niveau noyau. Dans ce modèle, les développeurs peuvent créer autant de threads utilisateur que nécessaire et les threads du noyau correspondants peuvent s'exécuter en parallèle sur une machine multiprocesseur. Ce modèle offre la meilleure précision sur la concurrence et lorsqu'un thread effectue un appel système bloquant, le noyau peut planifier un autre thread pour l'exécution.

Plusieurs à un modèle

Le modèle plusieurs-à-un mappe de nombreux threads de niveau utilisateur à un thread au niveau du noyau. La gestion des threads se fait dans l'espace utilisateur par la bibliothèque de threads. Lorsque le thread effectue un appel système bloquant, l'ensemble du processus est bloqué. Un seul thread peut accéder au noyau à la fois, de sorte que plusieurs threads ne peuvent pas s'exécuter en parallèle sur des multiprocesseurs.

Si les bibliothèques de threads de niveau utilisateur sont implémentées dans le système d'exploitation de telle manière que le système ne les prend pas en charge, alors les threads du noyau utilisent les modes de relation plusieurs-à-un.

Un à un modèle

Il existe une relation univoque entre le thread de niveau utilisateur et le thread de niveau noyau. Ce modèle offre plus de concurrence que le modèle plusieurs-à-un. Il permet également à un autre thread de s'exécuter lorsqu'un thread effectue un appel système bloquant. Il prend en charge plusieurs threads à exécuter en parallèle sur des microprocesseurs.

L'inconvénient de ce modèle est que la création d'un thread utilisateur nécessite le thread Kernel correspondant. OS / 2, Windows NT et Windows 2000 utilisent un modèle de relation un à un.

Différence entre le thread au niveau de l'utilisateur et au niveau du noyau

SN Threads de niveau utilisateur Filetage au niveau du noyau
1 Les threads de niveau utilisateur sont plus rapides à créer et à gérer. Les threads au niveau du noyau sont plus lents à créer et à gérer.
2 La mise en œuvre se fait par une bibliothèque de threads au niveau de l'utilisateur. Le système d'exploitation prend en charge la création de threads du noyau.
3 Le thread de niveau utilisateur est générique et peut s'exécuter sur n'importe quel système d'exploitation. Le thread au niveau du noyau est spécifique au système d'exploitation.
4 Les applications multithreads ne peuvent pas tirer parti du multitraitement. Les routines du noyau elles-mêmes peuvent être multithreads.