Digamos que se eu digitar cd no meu shell. O CD está carregado na memória naquele momento? Minha intuição é que esses comandos internos sejam pré-carregados na memória do sistema após o carregamento do kernel, mas alguém insistiu em que eles sejam carregados somente quando eu realmente chamo o comando ...
Em termos gerais, as outras respostas estão corretas - os internos são carregados com o shell, os independentes são carregados quando invocados. No entanto, um "alguém" muito exigente pode 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 acho que, em geral, o seguinte provavelmente é verdadeiro para todos os nixes * contemporâneos.
Primeiro, "carregado na memória" é uma frase ambígua; realmente o que estamos nos referindo é que 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 são inicialmente: principalmente o que é realmente carregado na memória é o próprio mapa - e o mapa não é o território. O "território" seria o executável no disco (ou no cache do disco) e, de fato, a maior parte provavelmente não está carregada na memória quando você invoca um executável.
Além disso, grande parte do "território" é referência a outros territórios (bibliotecas compartilhadas) e, novamente, apenas porque eles foram mencionados, não significa que eles também sejam realmente carregados. Eles não são carregados até que sejam realmente usados, e somente as partes deles que realmente precisam ser carregadas para que "o uso" seja bem-sucedido.
Por exemplo, aqui está um trecho de top
saída no linux referente a uma bash
instância:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
O 113 MB VIRT é o espaço de endereço virtual, mapeado na RAM. Mas RES é a quantidade real de RAM consumida pelo processo - apenas 3,7 kB. E disso, parte faz parte do território compartilhado mencionado acima - 1,8 kB SHR. Mas meu /bin/bash
disco tem 930 kB e a libc básica à qual ela se vincula (uma lib compartilhada) duas vezes maior novamente.
Esse shell não está fazendo nada no momento. Digamos que eu chame um comando interno, que dissemos anteriormente já estava "carregado na memória" junto com o restante do shell. O kernel executa qualquer código envolvido a partir de um ponto no mapa e, quando alcança uma referência ao código que realmente não foi carregado, ele o carrega - de uma imagem executável no disco - mesmo que de maneira mais casual Nesse sentido, esse executável (seja o shell, uma ferramenta independente ou uma biblioteca compartilhada) já estava "carregado na memória".
Isso é chamado de paginação por demanda .