Forum Programmation.c memoire pas libérée apres ecriture dans un fichier ?

Posté par  .
Étiquettes : aucune
0
17
juil.
2008
Bonjour,

Je trouve étrange le comportement suivant:
J'ai un programme C qui fait un malloc, ouvre un fichier, le remplit avec le contenu du buffer alloué par le malloc, puis le ferme. Le programme sort alors après avoir libéré la mémoire allouée et fermé le fichier.

Quand je le lance, je vois la mémoire utilisée augmenter (normal, il y a eu un malloc). Par contre quand le programme sort, la memoire ne descend pas (je peux le voir avec le moniteur système de KDE). Le seul moyen de la faire descendre est de supprimer le fichier créé.

Je ne comprend pas trop ce comportement. Soit le programme fait quelque chose de mauvais, soit c'est du a un comportement étrange de linux.

Bon, je colle le programme, mais ce n'est pas pour demander du debug, c'est pour comprendre comment marche mon OS...


#include

int main()
{
int *i,j;
FILE *fic;

i = (int *) malloc(sizeof(int) *2097152);

fic=fopen("/tmp/aaaaaa.bin","wb");
for (j=0;j
{
fwrite(i,sizeof(int),2097152,fic);
}
fclose(fic);
free(i);
}
  • # cache ?

    Posté par  . Évalué à 4.

    Je ne connais le moniteur systeme de KDE et donc je ne sais pas si il fait la différence entre memoire utilisée et cache, mais il y a des chances qu'en fait, le fichier reste effectivement en mémoire mais en cache (cache qui sera libéré si besoin).

    --
    Benoit.
    • [^] # Re: cache ?

      Posté par  . Évalué à 2.

      oui, effectivment, c'est la memoire cache qui reste pleine (elle apparait en vert sur le moniteur systeme de KDE.)

      Mais concretement, il y a moyen de virer soi meme ce cache ? Car si le fichier est ecrit et fermé, je n'ai pas besoin qu'il reste en memoire.

      Et je ne comprend pas pourquoi supprimer le fichier a partir du shell vide le cache memoire. De toute façon le fichier est fermé, on est sorti du programme, pourquoi garder une copie en memoire ?
      • [^] # Re: cache ?

        Posté par  . Évalué à 4.

        Grosso-modo, le noyau préfère "utiliser" la mémoire libre comme cache que la laisser inutilisé. Il libérera le cache si le besoin s'en fait sentir. effacé le fichier désactive ce cache et donc le libère.
      • [^] # Re: cache ?

        Posté par  (site web personnel) . Évalué à 7.

        Au cas ou un autre le relirait bientot, ca évite de devoir le relire du disque.
        Vu que tu as de la mémoire libre pourquoi ne pas l'utiliser ? Tu preferes avoir de la mémoire inutilisée que des bonnes perfs ?
        Si tu commences à ne plus avoir de mémoire le cache sera libéré.
      • [^] # Re: cache ?

        Posté par  . Évalué à 4.

        Pourquoi voudrait tu virer le cache? Le noyau conserve le cache au cas où il serait nécessaire de rouvrir le fichier. Si il est réouvert, on gagne en temps (plus besoin d'aller le chercher sur le disque dur). Si n'est pas réutilisé, on n'y perd rien. Le cache se place dans ta mémoire libre" et sera en partie libéré quand un besoin en mémoire se fera sentir.
        Tant qu'il y a de la place en mémoire, ne pas l'utiliser, c'est du gâchis.

        Et si tu supprimes ton fichier, il sera effacé du cache. En effet, il ne risque pas d'être réouvert si tu l'as supprimé.
      • [^] # Re: cache ?

        Posté par  . Évalué à 4.

        # free
        total used free shared buffers cached
        Mem: 1035684 1001956 33728 0 23228 470288
        ...
        # echo 3 > /proc/sys/vm/drop_caches
        # free
        total used free shared buffers cached
        Mem: 1035684 595652 440032 0 268 95896
        ...


        Et je ne comprend pas pourquoi supprimer le fichier a partir du shell vide le cache memoire.

        Parce que si le fichier n'existe plus sur le disque, il n'y a vraiment plus aucune raison d'en garder une copie en mémoire...

        De toute façon le fichier est fermé, on est sorti du programme, pourquoi garder une copie en memoire ?

        Parce que si un autre processus ouvre ce même fichier, il n'y aura pas besoin d'aller le relire sur le disque.

        Et puis de toutes façons, ca ne coute rien de garder plein de choses en cache... Il y a de la mémoire dispo, autant l'utiliser pour faire du cache. Si on a besoin de place, y a juste à la prendre et dire que le fichier en question n'est plus en cache...
      • [^] # Re: cache ?

        Posté par  . Évalué à 3.

        Parce que la mémoire, d'une manière générale, n'est jamais « vidée ». Elle conserve toujours le dernier état qu'on lui a donné. Si on voulait vraiment retirer le fichier de la RAM (pour des raisons de confidentialité, par exemple). Il faudrait aller explicitement écrire des zéros dedans.

        En bref, laisser le fichier en l'état en RAM est ce qui coûte le moins cher au système. Tant que cet espace n'est pas utilisé, autant garder une trace de ce qu'il y a dedans, ce sera toujours ça en moins à faire à la prochaine lecture du fichier.

        Par contre, lorsque plus personne ne référence ce fichier et qu'on le supprime, il n'y a plus moyen pour le système de rouvrir un descripteur vers son contenu. Donc, pas la peine de garder trace de données caduques dans la table du cache. Le segment de mémoire repasse donc de « disponible » à « inutilisé ».

        Si tu veux vider de force la table du cache, sur les noyaux Linux récents, c'est echo 1 > /proc/sys/vm/drop_cache mais ça ne sert à rien.
        • [^] # Re: cache ?

          Posté par  . Évalué à 4.

          OK, je comprends mieux maintenant!

          Merci a tous pour vos reponses !
  • # GC

    Posté par  . Évalué à 6.

    On t'a eu : quelqu'un a dû te refiler un compilateur Java ! :-)

    Je sors.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.