Récemment, une question a déclenché cette réflexion. Impossible de trouver une réponse ici ou via la machine Google. Fondamentalement, je suis intéressé à savoir comment l'architecture d'E / S du noyau est en couches. Par exemple, est-ce que l' kjournald
envoi est effectué pdflush
ou l'inverse? Mon hypothèse est que pdflush
(étant plus générique pour les E / S de stockage de masse) se situerait à un niveau inférieur et déclencherait les commandes SCSI / ATA / quoi que ce soit nécessaire pour réellement effectuer les écritures, et kjournald
gère les structures de données du système de fichiers de niveau supérieur avant d'écrire. Je pouvais également voir l'inverse, avec kjournald
une interface directe avec les structures de données du système de fichiers et un pdflush
réveil de temps en temps pour écrire des pages de pagecache sales sur l'appareil viakjournald
. Il est également possible que les deux n'interagissent pas du tout pour une autre raison.
Fondamentalement: j'ai besoin d'un moyen de visualiser (graphique ou juste une explication) l'architecture de base utilisée pour répartir les E / S vers le stockage de masse dans le noyau Linux.
Réponses:
Avant de discuter des détails concernant
pdflush
,kjournald, and
kswapd` , obtenons d'abord un peu de contexte sur le contexte de ce dont nous parlons exactement en termes de noyau Linux.L'architecture GNU / Linux
L'architecture de GNU / Linux peut être considérée comme 2 espaces:
Entre l' espace utilisateur et l' espace noyau se trouve la bibliothèque GNU C (
glibc
). Cela fournit l'interface d'appel système qui connecte le noyau aux applications de l'espace utilisateur.L'espace du noyau peut être subdivisé en 3 niveaux:
L'interface d'appel système, comme son nom l'indique, fournit une interface entre le
glibc
et le noyau. Le code du noyau indépendant architectural est composé des unités logiques telles que le VFS (Virtual File System) et le VMM (Virtual Memory Management). Le code dépendant de l'architecture est les composants qui sont spécifiques au processeur et à la plate-forme pour une architecture matérielle donnée.Diagramme de l'architecture GNU / Linux
Pour le reste de cet article, nous concentrerons notre attention sur les unités logiques VFS et VMM dans l'espace noyau.
Sous-systèmes du noyau GNU / Linux
Sous-système VFS
Avec un concept de haut niveau sur la structure du noyau GNU / Linux, nous pouvons approfondir un peu plus le sous-système VFS. Ce composant est responsable de fournir l'accès aux différents périphériques de stockage de blocs qui finalement se mappent vers un système de fichiers (ext3 / ext4 / etc.) Sur un périphérique physique (HDD / etc.).
Diagramme de VFS
Ce diagramme montre comment un
write()
processus d'un utilisateur traverse le VFS et se dirige finalement vers le pilote de périphérique où il est écrit sur le support de stockage physique. Ceci est le premier endroit où nous rencontronspdflush
. Il s'agit d'un démon chargé de vider les blocs de données sales et de tampon de métadonnées sur le support de stockage en arrière-plan. Le diagramme ne le montre pas mais il y a un autre démon,kjournald
qui se trouve à côtépdflush
, effectuant une tâche similaire en écrivant des blocs de journal sales sur le disque. REMARQUE: les blocs de journal sont la façon dont les systèmes de fichiers comme ext4 et JFS gardent une trace des modifications apportées au disque dans un fichier, avant que ces modifications ne se produisent.Les détails ci-dessus sont discutés plus loin dans ce document .
Aperçu des
write()
étapesPour fournir un aperçu simple des opérations du système d'E / S, nous utiliserons un exemple où la fonction
write()
est appelée par une application de l'espace utilisateur.write()
appel système.bio struct
( voir 1.4.3, «Couche de bloc» à la page 23 ) et soumet une demande d'écriture à la couche de périphérique de bloc.Sous-système VMM
Poursuivant notre plongée plus profonde, nous pouvons maintenant examiner le sous-système VMM. Ce composant est chargé de maintenir la cohérence entre la mémoire principale (RAM), le swap et le support de stockage physique. Le principal mécanisme de maintien de la cohérence est
bdflush
. Les pages de mémoire étant considérées comme sales, elles doivent être synchronisées avec les données présentes sur le support de stockage.bdflush
coordonnera avec lespdflush
démons pour synchroniser ces données avec le support de stockage.Diagramme de VMM
Échanger
Lorsque la mémoire système se raréfie ou que le délai de permutation du noyau expire, le
kswapd
démon tente de libérer des pages. Tant que le nombre de pages gratuites reste supérieurfree_pages_high
,kswapd
ne fera rien. Cependant, si le nombre de pages gratuites chute en dessous,kswapd
le processus de récupération des pages démarre. Aprèskswapd
avoir marqué les pages pour la relocalisation,bdflush
prendra soin de synchroniser toutes les modifications en suspens sur le support de stockage, via lespdflush
démons.Références et lectures complémentaires
la source