Digamos si escribo cd
en mi shell. ¿Se cd
carga 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 kernel, pero alguien insistió en que se carguen solo cuando invoco el comando (presione enter en un shell). ¿Podría decirme si hay una referencia que explique esto?
shell-builtin
Forethinker
fuente
fuente
Respuestas:
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 unabash
instancia: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 .
fuente
Mientras espero que venga uno de los pesos pesados y brinde una perspectiva histórica completa, le daré mi comprensión más limitada.
Una función de comandos como
alias
,cd
,echo
etc, son parte de su cáscara (bash
,zsh
,ksh
o lo que sea). Se cargan al mismo tiempo que el shell es y son simplemente funciones internas de ese shell.fuente
Hice el siguiente experimento para mostrar que los comandos incorporados de hecho están cargados como parte del ejecutable
bash
. De ahí por qué se llaman builtins, pero una demostración es siempre la mejor manera de probar algo.Ejemplo
Inicie un nuevo
bash
shell y observe su ID de proceso (PID):En un segundo terminal, ejecute el
ps
comando para que podamos observar y ver sibash
comienza a ocupar memoria adicional:El resultado se ve así:
NOTA: El uso de la memoria se muestra con las columnas SZ y RSS aquí.
Comience a ejecutar comandos en el shell (pid 6402):
A medida que
cd
pase, notará que la memoria aumenta, pero esto no se debe a que el ejecutablecd
se carga en la memoria, sino porque la estructura del directorio en el disco se está cargando en la memoria. Si siguecd
ingresando en otros directorios, verá que aumenta progresivamente.Puedes hacer pruebas más elaboradas como esta:
Este comando subirá un nivel y luego regresará al directorio 90609 1000 veces. Mientras ejecuta esto, si monitorea el uso de memoria en la
ps
ventana, notará que no cambia. Mientras se ejecuta algo como esto, no se debe notar el uso de memoria adicional.strace
Aquí hay otro mensaje de que estamos tratando con una función incorporada en
bash
lugar de un ejecutable real. Cuando intente ejecutarstrace cd ..
, recibirá el siguiente mensaje:fuente
"comando incorporado" se refiere a los comandos integrados en el shell, en lugar de como programas separados.
ls
, por ejemplo, en realidad no es un comando incorporado sino un programa separado. Se cargará en la RAM cuando se invoque, a menos que ya esté en la caché del disco.Un ejemplo de un comando incorporado sería
printf
ocd
. Estos son parte del shell y se cargan junto con el resto del shell.No hay comandos cargados previamente de forma predeterminada, aunque se han creado sistemas para hacer esto.
fuente