A função da biblioteca C free()
pode, mas não precisa, retornar a memória ao kernel.
Algumas implementações de malloc()
movem o limite entre o "heap" eo espaço de endereço não utilizado (a "quebra do sistema") por meio da chamada do sistema sbrk()
, distribuindo pedaços menores dessas grandes alocações. Sem obter todas as partes menores desalocadas, free()
não pode realmente retornar a memória para o SO.
O mesmo motivo se aplica a malloc()
implementações que não usam sbrk(2)
, mas talvez use mmap("/dev/zero")
ou algo assim. Não consigo encontrar uma referência, mas parece que me lembro de uma ou outra das O BSD usou mmap()
para obter páginas de memória. No entanto, free()
não pode retornar uma página ao sistema operacional, a menos que cada subalocação seja desalocada pelo programa.
Algumas implementações malloc()
retornam memória ao sistema: ChorusOS (?) aparentemente fez. Não está claro se mudou a quebra do sistema ou munmap()'ed
páginas.
Aqui está um artigo sobre um alocador de memória que melhora o desempenho "agressivamente desistir de páginas livres para o gerenciador de memória virtual ". Apresentação de slides para uma palestra sobre o alocador.