Pergunta

Duplicatas possíveis:
Como é heap e pilha memórias mananged, implementada, alocado?
Pilha, estático e Heap em C ++

Em C / C ++ podemos armazenar variáveis, funções, funções de membro, instâncias de uma classe ou em uma pilha ou uma pilha.

Como é cada implementado? Como é gerido (nível alto)? Faz pré-aloca gcc um bloco de memória a ser usado para a pilha e montão, e, em seguida, distribui a pedido? É memória original vindo de RAM?

Pode uma função de ser alocado no heap em vez de uma pilha?

             --Clarification--

Eu estou realmente perguntando sobre a implementação e gestão de heap e pilha memórias. Depois de ler pergunta referenciada, eu não encontrar nada que endereços que .. . obrigado pelo link

Foi útil?

Solução

Eu acho que a sua pergunta pode-se facilmente escrever pelo menos alguns capítulos para o livro em sistemas operacionais. Eu sugiro que você leia Tanenbaum:. Sistemas operacionais modernos

Principal diferença de pilha e pilha, que é por item processo, o outro por item rosca. Inicialmente quando o programa é iniciado torna-se alguns montão mínimo e algum segmento de pilha. Heap é cultivado, pilha é estático (para cada segmento). Se você escrever uma função recursiva que não ponha termo (recursão infinita) você vai ter estouro de pilha;) Qualquer chamada de função tem um quadro de pilha no segmento de pilha, quando as folhas de função, a pilha é desenrolado e quadro é livre para ser utilizado pelo próxima função. Pilha é uma estrutura linear contínuo. No Linux, você pode configurar o tamanho do segmento de pilha para um processo através de uma variável de ambiente. Em janelas (pelo menos com MS Visual C ++), você pode passar um sinalizador de vinculador com o tamanho do segmento de pilha. Estouros de pilha também pode ser produzido ao alocar em tempo de compilação algum grande array:

char test[1000000];

Heap é uma história diferente. Quando um processo é iniciado tamanho da pilha é algum valor padrão e podem variar forma OS para OS ou configuração que está sendo usada em que o OS (por exemplo, no Windows é 2MB por padrão, tanto quanto eu me lembro). Além disso, se precisar de mais montão, para alocar mais espaço para variáveis ??etc. ele irá crescer. Se o programa faz memória da pilha não é livre é executado fora dele (ou espaço de pilha). Existem estruturas de dados diferentes para a implementação pilha alguns deles são derivados de árvores binárias, alguns não são, por exemplo, Fibonacci Heap (forrest de árvores). Você pode ler alguns artigos etc. sobre como escrever um alocador de memória. Estas estruturas de dados deve ser otimizado para encontrar o nó de pilha quando um alocados necessidades do pedaço para ser de-alocado, ou anexar (encontrar um pedaço livre) quando um novo espaço de pilha é necessária.

Cada processo em um 32 bit OS tem 4GB de espaço de endereço virtual. Como você pode imaginar, não pode haver tanta RAM, onde todos os processos com seus 4GBs de ajuste espaço de endereço virtual. memória OS está organizado em páginas, que são trocados para HD quando não for mais necessário ou expirado. Este é o lugar onde paginação vem para jogar. Tudo é mapeado para páginas: um processo com a pilha ou a pilha crescente. Devido à estrutura de pilha que cresce de forma dinâmica, ele pode ser colocado em várias páginas. É por isso que o acesso pilha pode ser muito caro, porque, se a página não está na memória uma falha de página acontece e OS tem que carregar uma página a partir do disco (e que pode ser por magnitude mais lenta). Pilha quadro do fio que está sendo executado está em cache do processador, que é muito mais rápido como RAM.

Diferentes tipos de pilha são possíveis, pode haver montes que são muito rápidos para pequenos objetos ou montes que são muito eficientes em ambientes multi-threaded. Alexandrescu descreve em "Projeto ++ Modern C" como desenvolver pequena alocador de objeto e uma pilha que administra pequenos objetos. Esta implementação está disponível na biblioteca de sua Loki C ++. Alguns sistemas embarcados oferecem regiões de memória fisicamente diferentes, onde diferentes tipos de pilha podem ser implementadas ontop. Para escrever um próprio alocador (gerenciador de heap etc.) é um trabalho duro, se você quiser bater um compilador.

Saudações,
Ovanes

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top