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 bpl . Évalué à 4.
--
Benoit.
[^] # Re: cache ?
Posté par fabricius . Évalué à 2.
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 bpl . Évalué à 4.
[^] # Re: cache ?
Posté par Pascal Terjan (site web personnel) . Évalué à 7.
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 . Évalué à 4.
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 . É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 . Évalué à 3.
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 . Évalué à 4.
Merci a tous pour vos reponses !
# GC
Posté par Obsidian . Évalué à 6.
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.