Disons que si je tape cd
dans ma coquille. Est cd
chargé de la mémoire à ce moment? Mon intuition est que ces commandes intégrées sont préchargées dans la mémoire système après le chargement du noyau, mais quelqu'un a insisté sur le fait qu'elles ne sont chargées que lorsque j'invoque réellement la commande (appuyez sur Entrée sur un shell). Pourriez-vous s'il vous plaît me dire s'il existe une référence qui explique cela?
shell-builtin
Prévoyant
la source
la source
Réponses:
En termes généraux, les autres réponses sont correctes - les commandes intégrées sont chargées avec le shell, les commandes autonomes sont chargées lorsqu'elles sont appelées. Cependant, un «quelqu'un» de belette très collant pourrait insister sur le fait que ce n'est pas si simple.
Cette discussion porte un peu sur le fonctionnement du système d'exploitation et sur les différents systèmes d'exploitation, mais je pense qu'en général, ce qui suit est probablement vrai pour tous les * nix contemporains.
Premièrement, «chargé en mémoire» est une phrase ambiguë; ce à quoi nous faisons référence, c'est que son espace d'adressage virtuel est mappé en mémoire . Ceci est important parce que «l'espace d'adressage virtuel» fait référence à des éléments qui peuvent devoir être placés en mémoire, mais qui ne le sont en fait pas au départ: ce qui est réellement chargé en mémoire est principalement la carte elle - même - et la carte n'est pas le territoire. Le «territoire» serait l'exécutable sur disque (ou dans le cache disque) et, en fait, la plupart de ces éléments ne sont probablement pas chargés en mémoire lorsque vous appelez un exécutable.
En outre, une grande partie du «territoire» est constituée de références à d'autres territoires (bibliothèques partagées), et encore une fois, le simple fait qu'ils soient mentionnés ne signifie pas non plus qu'ils sont vraiment chargés. Ils ne sont pas chargés tant qu'ils ne sont pas réellement utilisés, et alors seuls les morceaux d'entre eux qui doivent réellement être chargés pour que «l'utilisation» réussisse.
Par exemple, voici un extrait de
top
sortie sur linux faisant référence à unebash
instance:Le VIRT de 113 Mo est l'espace d'adressage virtuel, qui est mappé en RAM. Mais RES est la quantité réelle de RAM consommée par le processus - seulement 3,7 ko. Et de cela, certains font partie du territoire partagé mentionné ci-dessus - 1,8 kB SHR. Mais mon
/bin/bash
disque est de 930 Ko, et la bibliothèque de base à laquelle il est lié (une bibliothèque partagée) est encore deux fois plus grande.Cet obus ne fait rien pour le moment. Disons que j'invoque une commande intégrée, qui, nous l'avons dit plus tôt, était déjà "chargée en mémoire" avec le reste du shell. Le noyau exécute tout le code impliqué à partir d'un point de la carte, et lorsqu'il atteint une référence à du code qui n'a pas vraiment été chargé, il le charge - à partir d'une image exécutable sur le disque - même si de manière plus décontractée sens, que l'exécutable (que ce soit le shell, un outil autonome ou une bibliothèque partagée) était déjà "chargé en mémoire".
C'est ce qu'on appelle la pagination de la demande .
la source
En attendant que l'un des poids lourds vienne et donne une perspective historique complète, je vais vous donner ma compréhension plus limitée.
Commandes intégrées comme
alias
,cd
,echo
etc font partie de votre coquille (bash
,zsh
,ksh
ou autre). Ils sont chargés en même temps que le shell et sont simplement des fonctions internes de ce shell.la source
J'ai fait l'expérience suivante pour montrer que les commandes intégrées sont en fait chargées dans le cadre de l'exectuable
bash
. C'est pourquoi ils sont appelés builtins, mais une démo est toujours le meilleur moyen de prouver quelque chose.Exemple
Démarrez un nouveau
bash
shell et notez son ID de processus (PID):Dans un deuxième terminal, exécutez la
ps
commande afin que nous puissions regarder et voir sibash
commence à prendre de la mémoire supplémentaire:La sortie ressemble à ceci:
REMARQUE: l' utilisation de la mémoire est indiquée avec les colonnes SZ et RSS ici.
Commencez à exécuter des commandes dans le shell (pid 6402):
Comme vous
cd
le remarquerez, la mémoire augmente en fait, mais ce n'est pas à cause ducd
chargement de l'exécutable en mémoire, mais plutôt parce que la structure de répertoires sur le disque est chargée en mémoire. Si vous continuezcd
dans d'autres répertoires, vous le verrez augmenter progressivement.Vous pouvez faire des tests plus élaborés comme celui-ci:
Cette commande montera un niveau puis redescendra dans le répertoire 90609 1000 fois. Lorsque vous exécutez cela si vous surveillez l'utilisation de la mémoire dans la
ps
fenêtre, vous remarquerez qu'elle ne change pas. Lors de l'exécution de quelque chose comme ça, aucune utilisation de mémoire supplémentaire ne doit être remarquée.strace
Voici un autre tell que nous avons affaire à une fonction intégrée
bash
plutôt qu'à un véritable exécutable. Lorsque vous essayez et exécutez,strace cd ..
vous obtenez le message suivant:la source
"commande intégrée" fait référence aux commandes intégrées dans le shell, plutôt que comme des programmes séparés.
ls
, par exemple, n'est en fait pas une commande intégrée mais un programme distinct. Il sera chargé dans la RAM lors de son appel, sauf s'il est déjà dans le cache disque.Un exemple de commande intégrée serait
printf
oucd
. Ceux-ci font partie de la coque et sont chargés avec le reste de la coque.Aucune commande n'est préchargée par défaut, bien que des systèmes aient été créés pour ce faire.
la source