Quelle est la différence entre les threads au niveau utilisateur et les threads au niveau noyau?

33

Après avoir lu plusieurs sources, je suis encore confus au sujet des threads au niveau utilisateur et noyau.

En particulier:

Les threads peuvent exister au niveau utilisateur et au niveau du noyau

Quelle est la différence entre le niveau utilisateur et le niveau noyau?

Sheldon
la source
1
Est-ce vraiment une Comp Sci (théorie) ou juste une programmation?
Mehrdad
6
@Mehrdad, Operating Systems fait partie de l'informatique.
Kaveh le

Réponses:

28

L’un des rôles du noyau d’un système d’exploitation multitâche est la planification : déterminer quel thread d’exécution exécuter quand. Donc, un tel noyau a une notion de thread ou de processus . Un thread est un morceau de code séquentiel en cours d'exécution, qui possède sa propre pile et parfois d'autres données. Dans un contexte de système d'exploitation, les gens utilisent habituellement processus pour désigner un fil qui a son propre espace mémoire, et du fil pour signifier un fil qui partage son espace mémoire avec d' autres fils. Un processus peut avoir un ou plusieurs threads.

Certains systèmes d'exploitation, par exemple les systèmes unix plus anciens, fournissent uniquement des processus: chaque thread géré par le noyau dispose de son propre espace mémoire. D'autres systèmes d'exploitation, par exemple les systèmes unix les plus modernes, permettent aux processus de contenir plusieurs threads d'exécution: ils fournissent une notion de threads au niveau du noyau.

Il est également possible qu'un processus gère son propre thread. En multithreading coopératif , le code de chaque thread contient des instructions pour basculer vers un autre thread. Dans le multithreading préemptif , le processus demande des notifications asynchrones périodiques du noyau et réagit à ces notifications en basculant sur un autre thread. De cette manière, le multithreading est implémenté sans coopération noyau, au niveau utilisateur, dans une bibliothèque.

Un système peut offrir des threads au niveau du noyau et au niveau de l'utilisateur. c'est ce qu'on appelle le threading hybride .

Les threads au niveau utilisateur et au niveau du noyau ont chacun leurs avantages et leurs inconvénients. Le basculement entre les threads de niveau utilisateur est souvent plus rapide, car il n'est pas nécessaire de réinitialiser les protections de la mémoire pour basculer vers le planificateur intégré au noyau ni pour revenir au processus. Cela importe surtout pour les systèmes massivement concurrents qui utilisent un grand nombre de threads de courte durée, tels que certains langages de haut niveau ( Erlang en particulier) et leurs threads verts . Les threads au niveau utilisateur nécessitent moins de support du noyau, ce qui peut simplifier le noyau. Les threads au niveau du noyau permettent à un thread de s'exécuter alors qu'un autre thread du même processus est bloqué dans un appel système; les processus avec des threads au niveau utilisateur doivent veiller à ne pas bloquer les appels système, car ils bloquent tous les threads du processus. Les threads au niveau du noyau peuvent s'exécuter simultanément sur des ordinateurs multiprocesseurs, ce que ne peuvent réaliser des threads au niveau utilisateur.

Gilles, arrête de faire le mal
la source
Votre dernière ligne indique "Les threads au niveau du noyau peuvent s'exécuter simultanément sur des machines multiprocesseurs, ce que les threads au niveau utilisateur ne peuvent pas atteindre". Mais, selon le lien indiqué, ULT peut fonctionner simultanément sur stackoverflow.com/questions/14791801/… . Est-ce que je me trompe?
Garrick
Pouvez-vous s'il vous plaît vérifier mon commentaire ci-dessus?
Garrick
1
@ Garrick Plusieurs threads au niveau utilisateur peuvent s'exécuter simultanément sur différents cœurs, à condition qu'ils s'exécutent dans des threads différents au niveau du noyau. Si vous utilisez uniquement ULT, vous êtes limité à un seul processeur. Si des KLT sont disponibles, vous pouvez répartir les threads du noyau sur plusieurs processeurs et répartir votre ULT parmi les threads disponibles.
Gilles 'SO- arrête d'être méchant'
4

Considérez les threads de niveau noyau comme des " processeurs virtuels " et les threads de niveau utilisateur comme de simples threads (appelons-les comme tels pour le moment). Maintenant, pour qu'un thread soit exécuté, il doit être assigné à un processeur, n'est-ce pas? Ainsi, chaque thread est affecté à un processeur virtuel afin de pouvoir être exécuté.

Voici des faits

  • Créer un nouveau processeur virtuel est un peu coûteux. (Le noyau doit créer une entrée dans le Thread Control Block , assigner une pile, etc.)

  • La création d'un thread est assez simple comparée à la création d'un nouveau processeur virtuel. Un développeur d'application peut créer des threads à l'aide de bibliothèques de threads fournies par les langages de programmation et gérés dans l'espace utilisateur . Et différentes langues implémentent le multithreading de différentes manières.

Des modèles

  • Si les threads sont mappés sur un seul processeur virtuel, veillez à ne pas effectuer d'appels système bloquants dans l'un des threads, car les autres threads ne peuvent plus s'exécuter simultanément.

  • Cette limitation peut être surmontée si quelques processeurs virtuels supplémentaires peuvent être créés. Désormais, les threads peuvent s'exécuter simultanément (en parallèle si plusieurs processeurs réels sont présents). Un thread n'affectera pas les autres threads mappés sur d'autres processeurs virtuels.

  • Dans ce dernier modèle, un ou plusieurs threads peuvent être mappés sur des processeurs virtuels.

  • Les modèles ci-dessus sont nommés plusieurs à un, un à un et plusieurs à plusieurs respectivement.

Référence: concepts de système d'exploitation de Galvin et al. Sujet: Threads -> Modèles multithreading

Azam
la source