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:

bash
free -h
df -h

free -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çãoOnde olhar
O servidor está lento e o disco faz muito barulhofree -h e o uso de swap
Um serviço para de gravar logsdf -h, espaço livre no disco
Um processo foi encerrado sem avisoO 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.