Cada postagem sobre alocação de memória parece explicar como mmap
é usado ou como sbrk
foi usado, sem levar em consideração como eles podem ser contextualizados com o heap.
Concluí que o heap desempenha um papel quase insignificante nas alocações de memória - na verdade, não tenho certeza do que ele faz: D, e peço que alguém me desconfunda.
Isto é o que eu entendo:
1) Quando a memória é maloced, o final do segmento de dados não inicializado, o BSS, é expandido. Essa expansão (que move um endereço x
para, digamos, x-n
) ocorre como resultado de uma chamada para sbrk
. Neste modelo, a memória é alocada nos n
bytes (assumindo que cada endereço está em correspondência com um byte) que sbrk
diminui a posição do cabeçalho do segmento BSS. Este modelo já está obsoleto. Alguns definem o heap como sendo o espaço que é o agregado de todas essas expansões. Outros não -- no último caso, o que o heap faz?
2) Nos esquemas modernos de alocação de memória, existe um heap (por que motivo, novamente, não tenho certeza). Para alocar memória, malloc
usa internamente mmap
para armazenar dados em regiões de memória que são uma coleção de páginas. Essas regiões de memória são independentes do heap.
TLDR:
Para sistemas antigos: Se as alocações de memória forem armazenadas no espaço de endereço obtido após aumentar o deslocamento do BSS final, um heap serve a algum propósito?
Para sistemas mais novos: Admitindo que o mmap seja usado principalmente para alocações de memória, a que propósito o heap serve?
Em ambos os casos, o heap realmente faz algo útil?