Avant d'entrer dans la comparaison, comprenons d'abord ce qu'est un fil. Les threads sont des processus légers dans le domaine des processus indépendants. Ils sont nécessaires parce que les processus sont lourds, consomment beaucoup de ressources et, plus important encore,
deux processus distincts ne peuvent pas partager un espace mémoire.
Disons que vous ouvrez un éditeur de texte. C'est un processus indépendant qui s'exécute dans la mémoire avec un emplacement adressable distinct. Vous aurez besoin de nombreuses ressources dans ce processus, comme l'insertion de graphiques, la vérification de l'orthographe, etc. Il n'est pas possible de créer des processus distincts pour chacune de ces fonctionnalités et de les maintenir indépendamment en mémoire. Pour éviter cela,
plusieurs threads peuvent être créés au sein d'un même processus, qui peuvent partager un espace mémoire commun, tout en existant indépendamment au sein d'un processus.
Maintenant, revenons à vos questions, une par une.
Je ne suis pas vraiment sûr des différences entre les threads de niveau utilisateur et de niveau noyau.
Les fils sont classés en deux grandes catégories fils de niveau utilisateur y threads au niveau du noyau en fonction de leur domaine d'exécution. Il existe également des cas où un ou plusieurs threads d'utilisateur correspondent à un ou plusieurs threads du noyau. .
- Fils de niveau utilisateur
Les threads de niveau utilisateur se situent principalement au niveau de l'application, où une application crée ces threads pour soutenir son exécution dans la mémoire principale. Sauf si cela est nécessaire, ces threads travaillent de manière isolée avec les threads du noyau.
Ceux-ci sont plus faciles à créer car ils ne doivent pas faire référence à de nombreux registres et le changement de contexte est beaucoup plus rapide qu'un thread au niveau du noyau.
Le thread au niveau de l'utilisateur peut surtout provoquer des changements au niveau de l'application et le thread au niveau du noyau continue à s'exécuter à son propre rythme.
- Threads au niveau du noyau
Ces threads sont pour la plupart indépendants des processus en cours et sont exécutés par le système d'exploitation.
Ces threads sont requis par le système d'exploitation pour des tâches telles que la gestion de la mémoire, la gestion des processus, etc.
Comme ces threads maintiennent, exécutent et signalent les processus requis par le système d'exploitation, les threads de niveau noyau sont plus coûteux à créer et à gérer et le changement de contexte de ces threads est lent.
La plupart des threads du niveau noyau ne peuvent pas être préemptés par les threads du niveau utilisateur.
MS DOS written for Intel 8088 didn't have dual mode of operation. Thus, a user level process had the ability to corrupt the entire operating system.
- Threads de niveau utilisateur mappés sur les threads du noyau
C'est peut-être la partie la plus intéressante. De nombreux threads au niveau de l'utilisateur correspondent à des threads au niveau du noyau, qui à leur tour communiquent avec le noyau.
Certaines des correspondances les plus importantes sont :
One to One
Lorsqu'un thread de niveau utilisateur ne correspond qu'à un seul thread du noyau.
avantages : chaque thread utilisateur correspond à un thread noyau. Même si l'un des threads utilisateur émet un appel système bloquant, les autres processus ne sont pas affectés.
inconvénients : chaque thread utilisateur nécessite un thread noyau pour interagir et les threads noyaux sont coûteux à créer et à gérer.
De plusieurs à un
Lorsque plusieurs threads d'utilisateur correspondent à un seul thread du noyau.
avantages : il n'est pas nécessaire d'avoir plusieurs threads de noyau puisque des threads d'utilisateur similaires peuvent être mis en correspondance avec un thread de noyau.
inconvénient : même si l'un des threads utilisateur émet un appel système bloquant, tous les autres threads utilisateur mappés à ce thread noyau sont bloqués.
De plus, un bon niveau de simultanéité ne peut pas être atteint puisque le noyau ne traite qu'un seul thread du noyau à la fois.
Beaucoup à beaucoup
Lorsque de nombreux threads utilisateurs correspondent à un nombre égal ou inférieur de threads noyau. C'est le programmeur qui décide du nombre de threads d'utilisateur et du nombre de threads de noyau. Certains des threads d'utilisateur peuvent correspondre à un seul thread de noyau.
avantages : un niveau élevé de concurrence est atteint. Le programmeur peut décider de certains threads potentiellement dangereux qui pourraient émettre un appel système bloquant et les placer dans le mapping un-à-un.
inconvénient : le nombre de threads du noyau, s'il n'est pas décidé avec précaution, peut ralentir le système.
L'autre partie de votre question :
Les threads supportés par le noyau ont accès au kerne et d'autres utilisations non disponibles pour les threads de niveau utilisateur.
Alors, les threads de niveau utilisateur sont-ils simplement des threads créés par le programmeur ? qui utilisent ensuite les threads supportés par le noyau pour effectuer des opérations qui ne pourraient pas être effectuées normalement en raison de son état ?
Partiellement correct. Presque tous les threads du noyau ont accès aux appels système et autres interruptions critiques puisque les threads du noyau sont responsables de l'exécution des processus du système d'exploitation. Les threads utilisateurs n'auront pas accès à certaines de ces fonctionnalités critiques. Par exemple, un éditeur de texte ne pourra jamais tirer sur un thread qui a la capacité de changer l'adresse physique du processus. Mais si nécessaire, un thread d'utilisateur peut se connecter au thread du noyau et émettre certains appels système qu'il ne pourrait pas faire en tant qu'entité indépendante. Le thread du noyau mettrait alors en correspondance cet appel système avec le noyau et exécuterait des actions, si cela était jugé nécessaire.