Devolver la memoria asignada dinámicamente al sistema operativo sin terminar el programa

Estoy trabajando en un programa en el que estoy usando una cantidad de memoria grande pero limitada. La memoria se asigna y se libera en tiempo de ejecución en diferentes subprocesos. Sin embargo, noté que el uso de memoria del programa no permanecería dentro de los límites especificados. Aumentaría con el paso del tiempo. Escribí el siguiente programa de muestra para verificar si la memoria se está volviendo a liberar al sistema operativo. La mitad de la memoria asignada se liberó para verificar si el uso de la memoria se redujo.

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);
}

Después de ejecutar el programa, parecía que el sistema operativo no reclamaría las páginas liberadas. El uso de memoria sigue siendo el mismo que se ve en el comando "superior" en Linux, después de la asignación y después de la liberación. Simplemente marca las páginas como gratuitas para su reutilización por el mismo programa. En mi programa, malloc y free se ejecutan en diferentes hilos. Esto plantea un problema de administración de memoria cuando se llama a malloc con mucha más frecuencia que gratis y el segmento de datos de proceso crece mucho, lo que hace que el sistema operativo intercambie páginas en el disco. Esto hace que el programa y el sistema operativo sean lentos y no respondan. ¿Hay alguna forma de que el sistema operativo recupere la memoria liberada?

Respuestas a la pregunta(2)

Su respuesta a la pregunta