De l'architecture du noyau Linux de Mauerer,
Les threads du noyau sont des processus démarrés directement par le noyau lui-même. Ils délèguent une fonction du noyau à un processus distinct et l'exécutent là en «parallèle» aux autres processus du système (et, en fait, en parallèle à l'exécution du noyau lui-même). Les threads du noyau sont souvent appelés démons (du noyau) . Ils sont utilisés pour effectuer, par exemple, les tâches suivantes:
- Pour synchroniser périodiquement les pages de mémoire modifiées avec le périphérique de bloc d'où les pages proviennent (par exemple, les fichiers mappés à l'aide de mmap).
- Pour écrire des pages mémoire dans la zone de swap si elles sont rarement utilisées.
- Pour gérer les actions différées.
- Pour implémenter des journaux de transactions pour les systèmes de fichiers.
Fondamentalement, il existe deux types de threads du noyau:
- Type 1 - Le thread est démarré et attend jusqu'à ce que le noyau lui demande d'effectuer une action spécifique.
- Type 2 - Une fois démarré, le thread s'exécute à intervalles réguliers, vérifie l'utilisation d'une ressource spécifique et prend des mesures lorsque l'utilisation dépasse ou tombe en dessous d'une valeur limite définie. Le noyau utilise ce type de thread pour les tâches de surveillance continue.
Comme le livre de Mauerer dit que les threads du noyau sont des processus, je pense qu'ils doivent fonctionner en mode utilisateur, au lieu du mode noyau. (ou je me trompe? Un processus peut-il s'exécuter en mode utilisateur ou en mode noyau à des moments différents, ou dans un seul mode?)
Mais Bovet's Understanding Linux Kernel dit que les threads du noyau ne fonctionnent qu'en mode noyau (voir la citation ci-dessous). Les concepts de «fil du noyau» dans les deux livres sont-ils le même concept?
Les systèmes Unix traditionnels délèguent certaines tâches critiques à des processus exécutés par intermittence, notamment le vidage des caches de disque, l'échange de pages inutilisées, la maintenance des connexions réseau, etc. En effet, il n'est pas efficace d'effectuer ces tâches de manière strictement linéaire; leurs fonctions et les processus de l'utilisateur final obtiennent une meilleure réponse s'ils sont planifiés en arrière-plan. Étant donné que certains des processus système s'exécutent uniquement en mode noyau, les systèmes d'exploitation modernes délèguent leurs fonctions aux threads du noyau , qui ne sont pas encombrés par le contexte inutile du mode utilisateur. Sous Linux, les threads du noyau diffèrent des processus normaux des manières suivantes:
- Les threads du noyau s'exécutent uniquement en mode noyau, tandis que les processus réguliers s'exécutent alternativement en mode noyau et en mode utilisateur.
- Étant donné que les threads du noyau s'exécutent uniquement en mode noyau, ils utilisent uniquement des adresses linéaires supérieures à PAGE_OFFSET. Les processus normaux, en revanche, utilisent les quatre gigaoctets d'adresses linéaires, en mode utilisateur ou en mode noyau.
Le livre de Mauerer dit que les threads du noyau sont démarrés directement par le noyau, et il semble également dire que les démons sont des synonymes des threads du noyau. Je pense donc que les démons doivent être démarrés directement par le noyau.
Mais https://unix.stackexchange.com/a/193918/674 dit que
screen
le démon de est démarré parscreen
l'interface utilisateur (voir la citation ci-dessous). Je pense quescreen
l'interface utilisateur est un processus, au lieu du noyau. Les concepts dudaemon
livre de Mauerer et de la réponse liée sont-ils le même concept?Lorsque vous démarrez pour la première fois
screen
, vous démarrez en fait une interface utilisateur (ui), qui par défaut créera un démon (le gestionnaire de session).En général, comment comprenez-vous les concepts de "threads du noyau", "processus" et "démon", leurs relations et leurs différences?
Réponses:
Premièrement: le crédit va /programming/15983872/difference-between-user-level-and-kernel-supported-threads
Les threads utilisateur et les threads du noyau sont exactement les mêmes. (Vous pouvez voir en regardant dans / proc / et voir que les threads du noyau sont là aussi.)
Un thread utilisateur est celui qui exécute le code de l'espace utilisateur. Mais il peut appeler à tout moment dans l'espace du noyau. Il est toujours considéré comme un thread "utilisateur", même s'il exécute du code noyau à des niveaux de sécurité élevés.
Un thread noyau est un thread qui exécute uniquement du code noyau et n'est pas associé à un processus d'espace utilisateur. Ce sont comme des "démons UNIX", sauf qu'il s'agit de démons uniquement noyau. On pourrait donc dire que le noyau est un programme multi-thread. Par exemple, il existe un thread de noyau pour l'échange. Cela force tous les problèmes de swap à être "sérialisés" en un seul flux.
Si un thread utilisateur a besoin de quelque chose, il appellera le noyau, qui marque ce thread comme étant en veille. Plus tard, le thread d'échange trouve les données, il marque donc le thread utilisateur comme exécutable. Plus tard encore, le «thread utilisateur» retourne du noyau dans l'espace utilisateur comme si de rien n'était.
En fait, tous les threads démarrent dans l'espace noyau, car l'opération clone () se produit dans l'espace noyau. (Et il y a beaucoup de comptabilité du noyau à faire avant de pouvoir «revenir» à un nouveau processus dans l'espace utilisateur.)
la source