O gerenciamento de memória é um fenômeno fundamental do sistema operacional usado para manipular ou gerenciar a memória primária, a fim de controlar os direitos de acesso à memória no computador. O objetivo é impedir que qualquer processo acesse a memória que ainda não foi alocada para ele.
O sistema operacional aloca memória para cada processo dividido em segmentos. Stack e Heap são as duas maneiras pelas quais a memória é alocada no sistema operacional.
O segmento de pilha é usado para armazenar variáveis de função local criadas automaticamente, enquanto o segmento de pilha é usado para memória alocada dinamicamente.
Ambos são armazenados na RAM do computador e podem crescer e encolher durante a execução de um programa. Vamos discutir os dois em detalhes e compará-los para entender qual é o melhor.
O segmento de pilha é uma técnica de gerenciamento de memória usada para alocação de memória estática. É uma área especial na memória do computador que é usada para armazenar variáveis de função local. Quando uma função é chamada, a memória é alocada para todas as variáveis locais em algum lugar e você pode acessá-las conforme conhece seus locais. Os blocos de memória são liberados quando a função termina. A pilha é uma das maneiras de implementar esse processo com eficiência. Pense nisso como uma estrutura de dados básica, na qual os itens são organizados uns sobre os outros como uma pilha. Da mesma forma, variáveis locais podem ser acessadas pressionando e popping. Empurrar refere-se à adição de itens na pilha e popping significa recuperar itens da pilha. Os itens podem ser acessados a partir da pilha na ordem LIFO (last-in-first-out).
Heap refere-se a um grande conjunto de memória usado para alocação dinâmica de memória, o que significa que a memória permanece alocada até o término do programa ou a liberação da memória. A memória é alocada aleatoriamente para que não haja uma maneira fácil de acessar a memória. Diferentemente do segmento de pilha, os elementos estão sendo liberados na ordem inversa à medida que foram originalmente alocados. Em termos simples, a memória é alocada para os programas mediante solicitação e liberada quando não é mais necessária. Os elementos do heap são independentes, significando que podem ser acessados à medida que o programa é executado e liberado quando o programa termina. É como um pool de memória global usado para armazenar variáveis globais e muitas variáveis fazendo referência a ele.
Na arquitetura do computador, uma pilha é uma região especial da memória do computador explicitamente alocada para variáveis automáticas. Na programação, variável automática é uma variável local, o que significa que o escopo da variável é local para o bloco em que é declarada. A memória é alocada automaticamente para essas variáveis na entrada no bloco e a memória é liberada na saída. Heap, por outro lado, é a parte da memória do computador usada para alocações dinâmicas de memória, o que significa que blocos de memória são alocados e desalocados de maneira aleatória.
A pilha é usada para armazenar variáveis locais e o escopo definido na função. Em termos técnicos, a pilha suporta alocação de memória estática, que corresponde a variáveis estáticas locais e variáveis de escopo. A memória é alocada antes da execução do programa, geralmente no tempo de compilação e a estrutura de dados usada é chamada de pilha. O heap, por outro lado, é usado para alocação dinâmica de memória, o que significa que a memória é alocada manualmente no tempo de execução durante a execução de um programa. Os programas solicitam memória, geralmente para adicionar um nó à estrutura de dados e retornam se não for necessário.
Uma pilha é gerenciada e otimizada pela CPU e os dados são acessados em uma ordem LIFO (last-in-first-out). LIFO refere-se ao método de armazenamento de dados em pilhas de memória em que o bloco de memória mais recente é o primeiro a ser liberado e vice-versa. Isso facilita o gerenciamento de memória. Os elementos da pilha, pelo contrário, são independentes entre si e os dados podem ser acessados arbitrariamente, o que significa que um bloco de memória pode ser alocado e liberado a qualquer momento, independentemente de sua ordem. Diferentemente das pilhas, as pilhas não têm um padrão definido para alocação e desalocação de blocos de memória.
A memória é gerenciada automaticamente na pilha e as variáveis são alocadas e desalocadas automaticamente, o que significa que a pilha é reservada apenas para variáveis temporárias. As variáveis locais tornam-se ativas quando uma função é executada e quando termina, as variáveis ficam fora do escopo, o que significa que o escopo da variável é local para uma função e existe enquanto essa função é executada. Diferentemente da pilha, a memória é alocada à medida que o programa é executado na pilha, o que torna um pouco mais lento o acesso às variáveis armazenadas aqui. Como não há uma ordem específica na reserva de blocos, os blocos de memória podem ser alocados e liberados a qualquer momento.
Ambas são as formas mais comuns de alocação de memória e são armazenadas na RAM do computador para um gerenciamento eficiente da memória. No entanto, o acesso à memória em uma pilha é rápido, porque a memória é gerenciada automaticamente, enquanto no heap, a memória deve ser gerenciada manualmente, o que significa que você precisa alocar a memória livre quando os blocos não forem mais necessários. O Stack é obviamente mais rápido e fácil de usar, graças à sua flexibilidade, mas tem sua parte justa de prós e contras. Embora a pilha não tenha limite no tamanho da memória, é um pouco difícil de implementar. Heap é mais lento que uma pilha, mas sua implementação é mais simples.