Bonjour, je me présente Romain Calascibetta. Je suis actuellement dans un projet qui n'est pas critique mais sur lequel je voudrais avoir une gestion de la mémoire sans faille. En effet, j'ai déjà fait certaines optimisations qui font que j'ai divisé par 2 la mémoire que j'ai alloué. Cependant, j'ai encore des éléments névralgiques à mon programme qui sont alloués dynamiquement.

Je me dis alors, et si le malloc foire ? La politique utilisé jusqu'à présent était de dire: si le malloc foire, on signale l'erreur et on fait comme-ci l'utilisateur n'aurait pas ajouter cette élément. Bien entendu, on peut pas ignorer tout ce que rentre l'utilisateur.

J'opte donc pour la mise en place d'un GC Stop & Copy où l'espace se situera sur la Stack (entant que global) et rulz ... Mais j'ai certaines questions par rapport à ce GC mais plus généralement, je vais vous poser sur la table mes problèmes de mémoire.

Grosso-modo, J'ai 2 types de données que j'alloue (3 en réalité mais la troisième n'est pas si grave). C'est un arbre n-aires ainsi qu'une liste doublement chaînée circulaire - le troisième élément est une chaîne de caractère. Ces deux éléments sont indispensable et requiert par leurs structures obligatoirement une allocation dynamique. L'idée est donc de, au-lieu d'utiliser directement la mémoire vive, faire une abstraction de la mémoire à l'aide d'un GC pour que le programme soit un peu près indépendant de tout système.

J'ai bien compris le système du Stop & Copy. Une zone coupé en 2 où l'on mets nos données dans l'une jusqu'à qu'elle soit pleine et ensuite, on « flip » vers l'autre en ne copiant que ce qui est « en vie ». Cependant, comment savoir si une donnée est en vie ou pas ? Dans les différents PDFs que j'ai, on me parle de racine qui serait un arbre contenant les pointeurs vers les données. Ma question est véritablement là. Cette racine, elle est où dans la mémoire (dans le GC, dans le heap ?), comment est-elle (la structure de l'arbre) ? Bref, des questions déterminantes pour le projet. Le problème c'est que je vois comment fonctionne de façon général le GC mais j'arrive pas à l'implémenter en C.

Sinon, la solution du GC est celle que j'ai trouvé mais si vous avez une autre solution plus prometteuse, je suis preneur ! Il s'agit surtout d'être près pour toutes les situations. De plus, j'ai essayé de limité la mémoire de mon programme avec rlimit mais cela ne marche pas - enfin ça fonctionne quand je lancer valgrind ./mon_programme ... Et puis la solution ulimit (en ligne de commande) n'est pas super viable. Faut-il mettre en place la limite de mémoire virtuelle et forker le programme ?

Merci d'avance.