Retourner aux forums || Retourner au forum Programmation.c

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

Posté par fabricius () le 17 juillet 2008
0
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<100;j++)
{
fwrite(i,sizeof(int),2097152,fic);
}
fclose(fic);
free(i);
}

--
Slackware, la distribution idéale pour les débutants qui veulent apprendre linux
> Lire le message (9 commentaires, moyenne: 4,2).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

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

cache ?

Posté par bpl () le 17/07/2008 à 13:51. (lien). É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 fabricius () le 17/07/2008 à 14:01. (lien). É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 ?

    --
    Slackware, la distribution idéale pour les débutants qui veulent apprendre linux
    • [^]Re: cache ?

      Posté par bpl () le 17/07/2008 à 14:17. (lien). É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 Pascal Terjan (Jabber id, page perso, ) le 17/07/2008 à 14:19. (lien). É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 Kobal (Jabber id, ) le 17/07/2008 à 14:21. (lien). É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 Bruno Muller (Jabber id, page perso, ) le 17/07/2008 à 14:21. (lien). É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 Obsidian () le 17/07/2008 à 14:22. (lien). É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 fabricius () le 17/07/2008 à 14:41. (lien). Évalué à 4.

        OK, je comprends mieux maintenant!

        Merci a tous pour vos reponses !

        --
        Slackware, la distribution idéale pour les débutants qui veulent apprendre linux

GC

Posté par Obsidian () le 17/07/2008 à 14:05. (lien). Évalué à 6.

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

Je sors.

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c