Retornando a memória alocada dinamicamente de volta ao SO sem encerrar o programa

Estou trabalhando em um programa em que estou usando uma quantidade grande, mas limitada de memória. A memória é alocada e liberada no tempo de execução em diferentes threads. No entanto, notei que o uso de memória do programa não permaneceria dentro dos limites especificados. Aumentaria com o passar do tempo. Eu escrevi o seguinte programa de amostra para verificar se a memória está sendo liberada de volta para o sistema operacional. Metade da memória alocada foi liberada para verificar se o uso da memória diminuiu.

int main()
{
    char *p[COUNT];

    for(int i = 0; i < COUNT; i++)
    {
        p[i] = new char[1048576];
        memset (p[i], 0, 1048576);
        printf("%p\n", p[i]);
    }

    printf("done allocating ... \n");

    sleep(10);

    printf("Freeing\n");
    for(int i; i < COUNT; i++)
    {
        delete[] p[i];
    }

    while(1)
        sleep(1);
}

Depois de executar o programa, parecia que o sistema operacional não recuperaria as páginas liberadas. O uso da memória permanece o mesmo do comando "top" no linux, após a alocação e a liberação. Simplesmente marca as páginas como livres para reutilização pelo mesmo programa. No meu programa, malloc e free estão sendo executados em diferentes threads. Isso coloca um problema de gerenciamento de memória quando o malloc é chamado com muito mais frequência do que livre e o segmento de dados do processo cresce muito, fazendo com que o sistema operacional troque de página em disco. Isso torna o programa e o SO lento e sem resposta. Existe alguma maneira de o sistema operacional recuperar a memória liberada?

questionAnswers(2)

yourAnswerToTheQuestion