web-dev-qa-db-fra.com

Quelles sont les relations entre les processus, les threads du noyau, les processus légers et les threads utilisateur à UNIX?

Unix interne by Vahalia a des chiffres montrant les relations entre processus, threads du noyau, processus légers et threads de l'utilisateur. Ce livre donne l'attention sur SVR4.2, et il explore également 4,4BSD, Solaris 2.x, Mach et UNIX numérique en détail. Notez que je ne demande pas à propos de Linux.

  1. Pour chaque processus, existe-t-il toujours un ou plusieurs processus légers sous-jacents au processus? La figure 3.4 semble dire oui.

    Pourquoi la figure 3.5 (a) montre-t-elle des processus directement sur les processeurs, sans processus légers entre les deux?

  2. Pour chaque processus léger, existe-t-il toujours exactement un fil de noyau sous-jacent au processus léger? La figure 3.4 semble dire oui.

    Pourquoi la figure 3.5 (B) montre-t-elle des procédés légers directement sur les processus, sans fil de noyau entre les deux?

  3. Les fils du noyau sont-ils les seules entités pouvant être programmées?

  4. Les processus légers ne sont-ils programmés que indirectement via la planification des threads de noyau sous-jacents?

  5. Les processus sont-ils planifiés uniquement indirectement via les processus légers sous-jacents?

Figure 3-4. Lightweight processes

Figure 3-5. User thread implementations


Mise à jour:

J'ai posé une question similaire pour Linux est un processus de poids léger attaché à un fil de noyau sous Linux? Je suppose que cela pourrait être parce que les concepts du système d'exploitation du livre introduisent les concepts implicitement à l'aide d'UNIX, et Unix et Linux Différent, alors j'ai lu sur le noyau Unix.

J'apprécie la réponse actuelle, mais j'espère rouvrir le poteau afin que je puisse accepter d'autres réponses.

12
Tim

Voir: Comprendre le noyau Linux, 3ème édition de Daniel P. Bovet, Marco Cesati

  • Éditeur: O'Reilly
  • Date du pub: novembre 2005
  • ISBN: 0-596-00565-2
  • Pages: 942

Dans leur introduction, Daniel P. Bovet, et Marco Cesati, a déclaré:

Techniquement parlant, Linux est un véritable noyau UNIX, bien qu'il ne s'agisse pas d'un système d'exploitation UNIX complète, car il n'inclut pas toutes les applications telles que les utilitaires du système de fichiers, les systèmes de fenêtres et les ordinateurs de bureau graphiques, l'administrateur système Commandes, éditeurs de texte, compilateurs, etc. Ce que vous avez lu dans ce livre et voyez dans le noyau Linux, peut donc vous aider à comprendre également les autres variantes UNIX.

Dans les paragraphes suivants, je vais essayer de répondre à vos points de vue sur ma compréhension des faits présentés dans "Comprendre le noyau Linux" qui est dans une très large mesure à ceux de UNIX.

Quel processus signifie ?:

Les processus sont comme des êtres humains, ils sont générés, ils ont une vie plus ou moins significative, ils génèrent éventuellement un ou plusieurs processus d'enfants, et éventuellement ils meurent. Un processus comporte cinq parties fondamentales: code ("Texte"), données (VM), pile, I/O et tables de signal

Le but d'un processus dans le noyau est d'agir en tant qu'entité à laquelle les ressources du système (temps processeur, mémoire, etc.) sont attribuées. Lorsqu'un processus est créé, il est presque identique à son parent. Il reçoit une copie (logique) de l'espace d'adresses du parent et exécute le même code que le parent, en commençant à l'instruction suivante suivant l'appel du système de création de processus. Bien que le parent et l'enfant puisse partager les pages contenant le code de programme (texte), ils ont des copies séparées des données (pile et tas), de sorte que les modifications de l'enfant vers un emplacement de mémoire sont invisibles pour le parent (et inversement) .

Comment fonctionnent les processus ?

Un programme d'exécution a besoin de plus que du code binaire qui raconte à l'ordinateur quoi faire. Le programme a besoin de mémoire et de diverses ressources du système d'exploitation afin de courir. Un "processus" est ce que nous appelons un programme qui a été chargé en mémoire ainsi que toutes les ressources nécessaires à l'exploitation. Un thread est l'unité d'exécution dans un processus. Un processus peut avoir n'importe où d'un seul fil à de nombreux threads. Lorsqu'un processus commence, il est attribué de la mémoire et des ressources. Chaque thread dans le processus partage la mémoire et les ressources. Dans les processus à une seule fois, le processus contient un fil. Le processus et le fil sont un et le même, et il n'y a qu'une seule chose qui se passe. Dans les processus multithreads, le processus contient plus d'un fil et le processus accomplit un certain nombre de choses en même temps.

Les mécanismes d'un système multi-traitement comprennent des processus légers et poids lourds :

Dans un processus de poids lourd, plusieurs processus fonctionnent en parallèle. Chaque processus de poids lourd en parallèle a son propre espace d'adressage de la mémoire. La communication inter-processus est lente car les processus ont des adresses de mémoire différentes. La commutation de contexte entre les processus est plus chère. Les processus ne partagent pas la mémoire avec d'autres processus. La communication entre ces processus impliquerait des mécanismes de communication supplémentaires tels que des sockets ou des tuyaux.

Dans un processus léger, également appelé threads. Les threads sont utilisés pour partager et diviser la charge de travail. Les fils utilisent la mémoire du processus qu'ils appartiennent. La communication inter-thread peut être plus rapide que la communication inter-processus, car les threads du même processus partagent la mémoire avec le processus qu'elles appartiennent. En conséquence, la communication entre les threads est très simple et efficace. La commutation de contexte entre les filets du même processus est moins chère. Les fils partagent la mémoire avec d'autres threads du même processus

Il existe deux types de threads: threads au niveau de l'utilisateur et threads au niveau du noyau. Les threads au niveau de l'utilisateur évitent le noyau et gèrent le travail seul. Les threads au niveau de l'utilisateur ont un problème qu'un seul thread peut monopoliser la tranche de temps affamée ainsi les autres threads dans la tâche. Les threads au niveau de l'utilisateur sont généralement supportés au-dessus du noyau dans l'espace utilisateur et sont gérées sans support de noyau. Le noyau ne connaît rien sur les threads au niveau de l'utilisateur et les gère comme s'il s'agissait d'un processus à filetage unique. En tant que tels, les threads de niveau utilisateur sont très rapides, il fonctionne 100 fois plus rapidement que les fils du noyau.

Les threads au niveau du noyau sont souvent implémentés dans le noyau en utilisant plusieurs tâches. Dans ce cas, le noyau planifie chaque thread dans la limite de chaque processus. Ici, étant donné que la coche de l'horloge déterminera les temps de commutation, une tâche est moins susceptible de porc la franchise de temps des autres threads de la tâche. Les threads de niveau de la noyau sont pris en charge et gérés directement par le système d'exploitation. La relation entre threads au niveau de l'utilisateur et threads au niveau du noyau n'est pas complètement indépendante, il existe en effet une interaction entre ces deux niveaux. En général, les threads au niveau de l'utilisateur peuvent être mis en œuvre à l'aide de l'un des quatre modèles: plusieurs-un à un, un à un, plusieurs-à-plusieurs et à deux niveaux. Tous ces modèles mappent des threads au niveau de l'utilisateur sur les threads au niveau du noyau et provoquent une interaction de degrés différents entre les deux niveaux.

enter image description here

threads vs. processus

  1. Le programme commence comme un fichier texte de code de programmation,
  2. Le programme est compilé ou interprété sous forme binaire,
  3. Le programme est chargé en mémoire,
  4. Le programme devient un ou plusieurs processus de fonctionnement.
  5. Les processus sont généralement indépendants les uns des autres,
  6. Tandis que les threads existent comme le sous-ensemble d'un processus.
  7. Les fils peuvent communiquer plus facilement les uns avec les autres que les processus peuvent,
  8. Mais les threads sont plus vulnérables aux problèmes causés par d'autres threads dans le même processus

Références:

Comprendre le noyau Linux, la 3ème édition

Plus 1245

.......................................................

Maintenant, simplifions toutes ces conditions ( Ce paragraphe vient de mes perspectives). Le noyau est une interface entre logiciels et matériel. En d'autres termes, le noyau agit comme un cerveau. Il manipule une relation entre le matériel génétique (c'est-à-dire des codes et de ses logiciels dérivés) et des systèmes corporels (c'est-à-dire du matériel ou des muscles).

Ce cerveau (c'est-à-dire le noyau) envoie des signaux aux processus qui agissent en conséquence. Certains de ces processus sont comme des muscles (c'est-à-dire des threads), chaque muscle a sa propre fonction et sa tâche, mais ils travaillent tous ensemble pour terminer la charge de travail. La communication entre ces threads (c'est-à-dire des muscles) est très efficace et simple, de sorte qu'ils atteignent leur travail sans heurts, rapidement et efficacement. Certains des threads (c'est-à-dire des muscles) sont sous le contrôle de l'utilisateur (comme les muscles de nos mains et de nos jambes). D'autres sont sous la lutte contre le cerveau (comme les muscles de notre estomac, des yeux, du cœur que nous ne contrôlons pas).

Les threads de l'espace utilisateur évitent le noyau et gèrent les tâches elles-mêmes. Souvent, cela s'appelle "multitâche de coopération", et c'est comme nos membres supérieurs et inférieurs, il est sous notre propre contrôle et cela fonctionne tous ensemble pour atteindre le travail (c'est-à-dire des exercices ou ...) et n'a pas besoin de commandes directes de le cerveau. De l'autre côté, les filets d'espace du noyau sont complètement contrôlés par le noyau et son planificateur.

.......................................................

Dans une réponse à vos questions :

  1. est un processus toujours mis en œuvre en fonction d'un ou de plusieurs processus de poids léger? La figure 3.4 semble dire oui. Pourquoi la figure 3.5 (a) affiche-t-elle des processus directement sur les CPU?

    Oui, il y a des processus légers appelés threads et des processus lourds.

    Un processus de poids lourd (vous pouvez appeler le processus de thread de signal informatique) nécessite le processeur lui-même de faire plus de travail pour commander son exécution, c'est pourquoi la Figure 3.5 (a) montre des processus directement sur les CPU.

  2. est un processus léger mal implémenté en fonction d'un fil de noyau? La figure 3.4 semble dire oui. Pourquoi la figure 3.5 (B) montre-t-elle des processus de poids léger directement sur les processus?

    Non, les processus légers sont divisés en deux catégories: processus de niveau utilisateur et de niveau du noyau, comme mentionné ci-dessus. Le processus de niveau utilisateur s'appuie sur sa propre bibliothèque pour traiter ses tâches. Le noyau lui-même planifie le processus au niveau du noyau. Les threads de niveau utilisateur peuvent être mis en œuvre à l'aide de l'un des quatre modélisés: nombre-à-un, un à un, plusieurs à plusieurs et à deux niveaux. Tous, ces modèles mappent des threads au niveau de l'utilisateur sur les threads au niveau du noyau.

  3. Les fils du noyau sont les seules entités pouvant être programmées?

    Non, les fils de niveau du noyau sont créés par le noyau lui-même. Ils sont différents des threads de niveau utilisateur dans le fait que les threads au niveau du noyau n'ont pas d'espace d'adressage limité. Ils vivent uniquement dans l'espace du noyau, n'allumant jamais au royaume de la terre utilisateur. Cependant, ils sont entièrement programmables et des entités préemptables, tout comme des processus normaux (note: il est possible de désactiver presque toutes les interruptions pour les actions importantes des noyaux). Le but des threads du noyau est principalement d'effectuer des tâches de maintenance sur le système. Seul le noyau peut démarrer ou arrêter un fil de noyau. De l'autre côté, le processus de niveau d'utilisateur peut planifier elle-même sur la base de sa propre bibliothèque et qu'il peut en même temps, il peut être programmé par le noyau en fonction des modèles de deux niveaux et de plusieurs à plusieurs (mentionnés ci-dessus), qui permettent Pour certains threads au niveau de l'utilisateur à lier à un seul fil au niveau du noyau.

  4. Les processus de poids légers sont programmés que indirectement via la planification des threads de noyau sous-jacents?

    Les threads du noyau sont contrôlés par le planificateur du noyau lui-même. Soutenir les threads au niveau de l'utilisateur signifie qu'il existe une bibliothèque de niveau utilisateur liée à l'application et à cette bibliothèque (et non à la CPU) fournit toute la gestion du support d'exécution pour les threads. Il prendra en charge les structures de données nécessaires pour mettre en œuvre l'abstraction de thread et fournira toute la synchronisation de planification et d'autres mécanismes nécessaires à la décision de gestion des ressources pour ces threads. Maintenant, certains des processus de thread de niveau utilisateur peuvent être mappés dans les threads de niveau du noyau sous-jacent, ce qui inclut une cartographie un à un, un à plusieurs et plusieurs à plusieurs.

  5. Les processus sont programmés uniquement indirectement via la planification des processus légers sous-jacents?

    Cela dépend de la question de savoir s'il s'agit d'un processus lourd ou léger. Lourds sont des processus programmés par le noyau lui-même. Le processus de lumière peut être géré au niveau du noyau et au niveau de l'utilisateur.

12
user88036