3 votes

L'utilisation de la mémoire ne diminue pas lors de l'appel à free

J'ai un serveur WebSocket utilisant le langage C qui s'exécute en arrière-plan sous Windows. Ce processus acceptera des requêtes contenant des images de grande taille (format base64).

Chaque fois qu'une requête est reçue, la mémoire est allouée à l'aide de malloc. Elle est libérée après l'exécution de la demande.

Mais lorsque je consulte le gestionnaire des tâches, l'utilisation de la mémoire ne diminue pas. De plus, lorsque j'envoie une autre demande, de la mémoire supplémentaire est allouée.

Ma question est la suivante : pourquoi le processus n'a-t-il pas libéré la mémoire allouée ou réutilisé la mémoire précédemment allouée ?

4voto

vasia Points 615

La mise en œuvre sous-jacente de free diffère d'une plateforme à l'autre, mais ce que vous observez est très probablement dû à la présence de paresseux l'allocation/désallocation de mémoire. Votre système d'exploitation (ou les routines de gestion de la mémoire) est conscient de la mémoire que vous venez de libérer, mais comme il est probable que votre programme demande à nouveau de la mémoire, il ne prend pas la peine de mettre cette mémoire à la disposition d'autres processus jusqu'à ce que d'autres processus en fassent la demande. Par conséquent, le gestionnaire de tâches montre que l'utilisation de la mémoire de votre programme ne diminue pas, malgré les appels à la fonction free.

Si votre programme libère de la mémoire et en demande ensuite davantage, les routines de gestion de la mémoire sous-jacentes ne doivent pas vous restituer la même mémoire que celle que vous avez libérée. La combinaison de blocs libres est appelée coalescence Il s'agit d'une opération coûteuse, qui sera donc reportée au dernier moment, voire pas du tout si possible.

Pour le prouver, vous pouvez lancer un autre programme et lui demander de solliciter une grande quantité de mémoire. Si votre programme initial a correctement libéré la mémoire, son utilisation de la mémoire diminuera dès que le nouveau programme demandera de la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X