Je voudrais vérifier si la mémoire de mon programme écrit en C,
compilé sous linux, et bien libérée.
J'ai essayé avec la command 'top' qui donne la taille en mémoire
VIRT, RES et SHR. Au fur à à mesure que des dossiers sont ouverts,
la taille de VIRT et RES augmente, mais au fur et à mesure que les
dossiers sont fermés, la taille de RES reste à la même valeur et ne
revient pas à la taille initiale.
Ca fait la même chose avec l'éditeur 'vim', dont je suppose qu'il
fonctionne correctement, et ou la taille augmente au fur et à mesure
de l'ouverture de fichiers, mais reste constante au fur et mesure de la
fermeture des fichiers.
Aussi, je me demande si cette méthode est valable,
sinon existe-il
d'autres méthodes pour vérifier la libération de la mémoire?
Je voudrais vérifier si la mémoire de mon programme écrit en C,
compilé sous linux, et bien libérée.
J'ai essayé avec la command 'top' qui donne la taille en mémoire
VIRT, RES et SHR. Au fur à à mesure que des dossiers sont ouverts,
la taille de VIRT et RES augmente, mais au fur et à mesure que les
dossiers sont fermés, la taille de RES reste à la même valeur et ne
revient pas à la taille initiale.
Ca fait la même chose avec l'éditeur 'vim', dont je suppose qu'il
fonctionne correctement, et ou la taille augmente au fur et à mesure
de l'ouverture de fichiers, mais reste constante au fur et mesure de la
fermeture des fichiers.
Aussi, je me demande si cette méthode est valable,
sinon existe-il
d'autres méthodes pour vérifier la libération de la mémoire?
Je voudrais vérifier si la mémoire de mon programme écrit en C,
compilé sous linux, et bien libérée.
J'ai essayé avec la command 'top' qui donne la taille en mémoire
VIRT, RES et SHR. Au fur à à mesure que des dossiers sont ouverts,
la taille de VIRT et RES augmente, mais au fur et à mesure que les
dossiers sont fermés, la taille de RES reste à la même valeur et ne
revient pas à la taille initiale.
Ca fait la même chose avec l'éditeur 'vim', dont je suppose qu'il
fonctionne correctement, et ou la taille augmente au fur et à mesure
de l'ouverture de fichiers, mais reste constante au fur et mesure de la
fermeture des fichiers.
Aussi, je me demande si cette méthode est valable,
sinon existe-il
d'autres méthodes pour vérifier la libération de la mémoire?
Je voudrais vérifier si la mémoire de mon programme écrit en C,
compilé sous linux, et bien libérée.
J'ai essayé avec la command 'top' qui donne la taille en mémoire
VIRT, RES et SHR. Au fur à à mesure que des dossiers sont ouverts,
la taille de VIRT et RES augmente, mais au fur et à mesure que les
dossiers sont fermés, la taille de RES reste à la même valeur et ne
revient pas à la taille initiale.
Ca fait la même chose avec l'éditeur 'vim', dont je suppose qu'il
fonctionne correctement, et ou la taille augmente au fur et à mesure
de l'ouverture de fichiers, mais reste constante au fur et mesure de la
fermeture des fichiers.
Aussi, je me demande si cette méthode est valable, sinon existe-il
d'autres méthodes pour vérifier la libération de la mémoire?
Je voudrais vérifier si la mémoire de mon programme écrit en C,
compilé sous linux, et bien libérée.
J'ai essayé avec la command 'top' qui donne la taille en mémoire
VIRT, RES et SHR. Au fur à à mesure que des dossiers sont ouverts,
la taille de VIRT et RES augmente, mais au fur et à mesure que les
dossiers sont fermés, la taille de RES reste à la même valeur et ne
revient pas à la taille initiale.
Ca fait la même chose avec l'éditeur 'vim', dont je suppose qu'il
fonctionne correctement, et ou la taille augmente au fur et à mesure
de l'ouverture de fichiers, mais reste constante au fur et mesure de la
fermeture des fichiers.
Aussi, je me demande si cette méthode est valable, sinon existe-il
d'autres méthodes pour vérifier la libération de la mémoire?
Je voudrais vérifier si la mémoire de mon programme écrit en C,
compilé sous linux, et bien libérée.
J'ai essayé avec la command 'top' qui donne la taille en mémoire
VIRT, RES et SHR. Au fur à à mesure que des dossiers sont ouverts,
la taille de VIRT et RES augmente, mais au fur et à mesure que les
dossiers sont fermés, la taille de RES reste à la même valeur et ne
revient pas à la taille initiale.
Ca fait la même chose avec l'éditeur 'vim', dont je suppose qu'il
fonctionne correctement, et ou la taille augmente au fur et à mesure
de l'ouverture de fichiers, mais reste constante au fur et mesure de la
fermeture des fichiers.
Aussi, je me demande si cette méthode est valable, sinon existe-il
d'autres méthodes pour vérifier la libération de la mémoire?
Tout dipend ce que tu entends par "libiration de la mimoire". Cf par
exemple le manuel de la glibc:
Occasionally, `free' can actually return memory to the operating
system and make the process smaller. Usually, all it can do is allow
a later call to `malloc' to reuse the space. In the meantime, the
space remains in your program as part of a free-list used internally
by `malloc'.
Tout dipend ce que tu entends par "libiration de la mimoire". Cf par
exemple le manuel de la glibc:
Occasionally, `free' can actually return memory to the operating
system and make the process smaller. Usually, all it can do is allow
a later call to `malloc' to reuse the space. In the meantime, the
space remains in your program as part of a free-list used internally
by `malloc'.
Tout dipend ce que tu entends par "libiration de la mimoire". Cf par
exemple le manuel de la glibc:
Occasionally, `free' can actually return memory to the operating
system and make the process smaller. Usually, all it can do is allow
a later call to `malloc' to reuse the space. In the meantime, the
space remains in your program as part of a free-list used internally
by `malloc'.
a) Ou on désalloue la mémoire allouée sans en avoir alloué
d'autre entre temps, auquel cas on peut faire redescendre la plage
allouée (mais ceci peut être empêché parce qu'on a appelé une routine
que le loader charge..)
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
En conclusion, si tu as de grands tableaux à réallouer au cours du
temps, cette solution (realloc) est à éviter car elle fait grossir en
permanence la mémoire.
Par contre, une liste chaînée croit ou diminue
par UN élément, et donc (voir le trou généré ci-dessus) cet élément
peut souvent être alloué sans changer (ou peu) la mémoire globale...
Ce qui veut dire que les trous sont réutilisables pour des structures
de taille <= au trou..
a) Ou on désalloue la mémoire allouée sans en avoir alloué
d'autre entre temps, auquel cas on peut faire redescendre la plage
allouée (mais ceci peut être empêché parce qu'on a appelé une routine
que le loader charge..)
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
En conclusion, si tu as de grands tableaux à réallouer au cours du
temps, cette solution (realloc) est à éviter car elle fait grossir en
permanence la mémoire.
Par contre, une liste chaînée croit ou diminue
par UN élément, et donc (voir le trou généré ci-dessus) cet élément
peut souvent être alloué sans changer (ou peu) la mémoire globale...
Ce qui veut dire que les trous sont réutilisables pour des structures
de taille <= au trou..
a) Ou on désalloue la mémoire allouée sans en avoir alloué
d'autre entre temps, auquel cas on peut faire redescendre la plage
allouée (mais ceci peut être empêché parce qu'on a appelé une routine
que le loader charge..)
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
En conclusion, si tu as de grands tableaux à réallouer au cours du
temps, cette solution (realloc) est à éviter car elle fait grossir en
permanence la mémoire.
Par contre, une liste chaînée croit ou diminue
par UN élément, et donc (voir le trou généré ci-dessus) cet élément
peut souvent être alloué sans changer (ou peu) la mémoire globale...
Ce qui veut dire que les trous sont réutilisables pour des structures
de taille <= au trou..
Par ailleurs, je ne comprend pas bien à quel type de « routine du
chargeur » tu fais allusion.
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
Et encore, voire au contraire.
Si on utilise des bibliothèques dynamiques, et particulièrement si
malloc ou son équivalent est dans une bibliothèque potentiellement
différente de celle des clients, l'algorithme va utiliser une
sécurité plus grande pour éviter de « perdre » un espace d'adressage
qu'il a réservé antérieurement, donc je m'imagine qu'il y a encore
moins de chances qu'il « rende » au système un espace d'adressage
virtuel suite à une désallocation.
Et de toute manière, tous les algorithmes de malloc() non bogués
savent fusionner deux ou trois trous adjacents, et allouer si
nécessaire l'espace pour une structure de taille supérieure à chacun
des trous mais inférieure à leur somme.
Par ailleurs, je ne comprend pas bien à quel type de « routine du
chargeur » tu fais allusion.
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
Et encore, voire au contraire.
Si on utilise des bibliothèques dynamiques, et particulièrement si
malloc ou son équivalent est dans une bibliothèque potentiellement
différente de celle des clients, l'algorithme va utiliser une
sécurité plus grande pour éviter de « perdre » un espace d'adressage
qu'il a réservé antérieurement, donc je m'imagine qu'il y a encore
moins de chances qu'il « rende » au système un espace d'adressage
virtuel suite à une désallocation.
Et de toute manière, tous les algorithmes de malloc() non bogués
savent fusionner deux ou trois trous adjacents, et allouer si
nécessaire l'espace pour une structure de taille supérieure à chacun
des trous mais inférieure à leur somme.
Par ailleurs, je ne comprend pas bien à quel type de « routine du
chargeur » tu fais allusion.
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
Et encore, voire au contraire.
Si on utilise des bibliothèques dynamiques, et particulièrement si
malloc ou son équivalent est dans une bibliothèque potentiellement
différente de celle des clients, l'algorithme va utiliser une
sécurité plus grande pour éviter de « perdre » un espace d'adressage
qu'il a réservé antérieurement, donc je m'imagine qu'il y a encore
moins de chances qu'il « rende » au système un espace d'adressage
virtuel suite à une désallocation.
Et de toute manière, tous les algorithmes de malloc() non bogués
savent fusionner deux ou trois trous adjacents, et allouer si
nécessaire l'espace pour une structure de taille supérieure à chacun
des trous mais inférieure à leur somme.
Pas évident du tout.. Regarde X et la toolkit. Le fait d'appeler
XtFree marche pafaitement, car Xt contrôle parfaitement son espace..
Ainsi avec xemacs chaque fois que tu charges un fichier la mémoire
croît , puis tu le décharges et la mémoire diminue d'autant..
Et de toute manière, tous les algorithmes de malloc() non bogués
savent fusionner deux ou trois trous adjacents, et allouer si
nécessaire l'espace pour une structure de taille supérieure à chacun
des trous mais inférieure à leur somme.
Absolument.. Mais je citais juste un point pour mieux comprendre :-)
Et d'ailleurs si ils sont adjacents oui, si ils ne le sont pas ça se
complique fortement...
Pas évident du tout.. Regarde X et la toolkit. Le fait d'appeler
XtFree marche pafaitement, car Xt contrôle parfaitement son espace..
Ainsi avec xemacs chaque fois que tu charges un fichier la mémoire
croît , puis tu le décharges et la mémoire diminue d'autant..
Et de toute manière, tous les algorithmes de malloc() non bogués
savent fusionner deux ou trois trous adjacents, et allouer si
nécessaire l'espace pour une structure de taille supérieure à chacun
des trous mais inférieure à leur somme.
Absolument.. Mais je citais juste un point pour mieux comprendre :-)
Et d'ailleurs si ils sont adjacents oui, si ils ne le sont pas ça se
complique fortement...
Pas évident du tout.. Regarde X et la toolkit. Le fait d'appeler
XtFree marche pafaitement, car Xt contrôle parfaitement son espace..
Ainsi avec xemacs chaque fois que tu charges un fichier la mémoire
croît , puis tu le décharges et la mémoire diminue d'autant..
Et de toute manière, tous les algorithmes de malloc() non bogués
savent fusionner deux ou trois trous adjacents, et allouer si
nécessaire l'espace pour une structure de taille supérieure à chacun
des trous mais inférieure à leur somme.
Absolument.. Mais je citais juste un point pour mieux comprendre :-)
Et d'ailleurs si ils sont adjacents oui, si ils ne le sont pas ça se
complique fortement...
Antoine Leca wrote:Par ailleurs, je ne comprend pas bien à quel type de « routine du
chargeur » tu fais allusion.
Pour les très gros programmes, l'éxecutable n'est pas forcément chargé
en mémoire dans son entier... Si une routine figure dans la partie non
chargée, et qu'on vient à l'appeler, le loader va charger un tronçon
du binaire la contenant..
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
Et encore, voire au contraire.
Si on utilise des bibliothèques dynamiques, et particulièrement si
malloc ou son équivalent est dans une bibliothèque potentiellement
différente de celle des clients, l'algorithme va utiliser une
sécurité plus grande pour éviter de « perdre » un espace d'adressage
qu'il a réservé antérieurement, donc je m'imagine qu'il y a encore
moins de chances qu'il « rende » au système un espace d'adressage
virtuel suite à une désallocation.
Pas évident du tout.. Regarde X et la toolkit.
Le fait d'appeler
XtFree marche pafaitement, car Xt contrôle parfaitement son espace..
Ainsi avec xemacs chaque fois que tu charges un fichier la mémoire
croît , puis tu le décharges et la mémoire diminue d'autant..
Antoine Leca wrote:
Par ailleurs, je ne comprend pas bien à quel type de « routine du
chargeur » tu fais allusion.
Pour les très gros programmes, l'éxecutable n'est pas forcément chargé
en mémoire dans son entier... Si une routine figure dans la partie non
chargée, et qu'on vient à l'appeler, le loader va charger un tronçon
du binaire la contenant..
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
Et encore, voire au contraire.
Si on utilise des bibliothèques dynamiques, et particulièrement si
malloc ou son équivalent est dans une bibliothèque potentiellement
différente de celle des clients, l'algorithme va utiliser une
sécurité plus grande pour éviter de « perdre » un espace d'adressage
qu'il a réservé antérieurement, donc je m'imagine qu'il y a encore
moins de chances qu'il « rende » au système un espace d'adressage
virtuel suite à une désallocation.
Pas évident du tout.. Regarde X et la toolkit.
Le fait d'appeler
XtFree marche pafaitement, car Xt contrôle parfaitement son espace..
Ainsi avec xemacs chaque fois que tu charges un fichier la mémoire
croît , puis tu le décharges et la mémoire diminue d'autant..
Antoine Leca wrote:Par ailleurs, je ne comprend pas bien à quel type de « routine du
chargeur » tu fais allusion.
Pour les très gros programmes, l'éxecutable n'est pas forcément chargé
en mémoire dans son entier... Si une routine figure dans la partie non
chargée, et qu'on vient à l'appeler, le loader va charger un tronçon
du binaire la contenant..
b) Soit on a alloué de la mémoire entre temps (ou appelé une
routine (voir ci-dessus)). Dans ce cas il est quasi impossible de
redescendre (sauf (éventuellement) si on a fait appel à des
librairies dynamiques).
Et encore, voire au contraire.
Si on utilise des bibliothèques dynamiques, et particulièrement si
malloc ou son équivalent est dans une bibliothèque potentiellement
différente de celle des clients, l'algorithme va utiliser une
sécurité plus grande pour éviter de « perdre » un espace d'adressage
qu'il a réservé antérieurement, donc je m'imagine qu'il y a encore
moins de chances qu'il « rende » au système un espace d'adressage
virtuel suite à une désallocation.
Pas évident du tout.. Regarde X et la toolkit.
Le fait d'appeler
XtFree marche pafaitement, car Xt contrôle parfaitement son espace..
Ainsi avec xemacs chaque fois que tu charges un fichier la mémoire
croît , puis tu le décharges et la mémoire diminue d'autant..
Mais depuis
les années 1980 on dispose de plateformes matérielles (VAX, 80286,
etc.) ou logicielles (Windows 1.0, peut-être OS/370 aussi)
Mais depuis
les années 1980 on dispose de plateformes matérielles (VAX, 80286,
etc.) ou logicielles (Windows 1.0, peut-être OS/370 aussi)
Mais depuis
les années 1980 on dispose de plateformes matérielles (VAX, 80286,
etc.) ou logicielles (Windows 1.0, peut-être OS/370 aussi)
Non, IBM/370 c'était avant, dans la fin des 70' [...]
Je suis effrayé à l'idée de ne savoir où mettre un FU2.
Non, IBM/370 c'était avant, dans la fin des 70' [...]
Je suis effrayé à l'idée de ne savoir où mettre un FU2.
Non, IBM/370 c'était avant, dans la fin des 70' [...]
Je suis effrayé à l'idée de ne savoir où mettre un FU2.
Antoine Leca wrote:Mais depuis
les années 1980 on dispose de plateformes matérielles (VAX, 80286,
etc.) ou logicielles (Windows 1.0, peut-être OS/370 aussi)
Non, IBM/370 c'était avant,
dans la fin des 70' avec OS/MVS
Antoine Leca wrote:
Mais depuis
les années 1980 on dispose de plateformes matérielles (VAX, 80286,
etc.) ou logicielles (Windows 1.0, peut-être OS/370 aussi)
Non, IBM/370 c'était avant,
dans la fin des 70' avec OS/MVS
Antoine Leca wrote:Mais depuis
les années 1980 on dispose de plateformes matérielles (VAX, 80286,
etc.) ou logicielles (Windows 1.0, peut-être OS/370 aussi)
Non, IBM/370 c'était avant,
dans la fin des 70' avec OS/MVS