Disons que si je tape cd dans mon shell. Le CD est-il chargé à partir 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é pour qu'elles ne soient chargées que lorsque j'invoque réellement la commande ...
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 à une bash
instance:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
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 .