Let's say if I type in cd in my shell. Is cd loaded from the memory at that moment? My intuition is that these built-in commands are pre-loaded to the system memory after the kernel has been loaded, but someone insisted that they are loaded only when I actually invoke the command...
Em termos gerais, as outras respostas estão corretas - os built-ins são carregados com o shell, os stand-alones são carregados quando invocados. No entanto, uma doninha muito grosseira "alguém" poderia insistir que não é assim tão simples.
Essa discussão é um pouco sobre como o sistema operacional funciona, e diferentes sistemas operacionais funcionam de maneiras diferentes, mas eu acho que, em geral, o seguinte é provavelmente verdadeiro para todos os enigmas contemporâneos.
Primeiro, "carregado na memória" é uma frase ambígua; realmente o que estamos nos referindo é tem seu espaço de endereço virtual mapeado na memória . Isso é significativo porque "espaço de endereço virtual" refere-se a coisas que podem precisar ser colocadas na memória, mas na verdade não é inicialmente: principalmente o que é realmente carregado na memória é o próprio mapa - e < strong> o mapa não é o território. O "território" seria o executável no disco (ou no cache de disco) e, na verdade, a maior parte provavelmente não é carregado na memória quando você invoca um executável.
Além disso, muito do "território" refere-se a outros territórios (bibliotecas compartilhadas) e, novamente, apenas porque eles foram mencionados não significa que eles também estejam realmente carregados. Eles não são carregados até que sejam realmente usados, e somente os pedaços deles que realmente precisam ser carregados para que qualquer "uso" seja bem sucedido.
Por exemplo, aqui está um snippet de top
output no linux referente a uma bash
instance:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
A VIRT de 113 MB é o espaço de endereço virtual, que é mapeado na RAM. Mas RES é a quantidade real de RAM consumida pelo processo - apenas 3,7 kB. E disso, parte é parte do território compartilhado mencionado acima - 1.8 kB SHR. Mas o meu /bin/bash
no disco é 930 kB, e a biblioteca básica com links para (uma biblioteca compartilhada) tem o dobro do tamanho novamente.
Esse shell não está fazendo nada agora. Digamos que eu chame um comando interno, que dissemos anteriormente que já estava "carregado na memória" junto com o restante do shell. O kernel executa qualquer código que esteja envolvido a partir de um ponto no mapa, e quando ele alcança uma referência ao código que não foi realmente carregado, ele o carrega - de uma imagem executável no disco - - mesmo que em um sentido mais casual, esse executável (seja o shell, uma ferramenta autônoma ou uma biblioteca compartilhada) já estava "carregado na memória".
Isso é chamado de demanda de paginação .