Os processos são gerenciados pelo kernel. O kernel não se importa como o programador aloca variáveis. Tudo o que se sabe é que certos blocos de memória pertencem ao processo. O tempo de execução C combina os recursos de gerenciamento de memória C com os recursos do kernel: variáveis automáticas entram em um bloco de memória chamado “stack” e o armazenamento dinâmico ( malloc
e amigos) entra em um bloco de memória chamado “heap”. O processo chama as chamadas do sistema, como sbrk
e mmap
para obter memória com uma granularidade de páginas MMU . Dentro desses blocos, o tempo de execução determina onde colocar variáveis automáticas e objetos alocados dinamicamente.
Quando um processo é interrompido, o kernel atualiza sua tabela de gerenciamento de memória para registrar, para cada página da MMU, que ele não está mais em uso pelo processo. Isso ocorre independentemente de como o processo ocorre, seja de sua própria violação (chamando uma chamada de sistema) ou não (morto por um sinal). As páginas que não são mais usadas por nenhum processo são marcadas como reutilizáveis.
Geralmente é uma boa higiene liberar o armazenamento alocado dinamicamente que você não está mais usando, porque você nunca sabe quando um pedaço de código pode ser reutilizado em um programa de longa duração. Mas quando um processo morre, o sistema operacional libera todos os seus recursos: memória, arquivo aberto, etc.
Os únicos recursos que o sistema operacional não limpa automaticamente são recursos projetados para ter um escopo global no sistema operacional, como arquivos temporários.