AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 411408
Accepted
Muno
Muno
Asked: 2017-12-18 06:56:08 +0800 CST2017-12-18 06:56:08 +0800 CST 2017-12-18 06:56:08 +0800 CST

Quando o heap é usado para alocação dinâmica de memória?

  • 772

Cada postagem sobre alocação de memória parece explicar como mmapé usado ou como sbrkfoi 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 xpara, digamos, x-n) ocorre como resultado de uma chamada para sbrk. Neste modelo, a memória é alocada nos nbytes (assumindo que cada endereço está em correspondência com um byte) que sbrkdiminui 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, mallocusa internamente mmappara 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?

c memory
  • 2 2 respostas
  • 1653 Views

2 respostas

  • Voted
  1. Best Answer
    Johan Myréen
    2017-12-18T07:30:41+08:002017-12-18T07:30:41+08:00

    mmape sbrksão as chamadas de sistema que o kernel fornece para alocar espaço de endereço para processos. Essas chamadas alteram o mapeamento de endereços virtuais para quadros de página físicos. Endereçar a memória fora dos limites de endereço desses mapeamentos é estritamente proibido e resulta em uma falha de segmentação. Esta é a interface de baixo nível que o kernel fornece a um processo, e a área de memória que termina com o brkendereço é comumente chamada de heap.

    O kernel não sabe nada sobre mallocou free, essas são funções de biblioteca em libc. Libc mantém estruturas de dados e registra quais áreas de memória estão livres do ponto de vista da alocação de memória, por exemplo como o arquivo . Uma chamada para mallocnão resulta necessariamente em uma chamada para sbrkou mmap(dependendo de como Libc implementa a alocação dinâmica de memória) para expandir os mapeamentos, se uma chamada para mallocpuder ser atendida reutilizando áreas de memória previamente liberadas.

    • 2
  2. Jander
    2017-12-23T13:21:31+08:002017-12-23T13:21:31+08:00

    "A pilha" é uma ideia de alto nível, não uma implementação de baixo nível. Em C, o heap é qualquer pool de memória malloc()usado para fornecer alocações.

    Aqui está uma implementação simples e divertida do alocador de memória:

    static char *heap[1000000];
    int top = 0;
    
    void *malloc(int size) {
        void *ret = &heap[top];
        top += size;
        return ret;
    }
    
    void free(void *ptr) {
        /* Eh; freeing is too hard */
        return;
    }
    

    Este é um alocador terrível, mas para o tipo certo de programa e se seu sistema e compilador perdoam coisas como alinhamento de memória , isso meio que funciona. Seu heap é o heap[]array e ele o constrói em tempo de compilação usando uma declaração de array, em vez de montar um com sbrk()ou mmap().

    Um alocador "real" funciona da mesma maneira. Quando malloc()é chamado, ele pega uma pequena parte de seu pool de memória (seu heap) e o reserva para essa alocação. Há duas diferenças importantes:

    • O alocador real sabe como fazer free()uma alocação para poder usá-la novamente mais tarde.
    • O alocador real pode aumentar o tamanho de seu heap, solicitando ao sistema operacional mais memória (usando sbrk()ou mmap()) quando todos os blocos existentes estiverem cheios.
    • 0

relate perguntas

  • Operação de limpeza de RAM sem reinicialização

  • Alto uso de memória de "git status -z -u"?

  • Otimização de programas baseados em OpenCV sistema operacional linux incorporado [fechado]

  • Programa de monitoramento de recursos de memória

  • Um processo pode alocar memória cache de forma que o kernel possa aproveitá-la quando necessário?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve