Digamos se eu digitar cd
meu shell. É cd
carregado a partir da 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 (pressione enter em um shell). Você poderia me dizer se existe uma referência que explique isso?
shell-builtin
Precursor
fonte
fonte
Respostas:
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 umabash
instância: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 .
fonte
Enquanto espero que um dos pesos pesados venha e dê uma perspectiva histórica completa, darei a você meu entendimento mais limitado.
Built-in comandos como
alias
,cd
,echo
etc fazem parte de seu escudo (bash
,zsh
,ksh
ou qualquer outro). Eles são carregados ao mesmo tempo em que o shell é e são simplesmente funções internas desse shell.fonte
Fiz o experimento a seguir para mostrar que os comandos internos são, de fato, carregados como parte do executável
bash
. Por isso, são chamados de builtins, mas uma demonstração é sempre a melhor maneira de provar alguma coisa.Exemplo
Inicie um novo
bash
shell e observe seu ID do processo (PID):Em um segundo terminal, execute o
ps
comando para que possamos observar e ver sebash
começa a ocupar mais memória:A saída é assim:
NOTA: O uso da memória é mostrado nas colunas SZ e RSS aqui.
Comece a executar comandos no shell (pid 6402):
Enquanto você
cd
observa, a memória realmente aumenta, mas isso não ocorre devido aocd
carregamento do executável na memória, mas porque a estrutura de diretórios no disco está sendo carregada na memória. Se você continuarcd
em outros diretórios, verá que ele continua aumentando gradualmente.Você pode fazer testes mais elaborados como este:
Este comando aumentará o nível de um cd e depois voltará para o diretório 90609 1000 vezes. Ao executar isso, se você monitorar o uso de memória na
ps
janela, notará que ele não muda. Ao executar algo parecido com isto, nenhum uso adicional de memória deve ser observado.traço
Aqui está outro aviso de que estamos lidando com uma função interna em
bash
vez de um executável real. Ao tentar executar,strace cd ..
você receberá a seguinte mensagem:fonte
"comando embutido" refere-se a comandos embutidos no shell, e não como programas separados.
ls
, por exemplo, na verdade não é um comando interno, mas um programa separado. Ele será carregado na RAM quando for chamado, a menos que já esteja no cache do disco.Um exemplo de um comando interno seria
printf
oucd
. Eles fazem parte do shell e são carregados junto com o restante do shell.Nenhum comando é pré-carregado por padrão, embora os sistemas tenham sido criados para fazer isso.
fonte