Sei que os arquivos acessados recentemente são armazenados em cache na RAM, mas há um cache para comandos frequentes?
Por exemplo, se eu executar cat file.txt
várias vezes, file.txt
ele será armazenado em cache após o primeiro comando.
- Mas se eu executar
ps aux
várias vezes, a saída do primeiro comando será armazenada em cache em algum lugar? - Cada aplicativo tem seu próprio cache para comandos frequentes; por exemplo
git log
?
Depois de ler esta pergunta relacionada , acho que o termo correto para isso é memorização .
O sistema armazenaria em cache os arquivos associados ao executável do comando e quaisquer arquivos lidos do disco quando o comando fosse executado. Execuções de comando subsequentes potencialmente se beneficiariam desse armazenamento em cache e exigiriam menos ou nenhuma operação de leitura de disco físico. Isso seria transparente para o usuário e para o próprio comando.
A saída, no entanto, não é armazenada em cache. Cada execução de comando geraria uma nova saída, mesmo que essa saída seja idêntica à da vez anterior em que o comando foi executado.
No
ps aux
exemplo,ps
investiga a lista atual de processos e saídas que listam de acordo com os argumentos fornecidos. O sistema não pode emitir uma variante em cache da saída (porque não há tal cache) para evitar a execuçãops
. Da mesma forma,git log
acessará e emitirá o log do repositório atual. O sistema não pode evitar a execução do comando nem evitar que ele leia o estado armazenado do repositório, etc.Os comandos podem se beneficiar de vários dados armazenados em cache pelos caches do sistema de arquivos, buffers etc., mas a saída seria regenerada do zero todas as vezes.
Implementar um cache genérico para saída de comando seria extremamente complicado, pois geralmente você não sabe quais alterações em um sistema invalidariam o cache. Alguns comandos exigem que os arquivos sejam alterados antes de gerar uma saída diferente, enquanto outros geram uma saída diferente devido à passagem do tempo, chance aleatória ou devido a outros eventos ocorrendo. Um comando também pode ter vários efeitos colaterais além da saída para a saída padrão, como atualizar dados de arquivo de várias maneiras, tornando o cache de saída ainda mais difícil e frequentemente inútil (porque obter a saída para o fluxo de saída padrão pode não ser o principal motivo para executar um comando).
Um comando individual pode muito bem armazenar em cache sua saída ou usar checkpointing para evitar refazer cálculos intermediários caros. Ainda assim, eles fariam isso dentro de seu domínio de problema específico (caches de compilador de vários tipos, checkpointing de simulações determinísticas em software científico, etc.), e não seria algo que o sistema operacional faria de forma transparente para eles. Em particular, o sistema operacional não seria capaz de evitar a execução desses comandos para simplesmente gerar o resultado.
O sistema operacional armazena em cache blocos de disco e inodes, mas não arquivos de fato. O cache de bloco de disco dá o efeito colateral de cache de arquivo aparente.
Não há cache de nível de sistema operacional para aplicativos. Alguns aplicativos que fazem operações caras podem ter seu próprio cache que o próprio aplicativo implementa gravando arquivos no disco.
Por exemplo, se você olhar no seu diretório home, pode haver um diretório oculto chamado
~/.cache/
que contém arquivos de cache do aplicativo. Similarmente, pode haver caches globais em/var/cache/
.No entanto, um comando como ps não precisa realmente de um cache, pois sua saída é muito dinâmica e não tão cara de gerar, então não há muito sentido em um cache. Compare isso com
atop
o que depende da contabilidade de processos para reunir informações de processos de longo prazo; ele pode coletar isso em 10 segundos ou puxá-lo do cache de contabilidade de processos.No Linux, embora o sistema operacional empregue mecanismos de cache para melhorar o desempenho — como armazenar em cache o conteúdo de arquivos na RAM para agilizar o acesso subsequente — ele não armazena em cache a saída padrão (stdout) dos comandos.
O Linux não armazena em cache a saída padrão dos comandos. Cada execução de comando gera uma nova saída com base no estado atual do sistema. Enquanto o SO armazena em cache o conteúdo dos arquivos para otimizar o acesso, e alguns aplicativos implementam suas próprias estratégias de cache, a saída padrão dos comandos permanece sem cache para garantir precisão e relevância.