O caso
A memória acabou no meio do pedido. E o kernel escolheu quem morria.
O servidor da loja do Isaac tinha 8 GB de RAM. Numa sexta-feira, um relatório consumiu quase tudo, e o sistema de pedidos começou a ficar lento. Em poucos minutos, o processo do banco de dados foi encerrado, e os pedidos em andamento pararam.
Quem decidiu isso foi o kernel, e não o programa do relatório.
Este post parte de Kernel e de Processos e Threads: o kernel é quem gerencia a memória e os arquivos que esses processos usam.
O problema
Memória e disco são finitos
Cada programa precisa de memória para guardar o que está fazendo, e vários rodam ao mesmo tempo. A RAM é rápida, mas pequena. O disco é grande, mas lento. E os arquivos, que ficam no disco, precisam de nomes, permissões e uma forma de achar cada pedaço depois.
Sem uma camada que organize essas coisas, um programa poderia ler a memória de outro, ou sobrescrever o arquivo de um colega.
A solução
Memória virtual
Com a memória virtual, cada processo enxerga um espaço de endereços só dele, como se tivesse a memória toda para si. O kernel traduz esses endereços para a memória física (a RAM) por meio de uma tabela de páginas. Cada página tem um tamanho fixo, em geral 4 KB.
Por causa dessa tradução, dois processos podem usar o mesmo endereço virtual, e ainda assim cada um acessa a sua própria área da RAM. Um processo que tenta ler a memória de outro é bloqueado pelo kernel.
Isolamento
Cada processo vê só o seu espaço de endereços.
Na loja: o relatório não consegue ler a memória do sistema de pedidos.
Memória maior que a RAM
Páginas que não estão em uso podem ir para o disco, e voltam quando forem necessárias.
Na loja: o servidor roda mais processos do que cabe na RAM, mais devagar.
Compartilhamento
Quando dois processos usam o mesmo código, o kernel pode guardar uma cópia só na RAM.
Na loja: várias instâncias do mesmo programa dividem o código.
Por dentro
Páginas e falta de página
Quando um programa acessa uma página que não está na RAM, acontece uma falta de página (page fault). O kernel pausa o processo, busca a página no disco e retoma a execução. Isso acontece sem o programa perceber, e leva tempo.
Se o sistema passa o tempo todo trocando páginas entre a RAM e o disco, e quase não executa trabalho útil, temos o thrashing: o computador fica ocupado só em mover memória.
Não confunda
RAM × swap
A RAM é a memória física, rápida, onde os processos realmente rodam. O swap é uma área do disco usada como extensão da memória quando a RAM acaba. Ele evita que o sistema pare de vez, mas é muito mais lento.
RAM (memória física)
“O dado precisa ser acessado agora, o mais rápido possível?”
- Exemplo
- As páginas do banco de dados que estão sendo consultadas.
- Foco
- Rápida e limitada. É onde o processo executa.
Swap (área de troca)
“A RAM acabou, e o sistema precisa manter o processo vivo?”
- Exemplo
- Páginas de um relatório que ficou parado durante a noite.
- Foco
- Lenta, mas maior. Evita a falha total, à custa de desempenho.
Armazenamento
Sistemas de arquivos
Um sistema de arquivos (file system) é a forma como o kernel organiza o disco em arquivos e diretórios. Ele responde a três perguntas: onde está cada pedaço do arquivo, quem pode ler ou escrever, e o que fazer depois de uma queda de energia.
- Inode: a ficha de um arquivo. Guarda o tamanho, as permissões, as datas e onde estão os blocos do conteúdo. O nome do arquivo não fica no inode.
- Diretório: uma tabela que liga nomes a inodes. Por isso, renomear um arquivo não mexe no conteúdo.
- Permissões: quem é dono e quem pode ler, escrever ou executar. O kernel verifica essa regra em cada acesso.
- Journaling: antes de mudar o disco, o sistema registra a intenção num diário. Se a energia cai no meio, ele completa ou desfaz a operação na volta, sem deixar o disco inconsistente.
Linux usa, por exemplo, ext4. O Windows usa NTFS, e o macOS usa APFS. Os nomes mudam, a ideia é a mesma.
Na prática
Olhar a memória e o disco
No Linux, dois comandos mostram o estado do sistema:
free -h
df -hfree -h mostra a RAM e o swap em uso. df -h mostra o espaço ocupado em cada sistema de arquivos. Se o disco enche, muitos serviços param de gravar, mesmo com memória sobrando.
| Situação | Onde olhar |
|---|---|
| O servidor está lento e o disco faz muito barulho | free -h e o uso de swap |
| Um serviço para de gravar logs | df -h, espaço livre no disco |
| Um processo foi encerrado sem aviso | O log do kernel, que registra o motivo |
Termos-chave
Seis termos para fixar
Toque no cartão para ver a definição.
Teste rápido
Três perguntas, estilo prova
01
Dois processos usam o mesmo endereço virtual. Por que um não lê os dados do outro?
02
Um programa acessa uma página que não está na RAM. O que o kernel faz?
03
Um arquivo foi renomeado. O que mudou no disco?
Memória virtual e sistemas de arquivos são as duas caras da mesma tarefa do kernel: dar a cada programa um espaço seguro, e organizar o disco para que ele possa ser usado sem conflito. Quando a memória acaba, o kernel decide quem fica. Quando a energia cai, o journaling decide o que sobrevive. Esse conjunto é o que sustenta um banco de dados como o da loja do Isaac.