No hay mucha diferencia entre Windows y Unix con respecto a eso.
En ambos, hay dos niveles de asignación. El sistema operativo asigna memoria al proceso en trozos grandes (una página o más; en x86, el tamaño de página suele ser 4096 bytes). Las bibliotecas de tiempo de ejecución, que se ejecutan dentro del proceso, subdividen este espacio y asignan partes de él a su código.
Para devolver la memoria al sistema operativo, primero toda la memoria asignada de uno de estos fragmentos grandes debe liberarse a la biblioteca de tiempo de ejecución. La biblioteca de tiempo de ejecución puede, si así lo desea, indicarle al sistema operativo que libere ese trozo de memoria.
En Linux, tiene brk
y mmap
. brk
controla el tamaño de una gran cantidad de memoria asignada a su proceso; puede expandirlo o reducirlo, pero solo en un extremo. malloc
expande tradicionalmente este trozo de memoria cuando necesita más memoria para asignar, y la reduce cuando es posible. Sin embargo, encogerse no es fácil; requiere una sola asignación inoportuna de un byte al final para que no se pueda reducir incluso si todo lo anterior a esa asignación se ha liberado. Esta es la fuente del meme "Unix no libera memoria".
Sin embargo, también hay mmap
anónimo. Anonymous mmap
solicita un trozo de memoria del sistema operativo, que puede colocarse en cualquier lugar del espacio de memoria de proceso. Este trozo se puede devolver fácilmente cuando ya no se necesita, incluso si hay asignaciones posteriores que aún no se han lanzado. malloc
usa también mmap
(particularmente para grandes asignaciones, donde un trozo completo de memoria puede devolverse fácilmente después de ser liberado).
Por supuesto, tanto en Windows como en Linux, si no le gusta el comportamiento del asignador de memoria (o asignadores) de las bibliotecas de tiempo de ejecución, puede usar el suyo, solicitando memoria del sistema operativo y subdividiéndola de la forma en que querer (o a veces pedir memoria de otro asignador, pero en bloques más grandes). Un uso interesante es tener un asignador para toda la memoria asociada con una tarea (por ejemplo, una solicitud del servidor web), que se descarta por completo al final de la tarea (sin necesidad de liberar todas las piezas individualmente); Otro uso interesante es un asignador para objetos de tamaño fijo (por ejemplo, objetos de cinco bytes), que evita la fragmentación de la memoria.
Los procesos que disminuyen en tamaño en Windows pueden ser otra cosa: Windows recorta el tamaño del conjunto residente cuando se minimiza una ventana, y probablemente estaba viendo ese valor en el administrador de tareas. Firefox, por ejemplo, tuvo que deshabilitar esa "característica" de Windows, que ralentizó demasiado. – CesarB