Digamos si escribo cd en mi shell. ¿Se carga el cd desde la memoria en ese momento? Mi intuición es que estos comandos incorporados se cargan previamente en la memoria del sistema después de que se haya cargado el núcleo, pero alguien insistió en que se carguen solo cuando invoco el comando ...
En términos generales, las otras respuestas son correctas: los incorporados se cargan con el shell, los independientes se cargan cuando se invocan. Sin embargo, un "alguien" muy comadrejo podría decir que no es tan simple.
Esta discusión es algo acerca de cómo funciona el sistema operativo, y los diferentes sistemas operativos funcionan de diferentes maneras, pero creo que, en general, lo siguiente es probablemente cierto para todos los * * * * * * * * * * * * * * *
Primero, "cargado en la memoria" es una frase ambigua; En realidad, a lo que nos referimos es a su espacio de direcciones virtuales mapeado en la memoria . Esto es significativo porque el "espacio de direcciones virtuales" se refiere a cosas que pueden necesitar colocarse en la memoria, pero de hecho no lo es inicialmente: principalmente lo que realmente se carga en la memoria es el mapa en sí , y el mapa no es el territorio. El "territorio" sería el ejecutable en el disco (o en la caché del disco) y, de hecho, la mayor parte de eso probablemente no se carga en la memoria cuando invoca un ejecutable.
Además, gran parte de "el territorio" son referencias a otros territorios (bibliotecas compartidas), y nuevamente, el hecho de que se haya hecho referencia a ellas tampoco significa que estén realmente cargadas. No se cargan hasta que se usan realmente, y luego solo las piezas que realmente necesitan cargarse para que cualquier "uso" tenga éxito.
Por ejemplo, aquí hay un fragmento de top
salida en Linux que se refiere a una bash
instancia:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
El 113 MB VIRT es el espacio de dirección virtual, que se asigna en la RAM. Pero RES es la cantidad real de RAM consumida por el proceso, solo 3.7 kB. Y de eso, parte es parte del territorio compartido mencionado anteriormente: 1.8 kB SHR. Pero mi /bin/bash
disco es de 930 kB, y la biblioteca básica a la que se vincula (una biblioteca compartida) es dos veces más grande.
Ese caparazón no está haciendo nada en este momento. Digamos que invoco un comando incorporado, que dijimos anteriormente ya estaba "cargado en la memoria" junto con el resto del shell. El kernel ejecuta cualquier código que esté involucrado comenzando en un punto del mapa, y cuando alcanza una referencia al código que realmente no se ha cargado, lo carga, desde una imagen ejecutable en el disco , aunque sea de forma más informal. En este sentido, ese ejecutable (ya sea el shell, una herramienta independiente o una biblioteca compartida) ya estaba "cargado en la memoria".
Esto se llama paginación de demanda .