Como a memória armazenada em cache funciona para executáveis?

3

Eu sempre entendi a memória em cache no Linux (como em free -m) como páginas de memória que podem ser reutilizadas se forem necessárias novamente, ou rapidamente liberadas se mais memória for necessária por novos aplicativos (encontrei este artigo pode ser útil há alguns anos atrás.

Parece que os executáveis (por exemplo, um programa como o thunderbird) e os dados (por exemplo, o conteúdo de um arquivo de log) podem ser armazenados em cache. Na verdade, não acho que haja distinção entre texto e arquivos executáveis no * nix.

Posso ver como isso pode funcionar para dados que não mudam muito (por exemplo, um arquivo de texto), mas como funciona para programas que são dinâmicos por natureza? Certamente, a memória em cache não pode restaurar objetos que foram alocados dinamicamente? É apenas o bytecode (ou instruções no caso de scripts) que é armazenado em cache?

EDIT 1

Por memória cache, quero dizer a memória sob a coluna "em cache" quando eu corro "free":

$ free -m
             total       used       free     shared    buffers     cached
Mem:          7985       6650       1334          0        150       3201
-/+ buffers/cache:       3298       4686
Swap:        13178          2      13176

EDIT 2

Obrigado a ls-lrt, que me deu a dica que eu estava perdendo. Como esta resposta no SE claramente menciona (deveria ter procurado lá primeiro), " A memória em cache é o cache de disco usado pelo VFS ". Isso significa que, para executáveis, apenas as instruções (bytecode, linhas de script, etc.) são representadas nessa coluna e não tem nada a ver com itens que são alocados dinamicamente. Fiquei com a impressão de que páginas inteiras de memória (incluindo objetos criados dinamicamente) foram "armazenadas em cache".

EDIT 3

Exemplos interessantes sobre o uso do cache de disco .

    
por Barthelemy 15.10.2010 / 15:49

2 respostas

3

O cache mostrado gratuitamente é o cache do sistema de arquivos. No nível do sistema de arquivos, tudo é apenas octetos de dados. Seja dados de aplicativos ou arquivos, nenhuma diferença nesse nível . Embora seja possível recarregar um executável que tenha sido excluído do cache de arquivos (executáveis não gravados no arquivo de troca, eles são simplesmente retirados da memória), isso seria raro porque o cache de arquivos é geralmente sacrificado primeiro.

Agora, seja claro sobre a distinção entre o cache de arquivos, como mostrado por livre e qualquer outro tipo de memória que pode estar envolvido por um programa em execução. Pois não está claro o que você quer dizer com "a memória em cache não pode restaurar objetos que foram alocados dinamicamente". Qualquer memória em uso pelo aplicativo não está envolvida com o cache de arquivos. Nenhuma alocação de memória de qualquer tipo por um aplicativo é armazenada em cache pelo cache de arquivos. O cache de arquivos é apenas um intermediário entre o disco e o SO.

Para responder a pergunta: "É apenas o bytecode (ou instruções no caso de scripts) que é armazenado em cache?"

O cache de arquivos armazena apenas os octetos no disco. Não importa qual memória é usada pelo aplicativo.

    
por 15.10.2010 / 17:19
1

Não há basicamente nenhuma diferença na forma como o kernel Linux trata vários tipos de dados na memória: a parte do kernel que se preocupa com isso é chamada de "subsistema de memória virtual", e só importa se uma certa porção de memória está em uso por um programa ou não.

O kernel do Linux particiona a RAM disponível em pequenos trechos chamados "páginas". Em seguida, classifica as páginas em "em uso" (por exemplo: páginas que contêm código ou dados para um programa em execução no momento) e páginas "não usadas". Para as páginas "em uso", não importa se elas contêm código executável, dados de texto, bytecode Java ou qualquer outra coisa - a única coisa que importa é que eles estão "em uso": eles precisam estar na RAM porque esses dados está sendo acessado constantemente.

Como a RAM é o dispositivo de armazenamento mais rápido disponível, é um desperdício deixar as páginas "não usadas" inativas, de modo que o kernel "recicla" páginas não utilizadas para armazenar em cache os dados que foram buscados no disco e podem ser necessários novamente em breve. O kernel tem alguns algoritmos para fazer essa previsão; O desempenho do sistema de E / S depende em grande parte de quão bons são os algoritmos que podem prever a carga de trabalho real do seu computador.

Além disso, para acelerar as operações de E / S, parte da RAM será usada para armazenar em buffer os dados que estão sendo gravados no disco: você deve ter notado que, quando copia um arquivo grande para um disco lento (por exemplo, , um pen drive USB), o comando cp é concluído antes que os dados sejam gravados no dispositivo: isso acontece precisamente porque o kernel está mantendo alguns dados na memória "livre" para acelerar a operação de gravação (lenta); os dados serão gravados no disco alguns segundos depois, quando o programa cp tiver possivelmente terminado. Assim que os dados forem gravados no disco, essas páginas serão novamente consideradas livres (e reutilizadas para armazenamento em cache de dados ou movidas para o pool "em uso", se necessário).

Como você apontou, as páginas "armazenadas em cache" podem ser (relativamente) rapidamente recuperadas pelo kernel, caso haja a necessidade de alocar mais páginas para dados "em uso", já que as páginas "cache" estão apenas segurando dados que estão disponíveis no disco (os dados armazenados em cache serão buscados no disco novamente quando solicitado).

Leitura adicional:

por 15.10.2010 / 17:18

Tags