usar free() em um bloco sempre elimina os mapeamentos entre sua memória virtual e sua memória física?

usar free() em um bloco sempre elimina os mapeamentos entre sua memória virtual e sua memória física?

Digamos que queremos alocar um bloco do heap usando malloc. Ao alocar um tamanho grande de memória, mallocchama mmapinternamente e para uma alocação de tamanho pequeno, mallocchama brkinternamente.

Observe que o heap é contínuo quando usado sbrk()oubrk()

Digamos que minha alocação seja de tamanho relativamente médio e mallocligue brkinternamente.

digamos que eu liguemalloc(small); malloc(medium); free(medium)

de acordo com este artigoA história do confuso conjunto de maneiras de baixo nível para alocar memória do Unix

Se você free() fizer as coisas certas para criar um bloco de espaço não utilizado no topo do intervalo, malloc() e companhia poderão eventualmente chamar brk()ou sbrk()reduzir o intervalo do programa e devolver a memória ao sistema operacional.

como o bloco médio livre é o último (o bloco pequeno alocado é o penúltimo), a memória será devolvida ao sistema operacional.

Abaixo estão minhas perguntas:

  1. Meu entendimento sobre a afirmação "a memória será devolvida ao sistema operacional" é: os mapeamentos do bloco livre entre a memória virtual e a memória física são eliminados, outros processos podem usar a memória física que foi originalmente ocupada por este bloco livre. Meu entendimento está correto?

  2. desta vez eu chamo. malloc(medium); malloc(small); free(medium) Como ainda há um bloco alocado no final, o mapeamento do bloco livre entre a memória virtual e a memória física ainda existe? outros processos podem usar a memória física deste bloco livre?

Responder1

  1. Existem outros mecanismos pelos quais a memória física pode ser reutilizada para outros fins, neste caso a troca em particular - se a pressão da memória for alta o suficiente, a memória física de um processo pode ser trocada para abrir espaço para outra coisa.

    Hoje em dia, o principal benefício de devolver memória ao sistema operacional é que o sistema operacional entãosabeque a memória não será usada novamente e, portanto, poderá descartar a memória física correspondente sem qualquer cerimônia adicional. (Verminha resposta à pergunta SO relacionadapara detalhes.)

  2. Os mapeamentos entre a memória virtual e a memória física são um tanto fluidos; veja o ponto acima sobre swap. No seu cenário, o espaço de endereço virtual alocado para o processo não pode mudar, porque a interrupção do programa não pode ser reduzida e o kernel deve assumir que qualquer memória física mapeada para ele é “preciosa” e contém dados importantes. Mas isso não significa que o kernel não possa redirecionar a memória física; significa apenas que deve garantir, ao fazê-lo, que os dados ali armazenados não sejam perdidos.

informação relacionada