A implementação subjacente de malloc

 

 Olhada nesta foto, 32-bit endereço do sistema espaço 4g, linux 0-3G está em modo de usuário, o kernel-mode 3-4G.

Existem várias seções no modo de usuário (note que o endereço de memória de cima para baixo, o alto endereço para baixo endereço 0xc0000000-0x08048000)

(1) segmento de código: o armazenamento de uma imagem de programa binário

(2) um segmento de dados: armazenar variáveis ​​globais e as variáveis ​​estáticas locais inicializados

(3) Grupo de BSS: armazenamento não inicializado variáveis ​​globais e variáveis ​​estáticas locais

(4) Heap: espaço de pilha, há uma BRK local de nó marca de nota (), a partir do menor para endereços mais elevados de extensão

(5) mapeamento da memória: Mapeamento segmento de memória

(6) da pilha: o espaço de pilha, estendia-se desde superior a diminuir endereços

 

Linux mantém um ponteiro pausa que aponta para um espaço de endereço heap. A partir do endereço de pilha para o mapeamento de espaço de endereço entre a pausa é bom, o processo pode ser usado para acesso e da ruptura é espaço de endereço não mapeado, o acesso a este espaço, se o erro do programa. Nós alocar memória do desmembramento é realizada utilizando malloc.

Processo enfrentado espaço de endereço de memória virtual, somente pela página mapeada para memória física, pode realmente usar, devido às limitações de capacidade de armazenamento físico, todo o espaço de memória virtual pilha não pode tudo ser mapeada para memória física real.

 

Obtém um ponteiro para quebrar, ou seja, as aplicações de memória ponteiro iniciais.

de chamada do sistema posição sbrk (quantidade de deslocamento) BRK do ponteiro pode ser movido, e retorna a posição do ponteiro BRK, para atingir o objectivo da memória de aplicação.

chamada de sistema brk (void * addr), diretamente pode resolver set BRK para um retorno bem sucedido 0, 1 retorno mal sucedido. capacidade de memória heap rlimit processo ponteiro limite

Do ponto sistema operacional de vista, há duas maneiras de alocar a memória, um ponteiro é promover brk, aumentar a área efetiva da pilha para o espaço de memória de aplicativo, eo outro usando mmap, intermediário (pilha e pilha no espaço de endereço virtual de um processo, um lugar chamado área de mapeamento de arquivo) para encontrar uma memória virtual gratuito. Talvez tipo de memória virtual é alocada, somente quando você primeiro visitar o espaço de endereço virtual, o sistema operacional será alocar memória física.

 

brk malloc é o uso de alocação dinâmica de memória.

essência função malloc é a memória disponível blocos estão conectados em uma lista, ou seja, a lista livre. Ao chamar a função malloc, à procura de um grande bloco de memória para satisfazer o pedido do usuário é necessária, o bloco de memória é então dividido em dois, uma parte para a distribuição a um usuário (o tamanho do aplicativo), outra parte (se houver)

Voltar para a lista livre, se encontrado, vai chamar sbrk () ponteiro BRK para promover o espaço de memória do aplicativo.

algoritmo de busca bloco livre são:

(1) primeira adaptação: a primeira encontrar grande o suficiente, ele é atribuído. Vai ter um monte de fragmentação de memória

(2) um encaixe: O segundo tempo de encontrar, de distribuição, a menos produzido.

(3) Best Fit: busca exaustiva através de todo o bloco, encontrar a alocação de blocos diferença menor.

Ligue grátis, para conectar o usuário libera o bloco de memória para a lista livre, não se fundem, mesmo que o bloco de memória é adjacente a, ou o equivalente a dois blocos de memória, formando detritos falsa, após o lançamento de memória, você precisa executar a consolidação da memória, pequenos blocos livres adjacentes em bloco livre maior.

 

A estrutura geral do bloco de memória: Área + região de dados de meta, em que a área de meta-informação a meta para o bloco de dados de registo (tamanho dos dados de bloco, uma bandeira de marcha lenta, um ponteiro), a área de dados é a área de memória da distribuição real, a primeira área de dados endereço de byte é devolvido por endereço malloc.

 

lista implícita e listas duplamente ligadas:

Uma lista implicitamente ligada, um fato matriz, alocação malloc do espaço deve ter uma estrutura de dados que lhe permite distinguir entre as fronteiras, a distinção entre o espaço e o espaço alocado, a estrutura de dados compreendendo uma informação de cabeçalho e uma carga útil, a carga o primeiro endereço é o endereço retornado por malloc, possivelmente, preencher a cauda, a fim de manter o alinhamento de memória. Uma cabeça corresponde à estrutura de dados metadados, que contém as informações tamanho do bloco e se ou não o espaço livre, que pode lançar um endereço de memória do endereço de bloco seguinte e o endereço cabeça do tamanho do bloco, que é lista implicitamente ligada.
----------------
há uma maneira de conseguir isso é usar o livre lista é exibida, isso é realmente uma lista ligada. Foi adicionado antes e depois da inundação do ponteiro precursor carga útil antes, ele também é referido como uma lista duplamente ligada. Em uma forma de manter a lista livre é um primeiro LIFO (LIFO), o bloco recentemente libertado é colocada no início da lista. Outro método consiste em manter a ordem de endereços.

 

Se a função de memória insuficiente falhou ao alocar espaço de armazenamento, ele retorna um ponteiro NULL, testar se o valor de retorno é NULL.

 

Acho que você gosta

Origin www.cnblogs.com/EvansPudding/p/12602580.html
Recomendado
Clasificación